Ansible 通过读取默认的主机清单配置/etc/ansible/hosts,来同时连接到多个远程主机,来执行远程操作任务的,但是如果要修改默认路径可以通过修改主配置文件 ansible.cfg 的 hostfile 参数指定相应的路径。具体查看相应的路径为:
1
2
3
4
5
6
|
[root@Monitor ansible]
remote_port = 22
remote_user = root
private_key_file = ~/. ssh /id_rsa_web
host_key_checking = False
hostfile = /etc/ansible/conf/hosts
|
接下来会详细讲解主机和组,以及他们的正则表达式的匹配:
(一)主机和组(Hosts and Groups)
通过配置/etc/ansible/hosts这个文件来定义主机和组
(1)简单的主机和组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@Monitor ansible]
[webserver]
192.168.180.5
192.168.180.6
192.168.180.23
[dbserver]
192.168.180.2
[root@Monitor ansible]
192.168.180.23 | SUCCESS | rc=0 >>
15:00:30 up 45 days, 23:43, 4 users , load average: 0.00, 0.01, 0.05
192.168.180.5 | SUCCESS | rc=0 >>
15:01:10 up 45 days, 23:44, 2 users , load average: 0.00, 0.00, 0.00
192.168.180.6 | SUCCESS | rc=0 >>
15:01:27 up 45 days, 23:44, 2 users , load average: 2.00, 2.00, 2.00
|
注意的要点有:
a.中括号中的名字代表组名,可以根据自己的需求将庞大的主机分成具有标识的组,如上面分了两个组webservers和dbservers组;
b.主机(hosts)部分可以使用域名、主机名、IP地址表示;当然使用前两者时,也需要主机能反解析到相应的IP地址,一般此类配置中多使用IP地址;
(2)端口与别名。
SSH默认的端口是22(此时的ansible主机配置文件可以省略),但是如果某些主机的SSH运行在自定义的端口上,ansible使用Paramiko进行ssh连接时不会使用你SSH配置文件中列出的端口,但是如果修改ansible使用openssh进行ssh连接时将会使用:
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@localhost ~]
Port 10022
Port 22
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@Monitor ansible]
[webserver]
192.168.180.5:10022
192.168.180.6
192.168.180.23
[root@Monitor ansible]
192.168.180.23 | SUCCESS | rc=0 >>
16:12:33 up 46 days, 55 min, 4 users , load average: 0.00, 0.01, 0.05
192.168.180.5 | SUCCESS | rc=0 >>
16:14:58 up 22 min, 3 users , load average: 0.00, 0.00, 0.00
192.168.180.6 | SUCCESS | rc=0 >>
16:13:43 up 46 days, 56 min, 2 users , load average: 2.00, 2.00, 2.00
|
(3)指定主机范围
hosts官方有个列子是通过指定主机名的范围来进行多台主机的定义
1
2
3
4
5
|
[root@Monitor ansible]
[webservers]
www[01:50].yanruogu.com
[databases]
db-[a:f].yanruogu.com
|
上面指定了从web1到web50,webservers组共计50台主机;databases组有db-a到db-f共6台主机。
(4)使用主机变量
hosts主机经常使用到的变量为:
1
2
3
4
5
6
7
8
9
10
11
|
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
ansible_sudo_exec
ansible_ssh_private_key_file
ansible_shell_type
ansible_connection
ansible_python_interpreter
ansible_*_interpreter
|
上边的实例也可以如下配置直接使用用户名和密码和端口号进行连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@Monitor ansible]
[webserver]
192.168.180.5 ansible_ssh_port=10022 ansible_ssh_user=root ansible_ssh_pass= '123456'
192.168.180.6 ansible_ssh_user=root ansible_ssh_pass= '123456'
192.168.180.23 ansible_ssh_user=appuser ansible_ssh_pass= '123456'
[root@Monitor ansible]
192.168.180.5 | SUCCESS | rc=0 >>
16:54:09 up 1:01, 3 users , load average: 0.00, 0.00, 0.00
192.168.180.23 | SUCCESS | rc=0 >>
16:52:07 up 46 days, 1:34, 4 users , load average: 0.00, 0.01, 0.05
192.168.180.6 | SUCCESS | rc=0 >>
16:52:08 up 46 days, 1:34, 2 users , load average: 2.05, 2.01, 2.00
|
(5)定义组变量
变量也可以通过组名,然后应用到组内的所有成员。组变量的作用域是覆盖组所有成员,通过定义一个新块,块名由组名+":vars" 组成,定义格式如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
[web1]
Server6
Server5
[web1:vars]
ntp=192.168.180.23
nginx=192.168.180.5
[root@Monitor ansible]
Server5 | SUCCESS | rc=0 >>
10:26:01 up 23 min, 2 users , load average: 0.00, 0.00, 0.00
Server6 | SUCCESS | rc=0 >>
10:26:06 up 40 min, 2 users , load average: 0.00, 0.00, 0.00
|
####说明:上面的web1组中包含了两台主机Server5和Server6,通过对web1组指定了vars变量,相应的Server5和Server6主机相当于相应的指定了ntp和nginx变量的参数值。
(6)同时Ansible支持组嵌套组 ,通过定义一个新块,块名由组名+":children"组成,格式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[hangzhou]
host1
host2
[jiaxing]
host2
host3
[zhejiang:children]
hangzhou
jiaxing
[zhejiang:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2
[china:children]
zhejiang
henan
shandong
hebei
southeast
|
如上面的示例中,我指定了杭州组我有host1、hosts2;嘉兴组我有host3、host4主机;我又指定了一个组浙江组,同时包含杭州和嘉兴;同时为该组内的所有主机指定了四个vars变量。
分离主机与组特定数据
为了更好规范定义的主机与组变量,Ansible支持将/etc/ansible/hosts定义的主机名与组变量单独剥离出来存放到指定文件夹中.将采用YAML格式存放,存放位置规定: "/etc/ansible/group_vars/+组名" 和 "/etc/ansible/host_vars/+主机名" 分别存放指定组名或者主机名定义的变量。如下:
/etc/ansible/group_vars/dbservers
/etc/ansible/group_vars/webservers
定义的dbserver变量格式为:
[/etc/ansible/group_vars/dbservers]
---
ntp_server:acme.example.org
database_server:storage.example.org
(二)Patterns(主机与组正则匹配部分)
把Patterns 其实就是ansible中的规则去管理哪些主机,也可以理解为,要与哪台主机进行通信。
以下ansible的用法:
ansible <pattern_goes_here> -m <module_name> -a <arguments>
ansible <执行的客户机列表> -m <调用的模块> -a <执行的参数>
直接上一个示例:
ansible webservers -m service -a "name=httpd state=restarted"
这里是ansible对webservers 组内的主机来进行远程重启httpd服务 ,其中webservers 就是Pattern部分。而之所以上面说Pattern(模式)可以理解为正则,主要针对下面经常用到的用法而言的。
-
表示所有的主机可以使用all 或 *
-
通配符和逻辑或
利用通配符还可以指定一组具有规则特征的主机或主机名,冒号表示or---逻辑或
本文转自 lqbyz 51CTO博客,原文链接:http://blog.51cto.com/liqingbiao/1961480