- 本书赞誉
- 前言
- 第一部分 基础篇
- 第1章 系统基础信息模块详解
- 第2章 业务服务监控详解
- 第3章 定制业务质量报表详解
- 第4章 Python 与系统安全
- 第二部分 高级篇
- 第5章 系统批量运维管理器 pexpect 详解
- 第6章 系统批量运维管理器 paramiko 详解
- 第7章 系统批量运维管理器Fabric详解
- 第8章 从零开发一个轻量级 WebServer
- 第9章 集中化管理平台 Ansible 详解
- 第10章 集中化管理平台 Saltstack 详解
- 第11章 统一网络控制器 Func 详解
- 第12章 Python 大数据应用详解
- 第三部分 案例篇
- 第13章 从零开始打造 B/S 自动化运维平台
- 第14章 打造 Linux 系统安全审计功能
- 第15章 构建分布式质量监控平台
- 第16章 构建桌面版 C/S 自动化运维平台
9.7 playbook 角色与包含声明
当我们写一个非常大的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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论