在Ansible入门中介绍了Ansible的工作机制,这篇着重介绍Ansible的配置文件和Inventory文件。
使用Ansible一个好的习惯是将一个具体任务组织在单独的目录里,这样不会和别的配置任务发生冲突,排查故障时也方便定位。比如安装redis的任务,建立一个新的目录:/ansible/redis,并在目录中创建文件ansible.cfg和hosts。
配置文件
ansible.cfg是Ansible的配置文件,用来控制ansible的行为。配置文件可以出现在很多地方,它的优先级顺序如下:
- ANSIBLE_CONFIG (一个环境变量)。
- ansible.cfg (位于当前目录中)。
- .ansible.cfg (位于用户的家目录中)。
- /etc/ansible/ansible.cfg。
推荐使用第二种方式,将配置文件存放在当前路径中,不同的配置任务使用不同的配置文件。一个最简的ansible.cfg文件:
[defaults]
host_key_checking = False # SSH连接时不校验目标主机的指纹
inventory = hosts # 指定inventory文件
第三行很关键,指定操作目标主机的清单文件。ansible连接远程主机时默认使用当前登录系统用户,如果你以用户aneirin登录安装ansible命令的主机,当需要连接远端主机执行任务时,ansible也是以用户aneirin登录远端主机的。
实际工作中,配置一个专门的用户,这个用户在所管理的服务器中都存在,配置使用公钥登录每台服务器,免密执行需root权限的命令,这样可以省掉不少的麻烦。但前提是ansible主机需绝对安全,否则不要这样做。
inventory文件
这个文件中定义Ansible要操作的目标主机,
[redis]
192.168.52.130
192.168.52.131:2222
[ntpd]
192.168.52.132
192.168.52.133
[linux:children]
redis
ntpd
[linux:vars]
ansible_ssh_user = aneirin
实际环境中,肯定有不止一台服务器需要同时做配置,比如安装Redis,这时可以定义一个Redis主机组,然后将目标主机的IP地址填写上去,如果SSH连接配置了非22的端口,可以直接写到IP地址后面,用冒号隔开。
将多个主机组放到一个更大的主机组,使用[大主机组:children]的写法,上面inventory文件将redis和ntpd主机组放到了linux主机组中,方便ansible执行一些通用的配置。
最后两行针对主机组定义的变量,这些变量有些是可以定义在ansible配置文件中的,有些是为了在Playbook中使用(关于Playbook放到后面的讲解中)。
命令使用
/ansible/redis目录包含了ansible.cfg和hosts文件,就可以执行ansible的ad hoc命令了。
[aneirin@host redis]$ ansible linux -m shell -a 'uptime'
192.168.52.131 | CHANGED | rc=0 >>
18:23:48 up 4:48, 2 users, load average: 0.51, 0.40, 0.35
192.168.52.132 | CHANGED | rc=0 >>
18:23:48 up 4:48, 2 users, load average: 0.25, 0.22, 0.21
192.168.52.128 | CHANGED | rc=0 >>
18:23:51 up 1 day, 4:05, 2 users, load average: 0.38, 0.12, 0.08
ad hoc命令执行起来比较直接了当,比如要给大量的主机安装一个服务或者查询服务器的主机名这类工作使用ad hoc命令比较方便,ad hoc命令的缺点是不能重用,只能完成简单的工作。
安装Redis:
[aneirin@host redis]$ ansible redis -m yum -a 'name=redis state=present'
192.168.52.131 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"changes": {
"installed": [
"redis"
]
},
"msg": "",
"rc": 0,
......
}
要得到上面的结果,上面的Ansible配置文件需要增加几行。
[privilege_escalation]
become = True
become_method = sudo
become_ask_pass = False