内部变量指的是把变量定义在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. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第5章编程练习1

    #include <iostream>using namespace std;int main(){ int min,max; cout<<"Enter the mi ...

  2. svn提交后 添加注释

    svn 提交后添加注释 第一步: 第二步: 第三步:提交就可以了. 注意:如果svn服务器管理员没有激活pre-revprop-change这个hook,会出现 需要让svn服务器管理员没有激活pre ...

  3. 变量安全过滤,防止xss攻击

    下面这个方法不管是字符串还是数组,都可以进行过滤 /** * @purpose : 对变量进行安全过滤,使 $_GET.$_POST.$q->record 等变量更安全 * @author : ...

  4. 3ds max学习笔记(十六)-- 摄像机

    摄像机添加以及应用技巧:可以更改观察的视点和空间广阔,模拟景深和运动模糊效果: 1,添加:更改观察的角度和位置,增加场景透视感: 基本操作: 景深:

  5. Ubuntu1404 开启定时任务 crontab

    crontab -e 这个 我使用vim编辑,所以选择3,进入到 写了两条,的确隔了一分钟在test.txt文件夹里面会多加一条Good morning进去.而且也会执行dingshi.sh这个she ...

  6. HTML常用标签2

    1 <!DOCTYPE>标签 声明位于文档最前面的位置,处于<html>标签之前.告知浏览器文档使用哪种规范 模式: 1. BackCompat:怪异模式,浏览器使用自己的怪异 ...

  7. 前端工程化系列[06]-Yeoman脚手架核心机制

    在前端工程化系列[05] Yeoman脚手架使用入门这边文章中,对Yeoman的使用做了简单的入门介绍,这篇文章我们将接着探讨Yeoman这个脚手架工具内部的核心机制,主要包括以下内容 ❏ Yeoma ...

  8. 前端工程化系列[03]-Grunt构建工具的运转机制

    在前端工程化系列[02]-Grunt构建工具的基本使用这篇文章中,已经对Grunt做了简单的介绍,此外,我们还知道了该如何来安装Grunt环境,以及使用一些常见的插件了,这篇文章主要介绍Grunt的核 ...

  9. Python计算分位数

    Python计算分位数    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/gdkyxy2013/article/details/80911514 ...

  10. vue-cli配置多入口多出口,实现一个项目两个访问地址,区分不同上线环境

    最近工作中需要把项目分割成两块,一块需要跑在微信中,通过微信jdk获取用户资料默认登录,一部分需要给原生app做webview的内嵌页面,当然这部分内容是不跑在微信中的. 所以我想到了把项目分成两部分 ...