Ansible入门(二).md
一、Ansible的配置文件
Ansible的主配置文件是/etc/ansible/ansible.cfg
如果你发现没有这个文件也不要着急,可能是因为使用pip方式安装的ansible。
Ansible在运行时会按照如下顺序去寻找ansible.cfg
- File specified by the ANSIBLE_CONFIG environment variable(环境变量指定)
- ./ansible.cfg (ansible.cfg in the current directory 当前目录)
- ~/.ansible.cfg (.ansible.cfg in your home directory 用户家目录)
- /etc/ansible/ansible.cfg
在这里我们强烈建议将ansible.cfg放置在当前目录,并且与hosts文件放置在一起,并且使用SVN等版本软件进行管理。
注:如果同时存在/etc/ansible/ansible.cfg和 ./ansible.cfg 两个文件,因为ansible按照顺序寻找,找到以后就不再向下寻找,所以只有 ./ansible.cfg生效。
ansible.cfg会有很多可配置项,这里我们粘贴了部分常用项:
#@@Example of ansible.cfg
[defaults]
#hostfile指定hosts文件位置,从1.9版本开始被inventory替代
hostfile = ./hosts
#关闭host_key_checking,否则第一次使用有连接提示
host_key_checking = False
这里大家看到我们只配置了2项,那是因为还有很多配置项都采用的默认值,我们粘贴一部分默认项
[defaults]
remote_tmp = $HOME/.ansible/tmp
pattern = *
forks = 5
poll_interval = 15
sudo_user = root
transport = smart
remote_port = 22
gathering = implicit
我觉着这里面需要解释的有两项:
forks 与主机通信时的默认并行进程数
gathering 控制默认facts收集(远程系统变量)。
gathering 的默认值是implicit,表示每次连接主机都会会从主机上收集信息,除非playbook里指定了gather_facts: False,explicit正好相反,每次都不会收集主机信息,smart是智能模式,会有一个缓存区域(缓存时间可以设定),在缓存内就不会收集,缓存没有或者失效才会去主机上收集信息。因此如果启用了smart模式,还需要配置下面几项
fact_caching = redis
fact_caching_timeout = 3600
fact_caching_connection = localhost:6379:0
二、主机清单的管理
hosts文件保存所有远程主机的信息,其中大括号表示一个主机组,一个组可以包含一个或多个主机,当你操作一个组的时候也就表示操作该组下的所有主机:
192.168.1.1
192.168.1.2
[webserver]
192.168.1.3:32222 #额外指定连接端口,默认使用22端口
192.168.1.4
可以在hosts文件中使用通配符
[webservers]
192.168.1.[1:50] #匹配192.168.1.1~192.168.1.50
[databases]
db-[a:f].example.com
可以为每个主机单独指定一些变量
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
可以为每个主机指定连接类型和连接用户
[targets]
localhost ansible_connection=local
other1.example.com ansible_connection=ssh ansible_ssh_user=mpdehaan
other2.example.com ansible_connection=ssh ansible_ssh_user=mdehaan
三、Playbook
Ansible的playbook就如同saltstack的state,一个playbook就是一个YAML文件,所以playbook文件一般都以.yml结尾,写playbook不需要复杂的YAML语法,所以也不用单独去学YAML语法。
此外playbook和模板文件(template模块)还使用jinja2语法语法实现高级功能。
一个playbook文件由一个或多个play组成,每个play定义了在一个或多个远程主机上执行的一系列的task,其中每个task一般就是调用一个ansible的模块,如调用copy模块复制文件到远程主机或调用shell模块执行命令。
下面是一个简单的例子:
--- #任何playbook文件(其实就是yaml文件)都要以这个开头
- hosts: webservers #对webservers主机组下的所有主机进行操作
vars: #为该play定义两个变量
http_port: 80
max_clients: 200
gather_facts: False #禁止收集信息,加快运行速度
remote_user: sapser #连接到远程主机的用户
sudo: yes #以sudo模式运行该play
sudo_user: root #sudo到哪个用户,默认为root,需要密码,则在执行ansible-playbook的时候指定-K选项输入
tasks: #开始定义task
- name: ensure apache is at the latest version #这既是每个task的说明也是每个task的名字
yum: pkg=httpd state=latest
- name: write the apache config file
template: src=./template/httpd.j2 dest=/etc/httpd.conf
notify: restart apache #触发操作
- name: ensure apache is running
service: name=httpd state=started
handlers: #notify通知这里的task执行
- name: restart apache
service: name=httpd state=restarted
然后就可以执行该palybook了
$ ansible-playbook test.yml
四、SVN管理Ansible
之前我们配置了ansible.cfg 也编写了主机清单文件hosts,还写了一个简单的playbook(包含模板httpd.j2)
这些都可以使用SVN进行管理,便于保持内容和回滚版本。
其目录树如下:
.
|-- ansible.cfg
|-- hosts
|-- main.yml
`-- template
`-- httpd.j2
五、playbook的加密解密
Ansible提供了ansible-vault来对含有敏感信息的playbook进行加密。
加密后的playbook必须输入密码才能运行。
用法如下:
[root@ansible test]$head test.yml
---
- hosts: webserver
vars:
logserver: 10.237.2.170
[root@ansible test]$ansible-vault encrypt test.yml
Vault password:
Confirm Vault password:
Encryption successful
[root@ansible test]$head test.yml
$ANSIBLE_VAULT;1.1;AES256
32326530616335366433653261623738653265636138346265663463353331393964326138303464
[root@ansible test]$ansible-playbook test.yml
ERROR: A vault password must be specified to decrypt test.yml
[root@ansible test]$ansible-playbook test.yml --ask-vault-pass
参考资料
http://docs.ansible.com/ansible/intro_configuration.html
http://jpmens.net/2015/01/29/caching-facts-in-ansible/
http://sapser.github.io/ansible/2014/07/21/ansible-playbook/
转载请注明:IPCPU-网络之路 » Ansible入门(二)