内部变量指的是把变量定义在playbook里面或者是执行结果作为变量

循环语句-标准Loops

[root@LeoDevops playb]# cat p_loop.yaml
- hosts: u12
gather_facts: False
tasks:
- name: debug loops
debug: msg="name -------> {{ item }}"
with_items:
- one
- two

运行结果如下:

[root@LeoDevops playb]# ansible-playbook p_loop.yaml 

PLAY [u12] ************************************************************************************************************************************************************************************

TASK [debug loops] ****************************************************************************************************************************************************************************
ok: [192.168.93.137] => (item=one) => {
"changed": false,
"item": "one",
"msg": "name -------> one"
}
ok: [192.168.93.137] => (item=two) => {
"changed": false,
"item": "two",
"msg": "name -------> two"
} PLAY RECAP ************************************************************************************************************************************************************************************
192.168.93.137 : ok=1 changed=0 unreachable=0 failed=0

当然也支持字典格式的数据对于要循环的内容

[root@LeoDevops playb]# cat  p_loop.yaml
- hosts: u12
gather_facts: False
tasks:
- name: debug loops
debug: msg="key--> {{ item.key }} value ---> {{ item.value }}"
with_items:
- {"key":"name","value":"one"}
- {"key":"name","value":"two"}
- {"key":"name","value":"three"}
- {"key":"name","value":"four"}

嵌套循环loop

[root@LeoDevops playb]# cat p_iframe_loop.yaml
- hosts: u12
gather_facts: False
tasks:
- name: debug loops
debug: msg="name --> {{ item[0] }} value ---> {{ item[1] }}"
with_nested:
- [1]
- ['a','b','c']

执行效果如下:

[root@LeoDevops playb]# ansible-playbook p_iframe_loop.yaml 

PLAY [u12] ************************************************************************************************************************************************************************************

TASK [debug loops] ****************************************************************************************************************************************************************************
ok: [192.168.93.137] => (item=[1, u'a']) => {
"changed": false,
"item": [
1,
"a"
],
"msg": "name --> 1 value ---> a"
}
ok: [192.168.93.137] => (item=[1, u'b']) => {
"changed": false,
"item": [
1,
"b"
],
"msg": "name --> 1 value ---> b"
}
ok: [192.168.93.137] => (item=[1, u'c']) => {
"changed": false,
"item": [
1,
"c"
],
"msg": "name --> 1 value ---> c"
} PLAY RECAP ************************************************************************************************************************************************************************************
192.168.93.137 : ok=1 changed=0 unreachable=0 failed=0

散列loops

散列loops比标准的loops就是变量支持更丰富的数据结构,比如标准的loops的最外层数据必须是Python 的List数据类型,而散列loops直接支持YAML格式的数据变量。例如下面的简单例子:

[root@LeoDevops playb]# cat p-sanlieloop.yaml
- hosts: u12
gather_facts: False
vars:
users:
yq:
name: yq
shell: bash
ljf:
name: ljf
shell: bash
tasks:
- name: test for sanlie loop
debug: msg="name --> {{ item.key }} value --> {{ item.value.name }} shell ---> {{ item.value.shell }}"
with_dict: users

文件匹配loops

针对一个目录下制定格式的文件进行处理,这个时候直接使用with_fileglob循环去匹配我们需要处理的文件即可。

