ansible 二主机和组

主机清单的管理

Ansible安装好之后的主机清单配置文件有如下两种:
1、yum安装,配置文件默认路径为:
/etc/ansible/hosts
2、源码包安装,主机清单配置文件路径需要从软件包里面拷贝,如下:

[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

一、主机和组

1、主机和组(Hosts and Groups)

通过配置/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

2、端口与别名

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

3、指定主机范围

hosts官方有个例子是通过指定主机名的范围来进行多台主机的定义

[root@Ansible ~]# vim /etc/ansible/hosts
[webservers]
node[01:50] .example.com

上面指定了从node01.com到node50. example.com,webservers组共计50台主机

4、使用主机变量

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

5、定义组内变量

变量也可以通过组名,然后应用到组内的所有成员。组变量的作用域是覆盖组所有成员,通过定义一个新块,块名由组名+":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变量的参数值。

6、组的包含于组内变量

同时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(主机与组正则匹配部分)

Patterns 其实就是Ansible中的规则去管理哪些主机,也可以理解为,要与哪台主机进行通信。

ansible <pattern_goes_here> -m <module_name> -a
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(模式)可以理解为正则,主要针对下面经常用到的用法而言的。

1、所有的主机

表示所有的主机

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"
}

2、通配符或逻辑符

在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"
}

3、逻辑非!与逻辑and

(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组中。

4、混合高级用法

*.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

posted @ 2019-03-14 20:19  云丛  阅读(1739)  评论(0编辑  收藏  举报