一、Roles技巧之Handlers-动态变更
如上节介绍,Roles不仅支持Tasks调用,同时支持Vars、Files、Handlers、Meta、Templates的调用。本节为大家介绍Handlers在Roles中的使用技巧。
客观讲“动态变更“形容不是很恰当,官方原文为“Running Operations On Change“-只有当状态变化时才会执行命令,Handlers通常和Notify搭配使用,当(文件/进程/返回等)状态有变化时Notify会通过Handlers做指定的变更。我们通过一个功能完整的Roles来整体了解Vars、Files、Handlers、Meta、Templates,然后逐步深入Roles Handlers用法,请看示例example.yml:
site.yml webservers.yml fooservers.yml roles/ common/ files/ templates/ tasks/ handlers/ vars/ defaults/ meta/ webservers/ files/ templates/ tasks/ handlers/ vars/ defaults/ meta/
example.yml为大家展示了两个功能齐全的Roles,分别为common和webservers,每个Roles均包括 files、templates、tasks、handlers、vars、defaults、meta,在Playbooks中的调用方式如下:
--- - hosts: webservers roles: - common - webservers
Ok,了解了Roles支持的功能集和调用方式后,我们再来了解这些功能集的含义。
roles/x/tasks/main.yml
:主函数,包括在其中的所有任务将被执行roles/x/handlers/main.yml
:所有包括其中的 handlers 将被执行roles/x/vars/main.yml
:所有包括在其中的变量将在roles中生效roles/x/meta/main.yml
:roles所有依赖将被正常登入roles/x/{files,templates,tasks}/ (dir depends on task)
:所有文件,模板都将可存放在这里,放在这里最大的好处是不用指定绝对路径
1、通过案例来学习Handlers的应用场景
案例说明:当Apache的配置文件发生变化时重启Apache进程。
编辑roles/apache/tasks/main.yml内容如下:
步骤1 编排Roles目录结构如下:
roles/apache/ ├── handlers │ └── main.yml └── tasks ├── restart.yml └── main.yml
目录结构需按要求编排,不得随意变更名称。
步骤2 编辑roles/apache/handers/main.yml的内容如下:
# sleep 10s # -name:restart apache service: name=apache state=restarted
步骤3 编辑roles/apache/tasks/restart.yml内容如下:
-name: transfer apache config copy: src=httpd.conf dest=/opt/apache/httpd.conf notify: - restart apache
该YML功能为更新Apache配置文件,如配置文件有变化则重启Apache。
- include: restart.yml
步骤4 编辑Roles同级目录apache.yml文件,内容如下:
-hosts: webserver remote_user: root roles: - role: apache
该YML为总调度文件,完成Apache配置文件的变更和Apache的重启工作。
步骤5 执行命令ansile-playbook apache.yml 验证结果
命令运行结果为更新Apache配置文件,如配置文件有更新则重启Apache,如无错误返回为正常。
如上,我们即完成了当Apache配置文件有更新时才重启Apache,在实际工作中我们并不希望随意重启应用造成服务中断吧,所以Handlers非常有用。接下来我们看Roles中Files的使用。
二、Roles技巧之Files-文件传输
Files和Templates均用于Ansible文件处理,两者主要区别是Files(不是file模块)目录下的文件无需写死绝对路径即可将将文件传输至远程主机,Templates目录下的文件以Jinja2渲染,且传输文件至远程主机的同时支持预定义变量替换。接下来我们看Roles中Files的使用方式
1、通过案例学习
案例说明:将example role下的MAGEDU.PPT和STANLEY.PPT两个文件传输至远程修改文件名为全小写。
返回如下结果:
./file.yml内容如下:
./roles/example/tasks/file.yml内容如下:
./roles/example/tasks/main.yml内容如下:
MAGEDU.PPT内容如下:
This is magedu.ppt file.
STANLEY.PPT内容如下:
This is stanley.ppt file.
步骤1 编排目录结构如下(不得随意变更):
file.yml roles/example/ ├── files │ ├── MAGEDU.PPT │ └── STANLEY.PPT ├── tasks │ ├── file.yml │ └── main.yml
步骤2 依次创建文件MAGEDU.PPT、STANLEY.PPT
步骤3 依次编辑./file.yml、./roles/example/tasks/file.yml、./roles/example/tasks/main.yml
# This playbook deploys the whole application stack in this site. - hosts: 192.168.37.142 remote_user: root gather_facts: false roles: - role: example
- name: file change example #copy: src=MAGEDU.PPT dest=/data/magedu.ppt owner=stanley group=stanley copy: src={{ item.src }} dest=/data/{{ item.dest }} owner=stanley group=stanley with_items: - { src: 'MAGEDU.PPT', dest: 'magedu.ppt' } - { src: 'STANLEY.PPT', dest: 'stanley.ppt' }
- include: file.yml
步骤4 传输文件到远程主机并修改文件名为全小写
ansible-playbook file.yml
和roles目录同级目录下执行命令:
PLAY [192.168.37.14 ********************************************************* TASK: [example | file change example] ***************************************** changed: [192.168.37.142] => (item={'dest': 'magedu.ppt', 'src': 'MAGEDU.PPT'}) changed: [192.168.37.142] => (item={'dest': 'stanley.ppt', 'src': 'STANLEY.PPT'}) PLAY RECAP ******************************************************************** 192.168.37.142 : ok=1 changed=1 unreachable=0 failed=0
没有False返回即为正常。我们回头再来理下本次的执行逻辑,如下图所示:
Ansible-playbook调用执行file.yml(和roles目录同级的file.yml文件),随后根据文件内容依次用./roles/example/tasks/main.yml、./roles/example/tasks/main.yml、./roles/example/files/{MAGEDU.PPT,STANLEY.PPT}。此过程严重依赖目录结构及命名,请勿随意更改目录及文件名
Roles的Files功能设计主要针对业务文件传输需求,凡存放于对应Role的Files目录下的文件,传输时只需指定相对路径即可,这很大程度解决了管理机故障迁移时Ansible的健壮性,同时也从规则上使使用者有意规范自己的文件存放习惯。在企业中我们不仅仅会遇到文件传输的需求,如对于应用的配置文件,针对不同的主机需要进行相应的配置变更该怎么办呢?Templates可以满足我们需求,接下来我们来深入了解Templates。