最新消息:

Ansible入门(二)

Linux ipcpu 5843浏览

Ansible入门(二).md

一、Ansible的配置文件

Ansible的主配置文件是/etc/ansible/ansible.cfg
如果你发现没有这个文件也不要着急,可能是因为使用pip方式安装的ansible。

Ansible在运行时会按照如下顺序去寻找ansible.cfg

  1. File specified by the ANSIBLE_CONFIG environment variable(环境变量指定)
  2. ./ansible.cfg (ansible.cfg in the current directory 当前目录)
  3. ~/.ansible.cfg (.ansible.cfg in your home directory 用户家目录)
  4. /etc/ansible/ansible.cfg

在这里我们强烈建议将ansible.cfg放置在当前目录,并且与hosts文件放置在一起,并且使用SVN等版本软件进行管理。

注:如果同时存在/etc/ansible/ansible.cfg和 ./ansible.cfg 两个文件,因为ansible按照顺序寻找,找到以后就不再向下寻找,所以只有 ./ansible.cfg生效。

ansible.cfg会有很多可配置项,这里我们粘贴了部分常用项:

  1. #@@Example of ansible.cfg
  2. [defaults]
  3. #hostfile指定hosts文件位置,从1.9版本开始被inventory替代
  4. hostfile = ./hosts
  5. #关闭host_key_checking,否则第一次使用有连接提示
  6. host_key_checking = False

这里大家看到我们只配置了2项,那是因为还有很多配置项都采用的默认值,我们粘贴一部分默认项

  1. [defaults]
  2. remote_tmp = $HOME/.ansible/tmp
  3. pattern = *
  4. forks = 5
  5. poll_interval = 15
  6. sudo_user = root
  7. transport = smart
  8. remote_port = 22
  9. gathering = implicit

我觉着这里面需要解释的有两项:
forks 与主机通信时的默认并行进程数
gathering 控制默认facts收集(远程系统变量)。
gathering 的默认值是implicit,表示每次连接主机都会会从主机上收集信息,除非playbook里指定了gather_facts: False,explicit正好相反,每次都不会收集主机信息,smart是智能模式,会有一个缓存区域(缓存时间可以设定),在缓存内就不会收集,缓存没有或者失效才会去主机上收集信息。因此如果启用了smart模式,还需要配置下面几项

  1. fact_caching = redis
  2. fact_caching_timeout = 3600
  3. fact_caching_connection = localhost:6379:0

二、主机清单的管理

hosts文件保存所有远程主机的信息,其中大括号表示一个主机组,一个组可以包含一个或多个主机,当你操作一个组的时候也就表示操作该组下的所有主机:

  1. 192.168.1.1
  2. 192.168.1.2
  3. [webserver]
  4. 192.168.1.3:32222 #额外指定连接端口,默认使用22端口
  5. 192.168.1.4

可以在hosts文件中使用通配符

  1. [webservers]
  2. 192.168.1.[1:50] #匹配192.168.1.1~192.168.1.50
  3. [databases]
  4. db-[a:f].example.com

可以为每个主机单独指定一些变量

  1. [atlanta]
  2. host1 http_port=80 maxRequestsPerChild=808
  3. host2 http_port=303 maxRequestsPerChild=909

可以为每个主机指定连接类型和连接用户

  1. [targets]
  2. localhost ansible_connection=local
  3. other1.example.com ansible_connection=ssh ansible_ssh_user=mpdehaan
  4. 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模块执行命令。

下面是一个简单的例子:

  1. --- #任何playbook文件(其实就是yaml文件)都要以这个开头
  2. - hosts: webservers #对webservers主机组下的所有主机进行操作
  3. vars: #为该play定义两个变量
  4. http_port: 80
  5. max_clients: 200
  6. gather_facts: False #禁止收集信息,加快运行速度
  7. remote_user: sapser #连接到远程主机的用户
  8. sudo: yes #以sudo模式运行该play
  9. sudo_user: root #sudo到哪个用户,默认为root,需要密码,则在执行ansible-playbook的时候指定-K选项输入
  10. tasks: #开始定义task
  11. - name: ensure apache is at the latest version #这既是每个task的说明也是每个task的名字
  12. yum: pkg=httpd state=latest
  13. - name: write the apache config file
  14. template: src=./template/httpd.j2 dest=/etc/httpd.conf
  15. notify: restart apache #触发操作
  16. - name: ensure apache is running
  17. service: name=httpd state=started
  18. handlers: #notify通知这里的task执行
  19. - name: restart apache
  20. service: name=httpd state=restarted

然后就可以执行该palybook了

  1. $ ansible-playbook test.yml

四、SVN管理Ansible

之前我们配置了ansible.cfg 也编写了主机清单文件hosts,还写了一个简单的playbook(包含模板httpd.j2)

这些都可以使用SVN进行管理,便于保持内容和回滚版本。

其目录树如下:

  1. .
  2. |-- ansible.cfg
  3. |-- hosts
  4. |-- main.yml
  5. `-- template
  6. `-- httpd.j2

五、playbook的加密解密

Ansible提供了ansible-vault来对含有敏感信息的playbook进行加密。

加密后的playbook必须输入密码才能运行。

用法如下:

  1. [root@ansible test]$head test.yml 
  2. ---
  3. - hosts: webserver
  4.   vars:          
  5.     logserver: 10.237.2.170
  6. [root@ansible test]$ansible-vault encrypt test.yml
  7. Vault password:
  8. Confirm Vault password:
  9. Encryption successful
  10. [root@ansible test]$head test.yml 
  11. $ANSIBLE_VAULT;1.1;AES256
  12. 32326530616335366433653261623738653265636138346265663463353331393964326138303464
  13. [root@ansible test]$ansible-playbook  test.yml 
  14. ERROR: A vault password must be specified to decrypt test.yml
  15. [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入门(二)