预计阅读本页时间:-
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。