[root@LeoDevops playb]# cat  p-fileloop.yaml
- hosts: u12
gather_facts: False
tasks:
- name: debug file loop
debug: msg="files ---> {{ item }}"
with_fileglob:
- /tmp/playb/*.yaml

随机选择loops

随机数

[root@LeoDevops playb]# cat p-randomloop.yaml
- hosts: u12
gather_facts: False
tasks:
- name: debug loops
debug: msg="name -->> {{ item }}"
with_random_choice:
- "a1"
- "a2"
- "a3"
- "a4"

条件判断loops

有时候task执行一个task后,我们需要检测这个task的结果是否达到了预想状态,如果没有达到我们预想的状态,那么就需要退出整个playbook执行,那么这个时候我们就需要对某个task结果一直循环检测了。

[root@LeoDevops playb]# cat p-conditionloop.yaml
- hosts: u12
tasks:
- name: debug loop
shell: hostname
register: pwd
until: pwd.stdout.startswith("LeoTestMachine") # stdout与stdout_lines是不一样的,这个要注意哦
retries: 3 # 重复3次
delay: 2 # 间隔2秒

文件优先匹配

[root@LeoDevops playb]# cat p-filefilter.yaml
- hosts: u12
gather_facts: True
tasks:
- name: debug codes
debug: msg="files --->{{ item }}"
with_first_found:
- "{{ ansible_distribution }}.yaml"
- "default.yaml"

register Loops

register不但用于task直接互相传递数据,也可以吧register用在单一的task中进行变量临时存储,并且可以接受多个task结果当做变量临时存储。

[root@LeoDevops playb]# cat register_loops.yaml
- hosts: u12
gather_facts: True
tasks:
- name: debug loops
shell: "{{ item }}"
with_items:
- hostname
- uname
register: ret
- name: display loops
debug: msg="{% for i in ret.results %}--->{{ i.stdout }}{% endfor %}"

执行多个task并且register给一个变量时,它的数据就和平常的不一样了,就需要使用jinja2语法显示出来

2. ansible-playbook 条件语句-内部变量使用的更多相关文章

  1. Ansible的条件语句

    此篇主要讲述的ansible的condition,主要是用条件进行一些判断,此篇为官方文档的翻译,没有进行相关的测试,后续会写入相关的测试. Ansible的条件语句 1.    前言 在有的时候pl ...

  2. ansible之条件语句when

    注册变量: 变量的另一个用途是将一条命令的运行结果保存到变量中,供后面的playbook使用.例如: - hosts: webservers tasks: - shell: /usr/bin/foo ...

  3. ansible 之条件语句 when

    注册变量: 变量的另一个用途是将一条命令的运行结果保存到变量中,供后面的playbook使用.例如: - hosts: webservers tasks: - shell: /usr/bin/foo ...

  4. Ansible14:Playbook条件语句

    目录 简介 when关键字 1. when基本使用 2. 比较运算符 3. 逻辑运算符 条件判断与tests 判断变量 判断执行结果 判断路径 判断字符串 判断整除 其他tests 条件判断与bloc ...

  5. 3 ansible-playbook 条件语句-外部变量使用

    外部变量指的是从playbook文件之外获取的数值 lookups file file是我们经常使用的一种lookups的方式,它的原理就是使用python的codecs.open打开文件然后把结果返 ...

  6. Ansible Playbook handlers 语句

    handlers 用法如下,表示当 tasks 执行成功之后再执行 handlers,相当于 shell 中的 && 用法,如果 tasks 执行失败是不会执行 handlers 语句 ...

  7. ansible playbook详解

    ansible playbook是由yml语法书写,结构清晰,可读性强,所以必须掌握yml基础语法 语法 描述 缩进 YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成,不能使用tabs键 ...

  8. Linux就该这么学--Shell脚本条件语句(二)

    1.for条件语句 先读取多个不同的变量值,然后逐一执行同一组命令. 从列表文件中读取主机地址,逐个测试是否在线. 从ipadds.txt中读取主机地址后赋值给HLIST变量后逐个ping列表中的主机 ...

  9. Azure Terraform(十)利用 Azure DevOps 的条件语句选择发布环境

    一,引言 之前我讲过的所有的案例中,都是将整个Azure Resource 部署到同一个订阅下,没有做到灵活的在 Azure Pipeline 在运行前选择需要部署的环境.在实际的项目开发中,我们也会 ...

随机推荐

  1. 移动端页面:viewport与分辨率的坑

    <meta name="viewport" content="width=device-width, user-scalable=no"> < ...

  2. JAVA笔记--static

    1.static 修饰变量 public class MyClass { static int i = 4; } 其中static 修饰变量,表示变量 i 属于 MyClass 类,所有的对象共享一个 ...

  3. C++程序设计方法3:强制类型转换

    强制类型转换(显示转换) dynamic_cast<Dst_Type>(Src_var) Src_var必须是引用或者指针类型,Dst_Type类中含有虚函数,否则会有编译错误: 若目标类 ...

  4. Java基础知识总结--final、finally、finalize的区别

    谈谈final.finally.finalize的区别 1.final修饰符:如果一个类被声明为final,意味着这个类不能再被派生出新的子类,不能作为父类被别的类继承.因此,一个类不能即被声明为ab ...

  5. Codeforces Round #447 (Div. 2) 题解 【ABCDE】

    BC都被hack的人生,痛苦. 下面是题解的表演时间: A. QAQ "QAQ" is a word to denote an expression of crying. Imag ...

  6. python gui 之 tkinter库

    http://blog.csdn.net/jcodeer?viewmode=contents http://tieba.baidu.com/p/3082739560 http://blog.sina. ...

  7. javascript——10章 DOM

    1.节点关系 (1)childNodes:返回节点的子节点集合 返回值:NodeList 对象,表示节点集合. 注:childNodes只能取到子级,不能取到子级的子级. childNodes所有节点 ...

  8. .net core中的对象池

    asp.net core中通过扩展库的方式提供给了一个标准的对象池ObjectPool,定义在Microsoft.Extensions.ObjectPool.dll 程序集中.它本身是个纯虚的抽象类, ...

  9. Springboot 之 多配置文件

    六.Springboot 之 多配置文件   说明:在程序开发过程中可能会有这样的需求:开发和部署的配置信息可能会不同,以传统的方式就是在配置文件里面写好配置,在部署的时候再去修改这些配置,这样肯定会 ...

  10. wordclock中文模式快一个小时怎么调整

    wordclock屏幕保护,设置为中文模式,显示的时间比系统时间要快一个小时,其实软件自带的配置文件可以设置调整到正常时间……   工具/原料   wordclock 方法/步骤     桌面上右键菜 ...