Linux Ansible任务控制(循环判断、处理程序、失败任务)

news2024/11/22 9:03:53

目录

Ansible的Loop循环

简单的Loop循环

数组列表方式的Loop循环

字典方式的Loop循环

基于外部变量的Loop循环

Ansible的When判断

通过魔法变量、事实变量作为条件

通过剧本执行结果的变量来作为条件

Ansible处理程序

Ansible处理失败任务

处理失败任务ignore_errors

强制执行失败的任务对应的处理程序force_handlers

指定任务失败的条件failed_when

通过Ansible块block处理错误任务


Ansible的Loop循环

在playbook中使用循环语句,可以批量的执行任务(例如批量创建用户、批量安装应用等)

在loop关键字中定义要循环的元素列表,然后通过固定变量名为item来依次提取loop中的元素列表

简单的Loop循环

创建用户admin1和admin2

---
- name: create users with loop
  hosts: web
  tasks:
    - name: create user
      user:
        name: "{{ item }}"    
      loop:
        - admin1
        - admin2

数组列表方式的Loop循环

创建普通用户admin1,系统用户admin2

---
- name: create users with loop
  hosts: web
  tasks:
    - name: create user
      user:
        name: "{{ item.user }}"
        group: "{{ item.shell }}"
      loop:
        - user: admin1
          shell: /bin/bash
        - user: admin2
          shell: /sbin/nologin

字典方式的Loop循环

创建普通用户admin1,系统用户admin2

---
- name: create users with loop
  hosts: web
  tasks:
    - name: create user
      user:
        name: "{{ item.name }}"
        shell: "{{ item.shell }}"
      loop:
        - { name: "admin1" , shell: "/bin/bash" }                                       
        - { name: "admin2" , shell: "/sbin/nologin" }     

基于外部变量的Loop循环

创建普通用户admin1,系统用户admin2

定义变量文件
vim user.yml
users:
  - name: admin1
    shell: /bin/bash
  - name: admin2
shell: /sbin/nologin

定义剧本
vim create_user.yml
---
- name: create users with loop
  hosts: web
  vars_files:
    - user.yml
  tasks:
    - name: create user
      user:
        name: "{{ item.name }}"
        shell: "{{ item.shell }}"
        state: present
      loop: "{{ user }}"

Ansible的When判断

可以通过when关键字来定义判断语句,只有这个判断语句成功了才会执行此模块任务,不满足条件就不执行

When判断语句格式

when: 跟上判断表达式

比较运算符

==         两边是否相等

!=           两边是否不相等

:             比较大小,左边的值大于右边的值为真

<            比较大小,左边的值小于右边的值为真

=            比较大小,左边的值大于等于右边的值为真

<=         比较大小,左边的值小于等于右边的值为真

逻辑运算符

and        逻辑与;都满足才成功

or          逻辑或;只要有一个条件满足,就成功

not         逻辑否;对表达式进行取反

()            将其多个表达式组合到一起(组合内的所有表达式要同时满足)

通过魔法变量、事实变量作为条件

如果主机属于资产清单中web主机组中的主机,则安装httpd(invenrtory_hostname为魔法变量)

---
- name: yum 
  hosts: all
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: latest
      when: inventory_hostname in groups.web

如果主机存在IPv4地址,则安装httpd(ansible_facts为事实变量)

---
- name: yum 
  hosts: all
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: latest
      when: ansible_facts['default_ipv4']['address'] is defined

通过剧本执行结果的变量来作为条件

以rc变量举例子

当通过剧本安装软件包时,执行结果中会有rc变量,rc变量有0和1两种值

如果rc=0,表示此安装包已经存在或之前不存在但是安装成功

如果rc=1,表示此安装包不存在,安装失败

可以通过register关键字来将执行结果定义到某个变量中,然后再提取出此变量中rc变量对应的值来作为判断条件(也可以通过debug模块将执行结果显示出来)

安装httpd,并显示执行结果;如果主机上已经存在httpd,则删除httpd

