[root@Ansible ~]# mkdir /etc/ansible --创建ansible目录
[root@Ansible ~]# cp /usr/src/ansible-2.5.0/examples/hosts /etc/ansible/ --拷贝文件(已拷贝忽略就好了)
Ansible通过读取默认的主机清单配置/etc/ansible/hosts(我们前面已经拷贝)来同时连接到多个远程主机,来执行远程操作任务的。但是如果要修改默认路径可以通过修改主配置文件 ansible.cfg 的 hostfile 参数指定相应的路径。
具体查看相应的路径为:
[root@Ansible ~]# vim /etc/ansible/ansible.cfg --该配置文件后面会详细说明
#remote_port = 22
#remote_user = root
#private_key_file = /path/to/file
#host_key_checking = False
#hostfile = /etc/ansible/hosts
通过配置/etc/ansible/hosts这个文件来定义主机和组
[root@Ansible ~]# vim /etc/ansible/hosts
[web] #定义组名,可自定义
192.168.8.55 #定义主机IP
192.168.8.66 #新定义一台主机IP
组定义:
可以根据自己的需求将庞大的主机分成具有标识的组
主机定义:
可以使用域名、主机名、IP地址表示;当然使用前两者时,也需要主机能反解析相应的IP地址,一般此类配置中多使用IP地址
示例:
[root@Ansible ~]# ansible web -m command -a ‘uptime‘
192.168.8.66 | SUCCESS | rc=0 >>
15:54:44 up 13:52, 4 users, load average: 0.00, 0.01, 0.05
192.168.8.55 | SUCCESS | rc=0 >>
15:54:45 up 10:47, 4 users, load average: 0.24, 0.06, 0.06
ssh默认的端口是22(此时的Ansible主机配置文件可以省略),但是如果某些主机的ssh运行在自定义的端口上,Ansible使用Paramiko进行ssh连接时不会使用你ssh配置文件中列出的端口,但是如果修改ansible使用openssh进行ssh连接时将会使用:
在Client 192.168.8.66上ssh开启2个端口连接
[root@Client ~]# vim /etc/ssh/sshd_config
17 Port 10022
18 Port 22
[root@Client ~]# systemctl restart sshd --修改之后,重启sshd服务生效
在Ansible服务端的配置:
[root@Ansible ~]# vim /etc/ansible/hosts
[web]
192.168.199.123:10022
192.168.199.124
示例:
[root@Ansible ~]# ansible web -m command -a ‘uptime‘
192.168.8.66 | SUCCESS | rc=0 >>
16:17:28 up 14:14, 4 users, load average: 0.00, 0.02, 0.05
192.168.8.55 | SUCCESS | rc=0 >>
16:17:29 up 11:10, 4 users, load average: 0.01, 0.03, 0.05
hosts官方有个例子是通过指定主机名的范围来进行多台主机的定义
[root@Ansible ~]# vim /etc/ansible/hosts
[webservers]
node[01:50] .example.com
上面指定了从node01.com到node50. example.com,webservers组共计50台主机
hosts主机经常使用到的变量为:
ansible_ssh_host #用于指定被管理的主机的真实IP
ansible_ssh_port #用于指定连接到被管理主机的ssh端口号,默认是22
ansible_ssh_user #ssh连接时默认使用的用户名
ansible_ssh_pass #ssh连接时的密码
ansible_sudo_pass #使用sudo连接用户时的密码
ansible_sudo_exec #如果sudo命令不在默认路径,需要指定sudo命令路径
ansible_ssh_private_key_file #秘钥文件路径,秘钥文件如果不想使用ssh-agent管理时可以使用此选项
ansible_shell_type #目标系统的shell的类型,默认sh
ansible_connection #SSH 连接的类型: local , ssh , paramiko,在 ansible 1.2 之前默认是 paramiko ,后来智能选择,优先使用基于 ControlPersist 的 ssh (支持的前提)
ansible_python_interpreter #用来指定python解释器的路径,默认为/usr/bin/python 同样可以指定ruby 、perl 的路径
ansible_*_interpreter #其他解释器路径,用法与ansible_python_interpreter类似,这里"*"可以是ruby或才perl等其他语言
上面的实例也可以配置直接使用用户名和密码进行连接
[root@Ansible ~]# vim /etc/ansible/hosts
[web]
192.168.8.66 ansible_ssh_port=10022 ansible_ssh_user=root ansible_ssh_pass=‘123456‘
192.168.8.55
示例:
[root@Ansible ~]# ansible web -m command -a ‘uptime‘
192.168.8.66 | SUCCESS | rc=0 >>
16:46:32 up 14:43, 4 users, load average: 0.21, 0.06, 0.06
192.168.8.55 | SUCCESS | rc=0 >>
16:46:34 up 11:39, 7 users, load average: 0.16, 0.41, 0.37
变量也可以通过组名,然后应用到组内的所有成员。组变量的作用域是覆盖组所有成员,通过定义一个新块,块名由组名+":vars" 组成。格式如下:
[root@Ansible ~]# vim /etc/ansible/hosts
[web]
Server
Client
[web:vars]
Server_01=192.168.8.8
Client_01=192.168.8.66
[root@Ansible ansible]# ansible web -m command -a ‘uptime‘
Client | SUCCESS | rc=0 >>
17:26:55 up 15:24, 4 users, load average: 0.00, 0.01, 0.05
Server | SUCCESS | rc=0 >>
17:26:55 up 14:42, 5 users, load average: 0.05, 0.14, 0.18
说明:上面的web组中包含了两台主机Server和Client,通过对web组指定了vars变量,相应的Server和Client主机相当于相应的指定了Server_01和Client_01变量的参数值。
同时Ansible支持组嵌套组 ,通过定义一个新块,块名由组名+":children"组成。格式如下:
[root@Ansible ~]# vim /etc/ansible/hosts
[shenzhen]
host1
host2
[guangzhou]
host3
host4
[guangdong:children]
shenzhen
guangzhou
[guangdong:vars]
tomcat=192.168.8.8
nginx=192.168.8.66
apache=192.168.8.77
zabbix=192.168.8.88
[china:children]
guangdong
beijing
shanghai
说明:上面我指定了深圳组有host1、host2;广州组有host3、host4,我又指定了广东组,同时包含深圳和广州;同时为该组内的所有主机指定了四个vars变量。后面我又设定了一个中国组,包含广东、北京、上海
Patterns 其实就是Ansible中的规则去管理哪些主机,也可以理解为,要与哪台主机进行通信。
ansible <pattern_goes_here> -m <module_name> -a <arguments>
ansible <执行的客户机列表> -m <调用的模块> -a <执行的参数>
示例:
[root@Ansible ~]# ansible web -m service -a "name=httpd state=restarted"
192.168.8.66 | SUCCESS => {
"changed": true,
"name": "httpd",
"state": "started",
"status": {
……
}
}
这里是Ansible对web组内的主机来进行远程重启httpd服务。
其中web就是Patterns部分,而之所以上面说Pattern(模式)可以理解为正则,主要针对下面经常用到的用法而言的。
表示所有的主机
all
*
也可以写IP地址或系列主机名
one.example.com
one.example.com:two.example.com
192.168.8.50
192.168.8.*
示例:
[root@Ansible ~]# ansible all -m ping --所有的客户端执行ping
[root@Ansible ~]# ansible ‘*‘ -m ping
192.168.8.66 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.8.55 | SUCCESS => {
"changed": false,
"ping": "pong"
}
在Patterns指定要操作的主机可以使用不同的方法表示:
web[0] #表示web主机组中的第一台主机
web:data #表示web和data主机组中的所有主机
web[0:25] #表示匹配web组的第1个到第25个主机
.51cto.com #表示所有的以51cto.com结尾的主机
.com #表示所有的以.com结尾的主机
Patterns可以分别表示一个或多个组,多组之间用冒号分开,意味着一个主机可以属于多个组
[root@Ansible ~]# vim /etc/ansible/hosts
[web]
Client
Server
192.168.8.55
[server]
a=192.168.8.66
b=192.168.8.8
[root@Ansible ~]# ansible web:server -m ping
Client | SUCCESS => {
"changed": false,
"ping": "pong"
}
Server | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.8.55 | SUCCESS => {
"changed": false,
"ping": "pong"
}
(1)排除特定的主机
web:!servers #目标主机必须在web组中但不在servers组中
ansible web:!server -m ping
(2)执行交集的主机
web:&servers #目标主机必须既在web组中又在servers组中
ansible web:&servers -m ping
(3)更复杂的表达式
ansible web: servers:&python:!data -m ping
上面这个复杂的表达式最后表示的目标主机必须满足:在web或者servers组中,必须还存在于python组中,但是不在data组中。
*.51cto.com:*.org
还可以在开头的地方使用”~”,用来表示这是一个正则表达式:
~(web|server).*\.51cto\.com
以下是ansible-playbook中具体可能用的用法:
(1)在ansible-palybook命令中,你也可以使用变量来组成这样的表达式,但是你必须使用“-e”的选项来指定这个表达式(通常这种方法不常用)
ansible-palybook -e webservers:!{{excluded}}:&{{required}}
(2)在Ansible和ansible-playbook中,还可以通过一个参数”--limit”来明确指定排除某些主机或组
ansible-playbook site.yml --limit group
(3)从Ansible1.2开始,如果想排除一个文件中的主机可以使用"@"
ansible-playbook site.yml --limit @retry_hosts.txt
Ansible官方文档:
http://docs.ansible.com/ansible/latest/user_guide/intro_patterns.html
原文地址:http://blog.51cto.com/13525470/2106004