Ansible之Playbooks的when语句
在使用ansible做自动化运维的时候,大多数情况下都执行某些任务的时候都需要依赖某个变量的值或者是上一个任务的执行结果。如,根据facts信息中的系统版本相关的信息来确定使用哪种包管理器安装软件。Ansible提供when语句,可以控制任务的执行流程。
一个很简单的when语句的例子:
|
1
2
3
4
|
tasks: - name: "shutdown Debian flavored systems" command: /sbin/shutdown -t now when: ansible_os_family == "Debian |
表示当节点主机系统为Debian的时候,执行关机操作。
在符合语句中也可以使用小括号:
|
1
2
3
4
5
|
tasks: - name: "shutdown CentOS 6 and 7 systems" command: /sbin/shutdown -t now when: ansible_distribution == "CentOS" and (ansible_distribution_major_version == "6" or ansible_distribution_major_version == "7") |
在`when`语句中也可以使用过滤器。如,我们想跳过一个语句执行中的错误,但是后续的任务的执行需要由该任务是否成功执行决定:
|
1
2
3
4
5
6
7
8
9
10
|
tasks: - command: /bin/false register: result ignore_errors: True - command: /bin/something when: result|failed - command: /bin/something_else when: result|success - command: /bin/still/something_else when: result|skipped |
有时候需要将一个字符串的变量转换为整数来进行数字比较:
|
1
2
3
|
tasks: - shell: echo "only on Red Hat 6, derivatives, and later" when: ansible_os_family == "RedHat" and ansible_lsb.major_release|int >= 6 |
在playbooks和inventory中定义的变量都可以使用,如,需要根据一个变量的bool值决定是否执行该任务:
|
1
2
|
vars: epic: true |
条件语句:
|
1
2
3
|
tasks: - shell: echo "This certainly is epic!" when: epic |
或:
|
1
2
3
|
tasks: - shell: echo "This certainly isn't epic!" when: not epic |
如果引用的变量没有被定义,使用Jinja2的`defined`测试,可以跳过或者是抛出错误:
|
1
2
3
4
5
6
|
tasks: - shell: echo "I've got '{{ foo }}' and am not afraid to use it!" when: foo is defined - fail: msg="Bailing out. this play requires 'bar'" when: bar is not defined |
当`when`和`with_items`一起使用的时候,每个项都会单独被`when`语句处理:
|
1
2
3
4
|
tasks: - command: echo {{ item }} with_items: [ 0, 2, 4, 6, 8, 10 ] when: item > 5 |
示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
[root@web1 ~]# cat /etc/ansible/when.yml --- - hosts: webservers remote_user: root tasks: - command: echo {{ item }} with_items: [ 1,2,3,4,5,6,8,10] when: item > 5 [root@web1 ~]# ansible-playbook /etc/ansible/when.yml PLAY [webservers] ************************************************************* GATHERING FACTS *************************************************************** ok: [192.168.1.65] TASK: [command echo {{ item }}] *********************************************** skipping: [192.168.1.65] => (item=1) skipping: [192.168.1.65] => (item=2) skipping: [192.168.1.65] => (item=3) skipping: [192.168.1.65] => (item=4) skipping: [192.168.1.65] => (item=5) changed: [192.168.1.65] => (item=6) changed: [192.168.1.65] => (item=8) changed: [192.168.1.65] => (item=10) PLAY RECAP ******************************************************************** 192.168.1.65 : ok=2 changed=1 unreachable=0 failed=0 |
如果需要的话,也可以返回自定义的facts给控制节点。返回的自定义的facts变量也可以用作下个任务的执行条件:
|
1
2
3
4
5
|
tasks: - name: gather site specific fact data action: site_facts - command: /usr/bin/thingy when: my_custom_fact_just_retrieved_from_the_remote_system == '1234' |
在角色和包含中使用when
如果有多个任务都需要使用同一个条件语句控制。可以将这些任务打包到一个单独的任务文件中,然后使用`include`包含和`when`条件语句。条件语句只对包含任务文件起作用,对包含playbook文件不起作用。指定的条件语句会作用到所包含的每个任务上:
|
1
2
|
- include: tasks/sometasks.yml when: "'reticulating splines' in output" |
角色中使用when
|
1
2
3
|
- hosts: webservers roles: - { role: debian_stock_config, when: ansible_os_family == 'Debian' } |
注册变量
在playbook中将某个命令运行的结果保存起来,提供给后续任务使用。如,通过command模块来判断远程节点上某个文件是否存在或者通过执行某个命令的获取其返回结果,并保存起来,下个任务根据获取的变量值来决定执行的具体操作。
register关键字可以将任务执行结果保存到一个变量中,该变量可以在模板或者playbooks文件中使用:
|
1
2
3
4
5
6
7
8
9
10
|
- name: test play hosts: all tasks: - shell: cat /etc/motd register: motd_contents - shell: echo "motd contains the word hi" when: motd_contents.stdout.find('hi') != -1 |
上边中的例子中,通过注册变量访问返回的内容,`stdout`里面保存了命令的标准输出内容。注册变量还可以使用在`with_items`中,如果其保存的内容可以转换为列表,或者内容本身就是个列表。如果命令的输出本身就是列表,可以通过`stdout_lines`访问:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
- name: registered variable usage as a with_items list hosts: all tasks: - name: retrieve the list of home directories command: ls /home register: home_dirs - name: add home dirs to the backup spooler file: path=/mnt/bkspool/{{ item }} src=/home/{{ item }} state=link with_items: home_dirs.stdout_lines # same as with_items: home_dirs.stdout.split() |
示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
[root@web1 ~]# cat /etc/ansible/rewith.yml --- - hosts: webservers remote_user: root tasks: - name: list of home dir command: ls /home register: home_dirs - name: add home dirs to the backup file: path=/tmp/back/{{ item }} src=/home/{{ item }} state=link with_items: home_dirs.stdout_lines [root@web1 ~]# ansible-playbook /etc/ansible/rewith.yml PLAY [webservers] ************************************************************* GATHERING FACTS *************************************************************** ok: [192.168.1.65] TASK: [list of home dir] ****************************************************** changed: [192.168.1.65] TASK: [add home dirs to the backup] ******************************************* changed: [192.168.1.65] => (item=1.sql) changed: [192.168.1.65] => (item=1youku.sql) changed: [192.168.1.65] => (item=liuzhenwei) changed: [192.168.1.65] => (item=tom) PLAY RECAP ******************************************************************** 192.168.1.65 : ok=3 changed=2 unreachable=0 failed=0 ###远程节点 [root@db2 ~]# ll /tmp/back total 0 lrwxrwxrwx. 1 root root 11 Aug 4 14:37 1.sql -> /home/1.sql lrwxrwxrwx. 1 root root 16 Aug 4 14:37 1youku.sql -> /home/1youku.sql lrwxrwxrwx. 1 root root 16 Aug 4 14:37 liuzhenwei -> /home/liuzhenwei lrwxrwxrwx. 1 root root 9 Aug 4 14:37 tom -> /home/tom |
在ansible中when语句的使用还是比较多的,它可以用来控制playbooks中任务的执行流程。类似于程序中的条件语句一样,使得ansible可以更好的按照运维人员的意愿来对远程节点执行特定的操作。
Ansible之Playbooks的when语句的更多相关文章
- ansible基础-playbooks
1. playbooks介绍 如果说ansible的modules是工具,inventory配置文件是原材料,那么playbook就是一封说明书,这里会记录任务是如何如何执行的,当然如果你愿意,这里也 ...
- ansible 五 playbooks剧本使用
一.Playbook 简介 Playbooks与Ad-Hoc相比,是一种完全不同的运用Ansible的方式,而且是非常之强大的:也是系统ansible命令的集合,其利用yaml语言编写,运行过程,an ...
- Ansible Playbook 使用条件判断语句
先介绍一下 gather_facts 参数,该参数用于指定在执行任务前,是否先执行 setup 模块获取主机相关信息,以便给后面的任务使用 [root@localhost ~]# ansible 19 ...
- 使用ansible批量管理远程服务器
使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器: 2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全 ...
- Install Ansible on Mac OSX
from: https://devopsu.com/guides/ansible-mac-osx.html and : https://devopsu.com/guides/ansible-post- ...
- ansible 自动化(3)
批量执行playbooks 远程批量命令执行的另外一种方式是用playbooks:这里是playbooks的官方文档:http://docs.ansible.com/playbooks.html这里有 ...
- Ansible安装配置
Ansible工具的安装与配置 Ansible基于SSH,不需要在远程端安装任何软件,只需要在管理端安装ansible及其组件即可. Ansible使用前提是已配置ssh密钥免登陆. 一.安装组件: ...
- ansible基础-理解篇
1. 介绍 要说现在的部署工具,ansible可以说家喻户晓了. ansible是一个开源软件,用于软件供应.配置管理.应用部署.ansible可以通过SSH.remote PowerShell.其他 ...
- 自动化运维之ansible
第三十九课 自动化运维之ansible 目录 十五. ansible介绍 十六. ansible安装 十七. ansible远程执行命令 十八. ansible拷贝文件或目录 十九. ansible远 ...
随机推荐
- Matplotlib -多组线用不同的线性、颜色、节点绘制
先来看看我们要实现的效果图吧: 先来看看Matplotlib的plot函数原型 plt.plot(x, y, color='r', maker='o', linestyle='-', linewidt ...
- webpack打包图片资源找不到问题
当我们进行前端打包时,需改成如下配置: 往常这样打包是没有问题的,可是今天进行项目打包的时候缺报图片找不到的错误,如图所示: 头部组件的图片资源找不到错误,后台发现因为头部组件的背景图片size过大, ...
- 面试题48:用C++设计一个不能被继承的类
解法一:把构造函数设为私有 将构造函数定义为私有,然后通过定义公有的静态函数来创建和释放类的实例. { public: static SealedClass1* GetInstance() { ret ...
- react-webpack(二)
const path = require('path'); const webpack = require('webpack'); const HtmlWebpackPlugin = require( ...
- C#模拟网络POST请求
using System; using System.IO; using System.Net; using System.Text; using System.Collections.Generic ...
- [Scala]Scala学习笔记三 Map与Tuple
1. 构造映射 可以使用如下命令构造一个映射: scala> val scores = Map("Alice" -> 90, "Kim" -> ...
- CSS3盒模型display:box简述
display:box;box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典的一个布局应用就是布局的垂直等高.水平均分.按比例划分. box-f ...
- Android使用Http协议访问网络——HttpConnection
套路篇 使用HttpConnection访问网络一般有如下的套路: 1.获取到HttpConnection的实例,new出一个URL对象,并传入目标的网址,然后调用一下openConnection() ...
- uboot Makefile 文件源码分析
Makefile 是一个神奇的文件 详情参考uboot配置和编译过程详解
- 如何快速上手.net下单元测试工具NUnit?
NUnit基本使用 准备知识: 读此博文需要了解单元测试基本概念及NUnit的的安装. 传送门:单元测试之道(使用NUnit) 1.常见的错误 当学习一个新东西时,先学习错误,是最快的方式. 1.1 ...