Ansible实践

JerryXia 发表于 , 阅读 (0)
上面使用命令行方式(Ad-Hoc)运行了Ansible任务,但实际中这样做是很少的,往往任务不会只有一个,而常会执行多个任务,于是需要一种描述语言来描述一些列任务的执行,这就是PlaybookPlaybook使用YAML文件格式编写,如:
---- hosts: webservers     # 主机列表  vars:                 # 变量    http_port: 80    max_clients: 200  remote_user: root     # ssh用户  tasks:                # 任务列表  - name: ensure apache is at the latest version    yum: name=httpd state=latest  - name: write the apache config file    template: src=/srv/httpd.j2 dest=/etc/httpd.conf    notify:    - restart apache  - name: ensure apache is running (and enable it at boot)    service: name=httpd state=started enabled=yes  handlers:             # 通知处理器    - name: restart apache      service: name=httpd state=restarted    

Playbook主要由几部分组成:hosts(任务执行的目标主机),vars(任务执行上下文的变量信息),tasks(任务执行列表)和handlers(任务执行完成的通知处理器)。上面的Playbook将以root用户在webservers服务器上执行一些列任务:yum安装最新apache包配置httpd重启apache开机自启动apache

执行Playbook

可以通过ansible-playbook执行编写好的Playbook:

ansible-playbook -i [inventory] my_playbook.yml    

Modules(模块)

Ansible提供了很多可用的模块,这些模块可以直接在远程主机上执行,如上面的Playbook使用到了yumtemplateservice模块。

Roles(角色)

当编写的Playbook越来越多,则需要一种更好的方式来组织这些Playbook,这时就需要RolesRoles规范出了Playbook的一些通用目录,在运行Playbook时,会自动加载这些目录中的信息,目录列表大致如:

site.ymlwebservers.ymlfooservers.ymlroles/   common/     files/     templates/     tasks/     handlers/     vars/     defaults/     meta/   webservers/     files/     templates/     tasks/     handlers/     vars/     defaults/     meta/    

上面目录中,包含两个角色commonwebservers,每个角色包含一些可选的目录,在Playbook中可以调用角色:

---- hosts: webservers  roles:     - common     - webservers    

Playbook执行中,会使用对应角色目录下的文件,tasks/main.yml存放任务列表,handlers/main.yml存放处理器列表,vars/main.yml存放变量,defaults/main.yml存放默认变量(优先级最低),meta/main.yml存放角色依赖关系,files/存放文件复制操作中使用到的文件(此时可以仅指定文件名,而不需要绝对路径),templates/存放template模块操作的模板文件。

角色参数化

调用角色时,可以传递一些额外参数,如:

- hosts: webservers  roles:    - common    - { role: role_one, dir: '/opt/a',  port: 5000 }            # 定义变量dir,port    - { role: role_two, when: "ansible_os_family == 'RedHat'" } # 增加条件限制    

角色依赖

可以在meta/main.yml中定义角色依赖关系,如:

---dependencies:  - { role: common, some_parameter: 3 }  - { role: apache, port: 80 }  - { role: postgres, dbname: blarg, other_parameter: 12 }    

使用Role组织脚本是官方强烈推荐的,实际中,应尽量做到Role细粒度化,需要执行某些任务时,则将这些Role进行自由组合来达到目的,以实现复用

第三方Role

Ansible提供了一个第三方Role平台Ansible Galaxy,可以通过ansible-galaxy安装使用。

Ansible最佳实践

Ansible提供了一个较详细的最佳实践,可结合实际情况作一些斟酌,这里有一些样例代码