[原创]玩转Playbook必须懂的重点

 

AnsiblePlayboks拓展我们用到过的Playbook及一些功能相对简单的Playbook的组合,...



Ansible Playboks拓展

我们用到过的Playbook及一些功能相对简单的Playbook的组合,其实已经包含了日常生产环境中的很多场景。但是,当我们把视野扩展到整个系统管理的广度,还是有许许多多的Ansible功能需要学习掌握

一、Handlers

在第四章实战二: Centos下配置 LNMP 服务的案例中,我们就已经使用了Handler来实现了重启Apache的功能,该实例中,一些修改Apache配置文件的操作使用notify: restart
apache 触发了Handler,从而实现了Apche的重启

handlers:
- name: restart apache
service: name=apache2 state=restarted
tasks:
- name: Enable Apache rewrite module.
apache2_module: name=rewrite state=present
notify: restart apache
在某些情况下,你可能需要同时调用多个Handler,亦或者需要使用Handler调用其他Handler,Ansible可以很简便的实现这这些功能。

下面一个例子中,实现了一个任务同时调用多个Handler:

- name: Rebuild application configuration.
command: /opt/app/rebuild.sh
notify:
- restart apache
- restart memcached
若要实现Handler调用Handler,则直接在Handler中使用notify选项就可以了,如下代码所示:

handlers:
- name: restart apache
service: name=apache2 state=restarted
notify: restart memcached

- name: restart memcached
service: name=memcached state=restarted
在使用Handler的过程中,有以下几点需要额外注意:
  • Handler只有在其所在的任务被执行时,才会被运行;如果一个任务中定义了notify去调用Handler,但是由于条件判断等原因,该任务未被执行,那么Handler同样不会被执行
  • Handler只会在Play的末尾运行一次;如果想在一个Playbook的中间运行Handler,刚需要使用meta模块来实现,例如:
    - meta: flush_handlers
  • 如果一个Play在运行到调用Handler的语句之前失败了,那么这个Handler将不会被执行。我们可以使用mega模块的—force-handlers选项来强制执行Handler,即使是Handler所在的Play中途运行失败

二、环境变量

Ansible中设置和使用环境变量的方法多种多样。例如,如果我们想为连接远程主机的帐号设置一些环境变量,我们可以使用lineinfile模块直接修改远程用户的~/.bash_profile文件,比如下代码所示:

- name: 为远程主机上的用户指定环境变量
lineinfile: dest=~/.bash_profile regexp=^ENV_VAR= line=ENV_VAR=value
在此之后的所有任务都将可以使用这些变量。

为了再后续的任务中使用此前定义过的变量,可以使用register选项来将环境变量存储到自定义的变量中去:

1 - name: 为远程主机上的用户指定环境变量
2   lineinfile: dest=~/.bash_profile regexp=^ENV_VAR= line=ENV_VAR=value
3
4 - name: 获取刚刚指定的环境变量,并其保存到自定义变量foo中
5   shell: 'source ~/.bash_profile && echo $ENV_VAR'
6   register: foo
7
8 - name: 打印出环境变量
9   debug: msg="The variable is {{ foo.stdout }}"
我们在第4行使用了“source ~/.bash_profile”命令重读了环境变量配置文件,这样就能确保我们接下来获取的是最新生效环境变量。在某些情况下,比如所有任务都是运行在一个持久的或准高速缓存的SSH会话上面的话,如果不重读环境变量配置文件的放,那么我们所定义的新环境变量ENV_VAR可能就不会生效。

为什么要使用~/.bash_profile文件来定义环境变量?其实有很多不同的系统文件可以用来保存环境变量,比如用户家目录下的.bashrc,  .profile以及我们所用到的.bash_profile。

Linux同样也使用文件/etc/environment来读取环境变量,所以我们也可以全用如下方法来指定远程主机上面用户的环境变量:

- name: Add a global environment variable.
lineinfile: dest=/etc/environment regexp=^ENV_VAR= line=ENV_VAR=value
sudo: yes
lineinfile模块可以很方便的处理对环境变量设定量较少的情况。当我们需求大量的环境变量设定的时候,copy模块和接下来要讲的模板将会是不错的选择

关注我们


    关注 运维部落


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册