返回介绍

9.7 playbook 角色与包含声明

发布于 2024-01-29 22:54:23 字数 6326 浏览 0 评论 0 收藏 0

当我们写一个非常大的playbook时,想要复用些功能显得有些吃力,还好Ansible支持写playbook时拆分成多个文件,通过包含(include)的形式进行引用,我们可以根据多种维度进行“封装”,比如定义变量、任务、处理程序等。

角色建立在包含文件之上,抽象后更加清晰、可复用。运维人员可以更专注于整体,只有在需要时才关注具体细节。Ansible官方在GitHub上提供了大量的示例供大家参考借鉴,访问地址https://github.com/ansible/ansible-examples即可获相应的学习资料。

9.7.1 包含文件,鼓励复用

当多个playbook涉及复用的任务列表时,可以将复用的内容剥离出,写到独立的文件当中,最后在需要的地方include进来即可,示例如下:

【tasks/foo.yml】

---
# 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

9.7.2 角色

现在我们已经了解了变量、任务、处理程序的定义,有什么方法更好地进行组织或抽象,让其复用性更强、功能更具模块化?答案就是角色。角色是Ansible定制好的一种标准规范,以不同级别目录层次及文件对角色、变量、任务、处理程序等进行拆分,为后续功能扩展、可维护性打下基础。一个典型角色目录结构的示例如下:

site.yml
webservers.yml
fooservers.yml
roles/
  common/
   files/
   templates/
   tasks/
   handlers/
   vars/
   meta/
  webservers/
   files/
   templates/
   tasks/
   handlers/
   vars/
   meta/

在playbook是这样引用的:

【site.yml】

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

角色定制以下规范,其中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/无需写路径,默认相对或绝对引用。

为了便于大家更好地理解和使用角色(role),对9.6节中的nginx软件包管理的playbook(独立文件)修改成角色的形式,同时添加了一个公共类角色common,从角色全局作用域中抽取出公共的部分,一般为系统的基础服务,比如ntp、iptables、selinux、sysctl等。本示例是针对ntp服务的管理。

(1)playbook目录结构

playbook目录包括变量定义目录group_vars、主机组定义文件hosts、全局配置文件site.yml、角色功能目录,playbook目录结构可参考图9-5。

【/home/test/ansible/playbooks/nginx】

(2)定义主机组

以下定义了一个业务组webservers,成员为两台主机。

【nginx/hosts】

[webservers]
192.168.1.21
192.168.1.22

非必选配置,默认将引用/etc/ansible/hosts的参数,角色中自定义组与主机文件将通过“-i file”命令行参数调用,如ansible-playbook-i hosts来调用。

图9-5 playbook主目录结构

(3)定义主机或组变量

定义规则见9.3节所述,group_vars为定义组变量目录,目录当中的文件名要与组名保持一致,组变量文件定义的变量作为域只受限于该组,all代表所有主机。

【nginx/group_vars/all】

---
# Variables listed here are applicable to all host groups
ntpserver: ntp.sjtu.edu.cn

【nginx/group_vars/webservers】

---
worker_processes: 4
num_cpus: 4
max_open_file: 65536
root: /data

(4)全局配置文件site.yml

下面的全局配置文件引用了两个角色块,角色的应用范围及实现功能都不一样:

【nginx/site.yml】

---
- name: apply common configuration to all nodes
 hosts: all
 roles:
  - common
- name: configure and deploy the webservers and application code
 hosts: webservers
 roles:
  - web

全局配置文件site.yml引用了两个角色,一个为公共类的common,另一个为web类,分别对应nginx/common、nginx/web目录。以此类推,可以引用更多的角色,如db、nosql、hadoop等,前提是我们先要进行定义,通常情况下一个角色对应着一个特定功能服务。通过hosts参数来绑定角色对应的主机或组。

(5)角色common的定义

角色common定义了handlers、tasks、templates、vars 4个功能类,分别存放处理程序、任务列表、模板、变量的配置文件main.yml,需要注意的是,vars/main.yml中定义的变量优先级高于/nginx/group_vars/all,可以从ansible-playbook的执行结果中得到验证。各功能块配置文件定义如下:

【handlers/main.yml】

- name: restart ntp
 service: name=ntpd state=restarted

【tasks/main.yml】

- name: Install ntp
 yum: name=ntp state=present
- name: Configure ntp file
 template: src=ntp.conf.j2 dest=/etc/ntp.conf
 notify: restart ntp
- name: Start the ntp service
 service: name=ntpd state=started enabled=true
- name: test to see if selinux is running
 command: getenforce
 register: sestatus
 changed_when: false

其中template:src=ntp.conf.j2引用模板时无需写路径,默认在上级的templates目录中查找。

【templates/ntp.conf.j2】

driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1
server {{ ntpserver }}
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys

此处{{ntpserver}}将引用vars/main.yml定义的ntpserver变量。

【vars/main.yml】

---
# Variables listed here are applicable to all host groups
ntpserver: 210.72.145.44

(6)角色web的定义

角色web定义了handlers、tasks、templates三个功能类,基本上是9.6节中的nginx管理playbook对应定义功能段打散后的内容。具体功能块配置文件定义如下:

【handlers/main.yml】

- name: restart nginx
 service: name=nginx state=restarted

【tasks/main.yml】

- name: ensure nginx is at the latest version
 yum: pkg=nginx state=latest
- name: write the nginx config file
 template: src=nginx2.conf dest=/etc/nginx/nginx.conf
 notify:
 - restart nginx
- name: ensure nginx is running
 service: name=nginx state=started

【templates/nginx2.conf】

user          nginx;
worker_processes  {{ worker_processes }};
{% if num_cpus == 2 %}
worker_cpu_affinity 01 10;
{% elif num_cpus == 4 %}
worker_cpu_affinity 1000 0100 0010 0001;
{% elif num_cpus >= 8 %}
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
{% else %}
worker_cpu_affinity 1000 0100 0010 0001;
{% endif %}
worker_rlimit_nofile {{ max_open_file }};
……

具体web角色定义细节将不展开描述,可参考9.6节及common角色的说明。

(7)运行角色

#cd /home/test/ansible/playbooks/nginx
#ansible-playbook -i hosts site.yml -f 10

运行结果如图9-6与图9-7所示。

图9-6 ntp部署片段

图9-7 nginx部署片段

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文