Ansible(8)——循环与条件任务

发布于:2025-04-14 ⋅ 阅读:(26) ⋅ 点赞:(0)

目录

一、循环迭代任务:

1、简单循环:

2、循环字典列表:

3、Ansible 2.5 之前的循环关键字:

4、在循环中使用 register 变量:

二、条件任务:

1、使用条件句的常见场景:

2、条件任务语法:

(1)when 语句:

(2)常见条件运算:

3、测试多个条件:

三、组合使用循环与条件任务:


一、循环迭代任务:

        使用循环使得管理员不必编写使用同一模块的多个任务。Ansible 支持使用 loop 关键字在一组项目上迭代任务

1、简单循环:

        一个简单循环一个项目( items )列表上迭代一个任务。task 中添加 loop 关键字,并将 items 列表进行迭代,其中循环变量 item 保存每次迭代期间使用的值。

        此外,loop 列表也可以使用变量表示。例如,下图中的 mail_services 变量包含了需运行服务的列表。

注:有关变量的内容在 Ansible(6)——管理变量中有详细说明,转跳链接如下:https://blog.csdn.net/m0_68756914/article/details/147026308

2、循环字典列表:

        循环列表不一定是简单值列表

        以下图中内容为例,当列表的每个项是字典时,任务的结果是 jane 用户存在且为组 wheel 的成员,joe 用户也存在且为组 root 的成员。

注:上图中的每个字典均有两个键: name 与 groups ,这两个键的值可以分别通过 item['name'] 与 item['groups'] 变量进行检索。

3、Ansible 2.5 之前的循环关键字:

        在 Ansible 2.5 之前,playbook 使用前缀为 with_ 的不同 loop 关键字,这可能在将来的某个时间节点被取消。

注:Ansible 2.5 以前的任何表示方法,均可以用 loop 替代

 循环关键字     描述
with_items

 其行为与简单列表的 loop 关键字相同,但其提供的列表将被扁平化为单极列表

(注:item 循环变量会保存每次迭代过程中使用的列表项)

with_file

 需要控制节点文件名列表

(注:item 循环变量会在每次迭代过程中保存文件列表内相应文件的内容)

with_sequence

 需要参数以根据数字序列生成值列表

(注:item 循环变量在每次迭代过程中都会保留生成序列中某个生成项的值)

4、在循环中使用 register 变量:

        register 关键字可用于输出循环任务结果

二、条件任务:

        Ansible 可以利用条件语句在符合特定条件时执行任务,管理员可利用条件语句来区分不同的受管主机,并根据它们所符合的条件来分配功能角色 。此外,Playbook 变量、注册的变量和 Ansible 事实也都可通过条件语句来进行测试,可以使用字符串比较、数学运算符和布尔运算等各种运算符。

1、使用条件语句的常见场景:

(1)在变量中定义硬限制(如 min_memory )并将它受管主机上的可用内存进行比较

(2)Ansible 捕获命令输出,以确定某一任务在执行进一步操作前是否已经完成。例如,若某一程序运行失败,则需要跳过批处理;

(3)利用 Ansible 事实来确定受管主机的网络配置,并且决定要发送的模板文件(例如,网络绑定或中继等);

(4)评估 CPU 数量,来确定如何调节某一 Web 服务器;

(5)将注册的变量与定义的变量进行比较,以检查服务的变化。例如,可以以此来验证文件的 MD5 。

2、条件任务语法:

(1)when 语句:

        when 语句可用于有条件的运行任务,将以要测试的条件作为值,若条件满足则运行任务,若条件不满足则跳过该任务。

注:1)最简单的条件判断是布尔变量 true / false 、True / False 、yes / no 、1 / 0 ;

       2)when 表达式不属于模块,因此必须放在模块外部;

       3)从 Ansible Core 2.12 起,when 条件语句会始终将字符串视为 true 布尔值。

(2)常见条件运算:

     运算      示例
  等于(值为字符串)   ansible_facts['machine'] == "x86_64"
  等于(值为数字)   max_memory == 512
  小于   max_memory < 512
  大于   max_memory > 512
  小于等于   max_memory <= 512
  大于等于   max_memory >= 512
  不等于   max_memory != 512
  变量存在   min_memory is defined
  变量不存在   min_memory is not defined
  布尔值为 true( 1 、True 、yes 、true )   memory_available
  布尔值为 false( 0 、False 、no 、false )   not memory_available
  第一个变量值存在,且作为第二个变量列表中的值   ansible_facts['distribution'] in supported_distros

3、测试多个条件:

        一个 when 语句可用于评估多个值,用户可以通过使用 and or 关键字组合条件,或使用括号分组条件。

(1)任意条件为真时满足条件语句,使用 or 关键字(上图红色方框处);

(2)若两个条件都必须为真才满足条件语句,则使用 and 关键字(上图黄色方框处)。

注:除上图示例中的表示方法外,使用 and 关键字组合多个条件语句的另一表示方法如下图:

(3)使用括号可以对条件进行分组,以表达更复杂的条件语句(上图蓝色方框处);

三、组合使用循环与条件任务:

        循环与条件任务可以组合使用,组合使用 when 和 loop 时,when 语句将对每一个项目都进行处理

        上图中的 ansible.builtin.dnf 模块在满足根目录( / )上挂载的文件系统超过 300000 时,安装 mariadb-server 软件包。其中 ansible_facts['mounts'] 事实是一组字典,各代表一个已挂载文件系统的相关事实。上述命令执行时将循环迭代列表中的每一个字典,直到找到两个条件都为真的已挂载文件系统的字典时,才满足条件语句。

注:有关事实的内容在 Ansible(7)——管理机密与事实中有详细说明,转跳链接如下:https://blog.csdn.net/m0_68756914/article/details/147076080


网站公告

今日签到

点亮在社区的每一天
去签到