---
- name: install
  hosts: all
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: present
      register: result

    - name: debug
      debug:
        var: result

    - name: renove httpd
      yum:
        name: httpd
        state: absent
      when: result.rc == 0


Ansible处理程序

Ansible处理程序是指响应其他任务而触发的任务,触发的任务就为处理程序

只有当响应任务在被管理节点执行并生效后(执行结果为黄色),才会触发处理程序;并且处理程序是在playbook中所有任务完成后才会运行

handlers元素

handlers元素属于和tasks同级的列表,作用是定义处理程序

等待tasks中任务执行的结果为changed(黄色)时触发notify,然后调用handlers下的此notify所对应的任务

notify元素

notify元素作为handlers的触发器,在tasks中的某段代码中定义,与模块并列

实例

当httpd和phpinfo安装成功后,开启httpd和phpinfo服务

---
- name: httpd
  hosts: web
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: present
      notify:
        - start httpd
  handlers:
    - name: start httpd
      service:
        name: httpd
        state: started     

注意事项

handler执行的顺序只与playbook定义的顺序有关,与handler配置的notify的顺序无关

handlers中的- name的名字需要与notify定义的名字一致

处理程序只有在使用notify语句调用时才会被触发

处理程序是在playbook的正常任务全部执行结束后才会被执行

handler里面的任务只会执行依次,即使handler中的一个任务被通知了多次


Ansible处理失败任务

处理失败任务ignore_errors

当ansibke任务执行失败时,就会中止playbook的执行,并跳过所有后续任务

当有时希望即使在任务失败时,忽略此处的错误,继续执行后续任务,此时就需要配置ignore_error:yes来实现(ignore_error元素与模块并列)

注意事项

并不是所有的错误都可以忽略,只有当任务的执行成功或失败对后面的任务没有关联的时候才可以忽略

实例

当php安装失败后继续执行mariadb的安装

---
  - name: install
    hosts: server
    tasks:
          - name: install php
            yum:
              name: php
              state: present
            ignore_errors: yes

          - name: isntall mariadb
            yum:
              name: mariadb
              tate: present
            ignore_errors: yes

强制执行失败的任务对应的处理程序force_handlers

如果在主机上的执行的任务失败时,则此任务对应的处理程序不再运行

此时可以通过force_handlers: yes实现,即使notify对应的响应任务执行失败,仍继续执行noftify对应的处理程序(即使任务失败了也要调用notify触发handlers)

force_handlers与tasks同层级

实例

---
- name: httpd
  hosts: web
  force_handlers: yes
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: present
      notify:
        - start httpd
  handlers:
    - name: start httpd
      service:
        name: httpd
        state: started

指定任务失败的条件failed_when

通过failed_when来指定任务失败的条件;即人为指定此任务失败的条件,将正常的任务转为失败的任务(如果满足failed_when定义的条件,则就判断此任务执行失败)

注意

任务执行失败不一定就是任务存在错误(也有可能是人为制造的)

实例

如果主机属于ftp组,则显示bug模块的内容,然后中止任务

---
- name: httpd
  hosts: all
  tasks:
    - name: deubg
      debug:
        msg: "hostname is not web"
      when: inventory_hostname in groups['ftp']
      failed_when: inventory_hostname in groups['ftp']

    - name: copy
      copy:
        content: "Welcome to {{ ansible_facts.hostname }}"
        dest: /var/www/index.html

通过Ansible块block处理错误任务

在playbook中,通过块block可以对任务进行逻辑分组,可以实现错误处理

通过块block可以结合rescue和always语句来实现错误处理

block与when、rescue、always是同一级别,位于tasks之下

如果块block中的任何任务失败,则执行其rescue中的任务来进行

block、rescue、always概念

block:定义要运行的主要任务(block中的任何一个task出错,会顺序执行rescue中的task)

rescue:定义 当在block子句中定义的任务失败时 运行的任务

always:定义始终都独立运行的任务,不论block和rescue子句中定义的任务是成功还是失败

block任务执行成功 → 直接走always中的任务(不执行rescue对应的任务)

block任务执行失败 → 走rescue中的任务 → 走always中的任务

