Ansible安装好以后的主机清单配置文件有以下两种:
一、yum安装,配置文件默认路径为:
/etc/ansible/hostsnode
二、源码包安装,主机清单配置文件路径须要从软件包里面拷贝,以下:python
[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 参数指定相应的路径。
具体查看相应的路径为:nginx
[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这个文件来定义主机和组web
[root@Ansible ~]# vim /etc/ansible/hosts [web] #定义组名,可自定义 192.168.92.131 #定义主机IP 192.168.92.132 #新定义一台主机IP
组定义:
能够根据本身的需求将庞大的主机分红具备标识的组
主机定义:
可使用域名、主机名、IP地址表示;固然使用前二者时,也须要主机能反解析相应的IP地址,通常此类配置中多使用IP地址
示例:正则表达式
[root@Ansible ~]# ansible web -m command -a 'uptime' 192.168.92.131 | SUCCESS | rc=0 >> 18:24:15up 13:52, 4 users, load average: 0.00, 0.01, 0.05 192.168.92.132 | SUCCESS | rc=0 >> 18:24:15 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个端口链接shell
[root@Client ~]# vim /etc/ssh/sshd_config 17 Port 10022 18 Port 22 [root@Client ~]# systemctl restart sshd --修改以后,重启sshd服务生效
在Ansible服务端的配置:apache
[root@Ansible ~]# vim /etc/ansible/hosts [web] 192.168.92.131:10022 192.168.92.132
示例:vim
[root@Ansible ~]# ansible web -m command -a 'uptime' 192.168.92.131 | SUCCESS | rc=0 >> 16:17:28 up 14:14, 4 users, load average: 0.00, 0.02, 0.05 192.168.92.132 | SUCCESS | rc=0 >> 16:17:29 up 11:10, 4 users, load average: 0.01, 0.03, 0.05
hosts官方有个例子是经过指定主机名的范围来进行多台主机的定义tomcat
[root@Ansible ~]# vim /etc/ansible/hosts [webservers] node[01:50] .example.com
上面指定了从node01.com到node50. example.com,webservers组共计50台主机ruby
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.92.131 ansible_ssh_port=30022 ansible_ssh_user=root ansible_ssh_pass='123' 192.168.92.132
示例:
[root@Ansible ~]# ansible web -m command -a 'uptime' 192.168.92.131| SUCCESS | rc=0 >> 16:46:32 up 14:43, 4 users, load average: 0.21, 0.06, 0.06 192.168.92.132| 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.92.131 Client_01=192.168.92.132 [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.92.131 nginx=192.168.8.92.132 apache=192.168.92.133 zabbix=192.168.92.134 [china:children] guangdong beijing shanghai
说明:上面我指定了深圳组有host一、host2;广州组有host三、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.92.131 | 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.92.131 192.168.92.*
示例:
[root@Ansible ~]# ansible all -m ping --全部的客户端执行ping [root@Ansible ~]# ansible '*' -m ping 192.168.92.131| SUCCESS => { "changed": false, "ping": "pong" } 192.168.92.132| 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.92.131 [server] a=192.168.92.132 b=192.168.92.133 [root@Ansible ~]# ansible web:server -m ping Client | SUCCESS => { "changed": false, "ping": "pong" } Server | SUCCESS => { "changed": false, "ping": "pong" } 192.168.92.131 | 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