Ansible实践
---- 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使用到了yum,template,service模块。
Roles(角色)
当编写的Playbook越来越多,则需要一种更好的方式来组织这些Playbook,这时就需要Roles。Roles规范出了Playbook的一些通用目录,在运行Playbook时,会自动加载这些目录中的信息,目录列表大致如:
site.ymlwebservers.ymlfooservers.ymlroles/ common/ files/ templates/ tasks/ handlers/ vars/ defaults/ meta/ webservers/ files/ templates/ tasks/ handlers/ vars/ defaults/ meta/ 上面目录中,包含两个角色common和webservers,每个角色包含一些可选的目录,在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安装使用。