实例

对vdc磁盘分区,分为1500m(如果磁盘无法分为1500m则分为800m),最后将磁盘格式化为ext4格式

---
- name: create /dev/vdc
  hosts: web
  tasks:
    - name: block
      block:
        - name: create vdc1 1000MiB
          parted:
            device: /dev/vdc
            number: 1
            state: present
            part_end: 1000MiB
      rescue:
        - name: create vdc 500MiB
          parted:
            device: /dev/vdc
            number: 1
            state: present
            part_end: 500MiB
      always:
        - name: create ext4
          filesystem:
            fstype: ext4
            dev: /dev/vdc1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/473333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

语义分割学习笔记(二)转置卷积

目录 1.转置卷积Transposed Convolution概念 2.转置卷积操作步骤 3.转置卷积参数 4.实战案例 推荐课程&#xff1a;转置卷积&#xff08;transposed convolution&#xff09;_哔哩哔哩_bilibili 感谢霹雳吧啦Wz&#xff0c;真乃神人也。 1.转置卷积Transposed Convolutio…

分类预测 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络数据分类预测

分类预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆网络数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-CNN多特征分类预测&#xff0c;多特…

SimpleCG库安装使用

SimpleCG库是一个简单的Windows图形库&#xff0c;对GDI及窗口和消息机制进行了简单封装&#xff0c;从而达到类似Turbo C图形库的调用方法&#xff0c;目的是为了初学C语言的同学能快速上手图形界面编程。使用对象包括所有初学C语言的同学&#xff0c;尤其是中学生&#xff0c…

PAT B1049

PAT B1049 题目 给定一个正数数列&#xff0c;我们可以从中截取任意的连续的几个数&#xff0c;称为片段。例如&#xff0c;给定数列 { 0.1, 0.2, 0.3, 0.4 }&#xff0c;我们有 (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0…

【】lambda表达式

文章目录 lambda表达式lambda概念lambda表达式的格式关于捕获列表常见问题: 使用lambda表达式交换两个数lambda表达式底层原理 lambda表达式 lambda概念 lambda表达式本质是一个匿名函数(因为它没有名字),恰当使用lambda表达式可以让代码变得简洁.并且可以提高代码的可读性 例…

字节后端入门 - Go 语言原理与实践

1.1什么是Go语言 1.2Go语言入门 环境 1.3基础语法 1.3.1变量 var name"value" 自己推断变量类型&#xff1b; 也可以显式类型 var c int 1 name: type(value) 常量&#xff1a; const name "value" g : a"foo" 字符串拼接 1.3.2 if else {}花括号…

Java——多线程和锁

多线程 前言:当我们打开一个网站时&#xff0c;不同部分的加载并不是先后出现的&#xff0c;是并行出现的&#xff0c;没有出现一个地方没加载完&#xff0c;别的地方就也加载不出来这种事。这个就是多线程并行运行。 当其中一个线程发生阻塞时&#xff0c;操作系统会自动执行…

系统集成项目管理工程师 笔记(第12章:项目沟通管理和干系人管理)

文章目录 12.1.2 沟通的方式 404沟通管理计划的编制过程12.2.2 制订沟通管理计划的工具 4114、沟通方法 12.3.2 管理沟通的工具 41312.4.2 控制沟通的技术和方法 4163、会议 12.5.1 项目干系人管理所涉及的过程 420项目干系人管理的具体内容&#xff1a;&#xff08;1&#xff…

C/C++文件操作/IO流

学习任务&#xff1a; ⭐认识文件。⭐学习C语言中文件如何打开和关闭。⭐学习C语言中文件的读写方法&#xff08;包括顺序读写和随机读写&#xff09;。⭐学习C语言文件操作中如何判断文件读取结束。⭐简单了解FILE缓冲区。⭐认识流。⭐学习C的IO流&#xff0c;包括标准IO流和文…

【CMake】给一个库添加用法需求(Usage Requirements)

