4.2 Ansible的安装步骤

Ansible目前的应用比较广泛,内网开发环境和AWS云平台上面都有其应用。这里将以内网开发环境来说明下,系统版本均为CentOS 6.4 x86_64,Python版本为2.6.6。

内网环境机器分配情况如下。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

192.168.1.207主机名:Ansiable.example.com ,作用:Ansible主控端。

192.168.1.205主机名:client1.example.com ,作用:Ansible被控端机器。

192.168.1.206主机名:client2.example.com ,作用:Ansible被控端机器。

Ansible的安装非常简单,安装步骤如下。

1)下载epel源,并通过其安装Ansible,命令如下:

cd /usr/local/src

wget http://ftp.linux.ncsu.edu/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm -ivh epel-release-6-8.noarch.rpm

2)只需要在主控端机器上安装即可,其他被控端机器无需任何操作,命令如下:

yum -y install ansible

3)安装成功以后,可以通过命令查看Ansible的当前版本,命令如下:

ansible --version

命令显示结果如下所示:

ansible 1.9.4

configured module search path = None

这里显示Ansible的当前版本为1.9.4。

这是一切都顺利的情况,另外一台机器,由于将Python版本升级至2.7.9,因此在运行Ansible时报错如下:

Traceback (most recent call last):

File "/usr/bin/ansible", line 36, in

from ansible.runner import Runner

ImportError: No module named ansible.runner

这是因为Ansible还是基于原先Python2.6.6版本安装的,所以执行Ansible时会报错,此时将/usr/bin/ansible文件中的第一行解释器#!/usr/bin/python改回原版本#!/usr/bin/python2.6即可。

4)将两台client机器添加进Ansible的webserver组。

首先我们注释掉/etc/ansible/hosts文件里的所有内容,直接在vim里执行如下操作即可:

%s@^@#@

然后添加下列内容:

192.168.1.205

192.168.1.206

[webserver]

192.168.1.205

192.168.1.206

5)定义主机与组规则(Inventory)

Ansible通过定义好的主机与组规则Inventory指定了Ansible起作用的主机列表,Ansible默认读取/etc/ansible/hosts文件。下面是Inventory文件的一个例子:

mail.example.com

[webservers]

foo.example.com

bar.example.com

[dbservers]

one.example.com

two.example.com

Three.example.com

如果是通过pip安装的Ansible,则没有默认的/etc/ansible/hosts文件,需要手动建立,笔者一般是建立在自己的工作目录下面,比如/home/yhc/ansible/hosts,然后执行ansible命令时通过-i参数指定安装目录,如下所示:

ansible -i /home/yhc/ansible/hosts bidder -m ping

其中,中括号内是组名称,一台主机可以属于多个组。一台属于多个组的主机会读取多个组的变量文件,这样可能会产生冲突,作为解决方案的优先级会在后面介绍。

有一个主机会被Ansible默认地自动添加到Inventory中,那就是localhost。Ansible认为localhost就代表本地主机,所以需要它的时候会直接在本机执行而不通过SSH连接。

如果SSH使用的不是SSH默认端口,可以在主机后面指定SSH端口,命令如下所示:

badwolf.example.com:5309

如果使用静态IP,希望在hosts文件中使用别名或通过通道连接,可以采用类似如下的方式:

jumper ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50

如果有很多主机名称类似,则没有必要一一列出,例如:

[webservers]

www[01:50].example.com

db-[a:f].example.com

其中数字开头的0可以省略,中括号是闭合的。

也可以指定每个主机的连接类型和用户名:

[targets]

localhost ansible_connection=local

other1.example.com ansible_connection=ssh ansible_ssh_user=mpdehaan

other2.example.com ansible_connection=ssh ansible_ssh_user=mdehaan

上面这些直接在Inventory文件中添加参数的方式并不是一个很好的选择,后面会介绍更好的方法,就是在单独的host_vars目录中定义参数。

另外,通过主机变量和组变量的方式可以让Inventory文件更加灵活。

·主机变量

主机可以指定变量,以便后面供playbook配置使用,例如下面定义了主机host1和host2上Apache的参数http_port及maxRequestsPerChild。

[atlanta]

host1 http_port=80 maxRequestsPerChild=808

host2 http_port=303 maxRequestsPerChild=909

·组变量

组变量的作用是覆盖组中的所有成员,通过定义一个新块,块名由组名+“:vars”组成,如下例所示:

[atlanta]

host1

host2

[atlanta:vars]

ntp_server=ntp.atlanta.example.com

proxy=proxy.atlanta.example.com

·组的组(也称为组嵌套)

组嵌套是通过定义一个新块,块名由组名+“:children”组成,如下例所示:

[atlanta]

host1

host2

[raleigh]

host2

host3

[southeast:children]

atlanta

raleigh

[usa:children]

southeast

northeast

southwest

Northwest

·分离主机和组变量

为了更好地规范定义的主机和组变量,Ansible支持将hosts文件定义的主机名与组变量单独分离出来,并采用YAML格式存放到指定的文件中。

假设Inventory文件的路径为/etc/ansible/hosts,其中有个主机名为foosbal,属于raleigh和webservers两个组,那么以下位置的YAML文件会对foosball主机有效:

/etc/ansible/group_vars/raleigh

/etc/ansible/group_vars/webservers

/etc/ansible/host_vars/foosball

例如,/etc/ansible/group_vars/raleigh文件可能看起来类似于下面这样:

---

ntp_server: acme.example.org

database_server: storage.example.org

Ansible 1.2及之后的版本中,group_vars和host_vars目录既可以在playbook目录下也可以在Inventory目录下,如果两者都有,playbook目录下的会覆盖Inventory目录下的 [1] 。

6)测试Ansible安装是否成功。

分别执行下面的两条命令:

ansible 192.168.1.205 -m ping -k

SSH password:

ansible 192.168.1.206 -m ping -k

SSH password:

由于Ansible主控端和被控端暂时未配置SSH证书信任关系,所以需要在执行Ansible命令时输入-k参数,此时需要提供客户端的root密码,最后结果显示如下:

192.168.1.205 | success >> {

"changed": false,

"ping": "pong"

}

192.168.1.206 | success >> {

"changed": false,

"ping": "pong"

}

如果出现以上结果,则表示Ansible已经成功安装,并且跟客户端机器的连接也是成功的。

[1] 参考文档:http://docs.ansible.com/ansible/index.htmln。