首页 > 其他分享 >ansible 流程控制

ansible 流程控制

时间:2024-08-18 21:07:00浏览次数:10  
标签:控制 流程 when ansible Jinja2 facts foo Debian

目录

ansible if流程控制

大部分的Ansible任务,需要对用户的输入内容或任务的运行结果进行判断,这中间体现了流程控制的作用
像ansible的模板文件,以.j2结尾的都是Jinja2文件类型,可以使用Jinj2语法

Ansible在配置 模板文件 和进行 条件判断 时都会用到Jinja2语法

Jinja2语法官网
Jinja2是一套模板引擎,用于python与HTML页面关联,提供变量,控制结构,过滤器

变量

{{ }}表示变量,变量定义与python相同

<!-- 输出字符串 -->  
<p>{{ greeting }}</p>
<!-- 输出列表 -->  
<ul>  
{% for item in items %}  
  <li>{{ item }}</li>  
{% endfor %}  
</ul>  
<!-- 输出字典 -->  
<p>Name: {{ user.name }}, Age: {{ user.age }}</p>

控制结构

判断语句

<p>  
{% if condition %}  
  This is true.  
{% elif another_condition %}  
  This is another condition.  
{% else %}  
  This is false.  
{% endif %}  
</p>

Jinja2支持for循环,用于迭代列表,元组,字典
循环语句

<ul>  
{% for item in items %}  
  <li>{{ item }}</li>  
{% endfor %}  
</ul>  
<!-- 迭代字典 -->  
<dl>  
{% for key, value in my_dict.items() %}  
  <dt>{{ key }}</dt>  
  <dd>{{ value }}</dd>  
{% endfor %}  
</dl>

过滤器

过滤器通过管道符 |,实现对变量的格式化或转换

常用过滤器

  • safe:渲染时值不转义。
  • capitalize:把值的首字母转换成大写,其他字母转换为小写。
  • lower:把值转换成小写形式。
  • upper:把值转换成大写形式。
  • title:把值中每个单词的首字母都转换成大写。
  • trim:把值的首尾空格去掉。
  • striptags:渲染之前把值中所有的HTML标签都删掉。
  • join:拼接多个值为字符串。
  • replace:替换字符串的值。
  • round:默认对数字进行四舍五入,也可以用参数进行控制。
  • int:把值转换成整型。
<!-- 应用upper过滤器 -->  
<p>{{ text|upper }}</p>  
<!-- 链式调用过滤器 -->  
<p>{{ "hello world" | replace('world','daxin') | upper }}</p>

注释