3. 给一个库添加用法需求&#xff08;Usage Requirements&#xff09; 1. usage requirements 目标参数的用法要求&#xff08;不知道有没有更好的翻译方式&#xff09;可以更好地控制库或可执行的链接&#xff0c;并包括行&#xff0c;同时还可以更好地控制CMAKE内部目标的传…

【哈士奇赠书活动 - 17期】-〖uni-app跨平台开发与应用从入门到实践〗

文章目录 ❤️‍&#x1f525; 赠书活动 - 《uni-app跨平台开发与应用从入门到实践》❤️‍&#x1f525; 编辑推荐❤️‍&#x1f525; 抽奖方式与截止时间❤️‍&#x1f525; 赠书活动 → 获奖名单 ❤️‍&#x1f525; 赠书活动 - 《uni-app跨平台开发与应用从入门到实践》…

日志技术-Logback

一. 日志是什么&#xff1a; 输出语句的弊端&#xff1a;它只能在控制台展示&#xff0c;它不能记录在本地文件当中。 日志可以将程序运行过程中的信息直接记录在文件里面&#xff0c;做永久存储。 性能较好&#xff0c;简单来说就是运行的速度会比较快。 二. 日志技术体系、L…

3_docker应用部署:MySQL-Tomcat-Nginx-Redis

Docker 应用部署 一、部署MySQL 案例需求&#xff1a;在Docker容器中部署MySQL&#xff0c;并通过外部mysql客户端操作MySQL Server。 分析&#xff1a; 容器内的网络服务和外部机器不能直接通信 外部机器和宿主机可以直接通信 宿主机和容器可以直接通信 当容器中的网络服…

iOS 17 开放侧载,微信双开要来了?

关于苹果北京时间 6 月 6 日召开的 WWDC23 全球开发者大会&#xff0c;外媒彭博记者 Mark Gurman 带来了最新消息。 大致更新概览 他认为&#xff0c;本次 WWDC23 大会将会主要推出这几款产品和软件&#xff1a;iOS 17、iPadOS 17、macOS 14、watchOS 10、新的 MacBooks 、混…

文件上传下载系列——如何实现文件秒传

文章目录 &#x1f383;简介&#xff1a; &#x1f47b;核心思想&#xff1a; MD5是什么&#xff1f; 实现步骤&#xff1a; &#x1f384;实操&#xff1a; 1、java生成文件MD5码 2、javascript生成文件MD5码 ⛳️基于秒传的分片上传下载 上传&#xff1a; 下载&…

Afkayas.1(★)

软件运行 要输入正确的Name和Serial 查壳 一个VB程序&#xff0c;没有加壳 载入OD 直接开搜索字符串。 这里看到了错误的提示&#xff0c;“You Get It”应该就是成功的字符串了。 前面的“AKA-”应该是在什么时候拼接的字符串 去成功的字符串附近看看 这个字符串上面…

LVS负载均衡群集——DR模式

一、LVS-DR集群介绍 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09;工作模式&#xff0c;是生产环境中最常用的一 种工作模式。 1、LVS-DR 工作原理 LVS-DR 模式&#xff0c;Director Server 作为群集的访问入口&#xff0c;不作为网关使用&#xff0…

第九章 子查询

文章目录 前言一、.需求分析与问题解决1 、实际问题2 、子查询的基本使用3 、子查询的分类 二、单行子查询1、单行比较操作符2、代码示例3、 HAVING 中的子查询4、CASE中的子查询5、 子查询中的空值问题6、非法使用子查询 三、多行子查询1、 多行比较操作符2、代码示例3 、空值…

客快物流大数据项目(一百一十八):配置中心 Spring Cloud Config

文章目录 配置中心 Spring Cloud Config 一、​​​​​​​Config 简介

STM32-HAL-SPI-W25Q128FV简单读写测试(2)

文章目录 一、Flash的基本读写操作1.1 向芯片中的某个地址&#xff08;addr:0x02&#xff09;连续写入不定长的数据并读取代码示例读写流程分析函数分析 1.2 向芯片中的某个地址&#xff08;addr:0x00&#xff09;写入一个数值代码示例&#xff1a;读写流程分析 具体的配置接上…