一 点睛
当我们写一个非常大的playbook时,想要复用些功能显得有些吃力,还好Ansible支持将playbook拆分成多个文件,通过包含 (include)的形式进行引用,我们可以根据多种维度进行“封装”,比如定义变量、任务、处理程序等。
角色建立在包含文件之上,抽象后更加清晰、可复用。运维人员可以更专注于整体,只有在需要时才关注具体细节。Ansible官方在 GitHub上提供了大量的示例供大家参考借鉴,访问地址 https://github.com/ansible/ansible-examples即可获相应的学习资料。
二 包含声明
当多个playbook涉及复用的任务列表时,可以将复用的内容剥离出,写到独立的文件当中,最后在需要的地方include进来即可,示例如下:
---
# possibly saved as tasks/foo.yml
- name: placeholder foo
command: /bin/foo
- name: placeholder bar
command: /bin/bar
然后就可以在使用的playbook中include进来,如:
tasks:
- include: tasks/foo.yml
当然,也可以将变量传递到包含文件当中,这称为“参数包含”。
如在部署多个WordPress的情况下,可以根据不同用户单独部署WordPress的任务,且引用单个wordpress.yml文件,可以这样写:
tasks:
- include: wordpress.yml user=timmy
- include: wordpress.yml user=alice
- include: wordpress.yml user=bob
1.4或更高版本可支持以Python的字典、列表的传递参数形式,如:
tasks:
- { include:wordpress.yml,user: timmy,ssh_keys: ['keys/one.txt','keys/two.txt']}
使用这两种方法都进行变量传递,然后在包含文件中通过使用 {{user}}进行变量引用。
将处理程序(handlers)放到包含文件中是一个好的做法,比如重启Apache的任务。
handlers/handlers.yml
---
# this might be in a file like handlers/handlers.yml
- name: restart apache
service: name=apache state=restarted
需要时可以进行引用,像这样:
handlers:
- include: handlers/handlers.yml
三 角色介绍
1 点睛
角色是Ansible定制好的一种标准规范,以不同级别目录层次及文件对角色、变量、任务、处理程序等进行拆分,为后续功能扩展、可维护性打下基础。
一个典型角色目录结构如下:
[root@localhost roles]# tree
.
├── common
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── ntp.conf.j2
│ └── vars
│ └── main.yml
└── web
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
└── templates
└── nginx2.conf
在playbook是这样引用的:
---
- name: apply common configuration to all nodes
hosts: all
roles:
- common
- name: configure and deploy the webservers and application code
hosts: webservers
roles:
- web
2 角色定制以下规范,其中x为角色名。
- 如roles/x/tasks/main.yml文件存在,其中列出的任务将被添加到执行队列;
- 如roles/x/handlers/main.yml文件存在,其中所列的处理程序将被添加到执行队列;
- 如roles/x/vars/main.yml文件存在,其中列出的变量将被添加到执行队列;
- 如roles/x/meta/main.yml文件存在,所列任何作用的依赖关系将被添加到角色的列表(1.3及更高版本); 任何副本任务可以引用roles/x/files/无需写路径,默认相对或绝对引用;
- 任何脚本任务可以引用roles/x/files/无需写路径,默认相对或绝对 引用;
- 任何模板任务可以引用文件中的roles/x/templates/无需写路径,默 认相对或绝对引用。