{# 这是一个注释,不会在最终页面显示 #}

Jinja2 api示例

此示例不是Jinja2模板,而是python代码

通过Template类创建实例,得到模板对象,调用对象的render方法填充变量名,实现模板替换
from jinja2 import Template            

template = Template('hello {{ name }}')

template.render(name='world')           
# 输出结果
'hello world'

下列表达式的运算结果都为'true':

1 in [1, 2, 3]

'see' in 'Can you see me?'

foo='foo'
bar='bar'

foo != bar

(1 < 2) and ('a' not in 'best')

# 下列表达式的运算结果都为'false':

4 in [1, 2, 3]

foo == bar
a=2
(foo != foo) or (a in [1, 2, 3])

test 语句

python-test.py

from jinja2 import Template

# 定义模板字符串
template_str = """
{# 这里用于检查foo 是否定义,这也可以写在*.j2文件中,用于模板文件  #}
{% if foo is defined %}
foo is defined and its value is: {{ foo }}
{% else %}
foo is not defined
{% endif %}

{% if bar is undefined %}
bar is defined and its value is: {{ bar }}
{% else %}
bar is not defined
{% endif %}

{% if foo is equalto "Hello, Jinja2!" %}
foo is defined and its value is: {{ foo }}
{% else %}
foo is not defined
{% endif %}

{% if 10 is even %}
10 is : {{ even }}
{% else %}
10 is not even
{% endif %}

tmp_list=[]
{% if tmp_list is iterable %}
tmp_list is : iterable
{% else %}
tmp_list is not iterable
{% endif %}

"""

# 创建一个 Jinja2 模板对象
template = Template(template_str)

# 渲染模板,提供上下文数据
output = template.render(foo="Hello, Jinja2!")  # 这里定义了变量 foo

# 输出结果
print(output)
  • defined相反(判断是否定义)

  • undefined(判断是否未定义)

  • equalto(与==等效)

  • even(判断对象是否是偶数)

  • iterable(判断对象是否可迭代)

ansible when流程控制

when 语句用于在任务中添加条件判断.只有当 when 条件为 True 时,任务才会被执行

简单示例

when 语句通常用于控制任务的执行逻辑,帮助你根据不同的变量值或条件动态地执行特定的任务

---
  - hosts: ubuntu
    tasks:
    - name: Install Apache on Debian-based systems
      apt:
        name: apache2
        state: present
      when: ansible_facts['os_family'] == "Debian"

只有在目标主机的操作系统家族 os_familyDebian 时,任务才会执行

多条件示例

你可以使用 andor 逻辑运算符组合多个条件

---
  - hosts: ubuntu
    tasks:
     - name: Install Apache if on Debian and not on Ubuntu
       debug:
         msg: "os_family is Debian and distribution is not ubuntu"
       when: (ansible_facts['os_family'] == "Debian") and (ansible_facts['distribution'] != "Ubuntu")

操作系统家族为 Debian 且发行版不是 Ubuntu 时执行
以下语句与上面效果相同


- name: 条件1 and 条件2 
  when: (ansible_facts['os_family'] == "Debian") and (ansible_facts['distribution'] != "Ubuntu")

#这种条件更加清晰易读
- name: 条件1 and 条件2
  when: 
    - ansible_facts['os_family'] == "Debian"
    - ansible_facts['distribution'] != "Ubuntu"

#使用not关键字
- name: 条件1 and 条件2 
  when: (ansible_facts['os_family'] == "Debian") and not (ansible_facts['distribution'] == "Ubuntu")

#使用了Jinja2的lower过滤器来确保分发版的名称是小写的,这样可以提高条件的健壮性,防止因为大小写不匹配而导致条件判断失败
- name: 条件1 and 条件2 
  when: ansible_facts['os_family'] == "Debian" and ansible_facts['distribution'] | lower != "ubuntu"

标签:控制,流程,when,ansible,Jinja2,facts,foo,Debian
From: https://www.cnblogs.com/anyux/p/18366084

相关文章

  • Android usb广播 ACTION_USB_DEVICE_ATTACHED流程源码分析
    整体流程图大概意思就是UsbHostManager启动监控线程,monitorUsbHostBus会调用usb_host_run函数(使用inotify来监听USB设备的插拔)不停的读取bus总线,读取到以后,当1、设备插入:发送广播ACTION_USB_DEVICE_ATTACHED2、设备拔出:发送广播ACTION_USB_DEVICE_DETACHED本篇只分析插入......
  • 【PID控制】针对扭转系列弹性驱动器的力矩控制策略基准测试研究(Matlab代码实现)
      ......
  • 无刷直流电机(永磁同步电机)的矢量控制设计 (PMSM)(Simulink仿真实现)
    ......
  • unity中的问题记录(角色的控制)
    unity中的默认访问修饰符与c#相同,class不写public,则默认同一程序集(internal)中可以访问,在unity中,程序集表现为项目,即同一项目可以互相访问类里的成员默认与c#同样相同,都是private在C#中,将字段和方法都设为私有(private)并使用static修饰符并不是“多此一举”,而是根据具体的设......
  • RabbitMQ集群 - 仲裁队列、Raft协议(最详细的选举流程)
    文章目录仲裁队列概述Raft协议概述基本概念选举流程(重点)消息复制仲裁队列的使用MQ管理平台SpringAMQP仲裁队列概述1)RabbitMQ普通队列在一个节点宕机之后,其他节点无法读写宕机节点的队列,为了解决这个问题,引入了仲裁队列.2)仲裁队列通过Raft协议,实现了不同......
  • C++可控制线程
    大家好,本人是C++新人qing。我学习编程也快十年了,这一年来我用C++写了一些程序,有了一些新奇的想法。我写了一些诸如“C语言存储变长字符串”、“C++可控制线程对象”、“TCP通信接收任意长度字符串”的代码。这些都是我的拙作,希望能够分享给大家,主要是新人可以练练手,有意见也......
  • 鼠标键盘控制c++
     感觉鼠标控制挺好玩的 要想完成鼠标的一系列控制,首先你需要一个头文件:#include<windows.h> 以下是鼠标单击左键的代码,可以做成子程序(我是背下来的):mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//按下左键Sleep(10);//要给一些应用反应时间mouse_event(MOUSEEVENTF_L......
  • CSS的:indeterminate伪类:精妙控制不确定状态的样式
    CSS的:indeterminate伪类是一个强大但较少为人所知的工具,它允许开发者选择那些处于不确定状态的元素,如未选中但也不完全未勾选的复选框(checkbox)。这种状态在某些表单元素中非常有用,比如在表示部分选中的选项或不确定的设置时。本文将详细介绍:indeterminate伪类的使用,以及如......
  • 【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】019 - RK3568 Uboot 完整流程梳理
    【OpenHarmony4.1之U-Boot2024.07源码深度解析】019-RK3568Uboot完整流程梳理一、系统环境初始化:_start入口地址,初始化CPU环境二、系统环境初始化:_main入口,初始化堆栈,初始化gd全局环境变量,初始化CRuntime运行环境,开始执行board_init_f函数三、board_......
  • Linux ACL 访问控制
    今天给伙伴们分享一下LinuxACL访问控制,希望看了有所收获。我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步!如果伙伴们看了文档觉得有用,欢迎大家关注我的公众号,获取相......