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

目录

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.mfbz.cn/a/16267.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion 本地部署教程不完全指南

ChatGPT免费体验入口网址 http://chat.xutongbao.top 参考链接&#xff1a; ERROR: Could not find a version that satisfies the requirement torch1.7.0 ERROR: No matching……_congcongiii的博客-CSDN博客 下载链接&#xff1a; https://download.pytorch.org/whl/cu11…

KeepChatGPT插件-提效神器,解决ChatGPT报错!

KeepChatGPT插件-提效神器&#xff0c;解决ChatGPT报错&#xff01; 文章目录 KeepChatGPT插件-提效神器&#xff0c;解决ChatGPT报错&#xff01;一、错误提示关于 为何会出现大规模地网络错误二、解决方案三、安装步骤电脑端使用1.Chrome浏览器安装2.Firefox浏览器安装 四、使…

医院信息系统HIS源码——接口技术:RESTful API + WebSocket + WebService

云HIS系统采用SaaS软件应用服务模式&#xff0c;提供软件应用服务多租户机制&#xff0c;实现一中心部署多机构使用。相对传统HIS单机构应用模式&#xff0c;它可灵活应对区域医疗、医疗集团、医联体、连锁诊所、单体医院等应用场景&#xff0c;并提升区域内应用的标准化与规范…

LangChain 2 ONgDB:大模型+知识图谱实现领域知识问答

LangChain 2 ONgDB&#xff1a;大模型知识图谱实现领域知识问答 LangChain 2 ONgDB&#xff1a;大模型知识图谱实现领域知识问答系统截图LangChain代理流程 Here’s the table of contents: LangChain 2 ONgDB&#xff1a;大模型知识图谱实现领域知识问答 LangChain 是一种 LL…

asp.net+sqlserver旅游网站zjy99A2

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…

【校招VIP】IT职位校招简历千万不要用两栏的模板,另外,告诉你个陷阱:越个性机会越少

前两天在简历指导的直播里&#xff0c;发现了不应该出现的一种简历格式问题。 有的同学喜欢用那种竖栏两栏的简历模板。 我们建议研发岗的校招&#xff0c;简历不要这么去写。 因为两栏的话&#xff0c;实际上有一个很大的问题。 因为简历上需要写项目经历&#xff0c;需要写…

从Pandas快速切换到Polars :数据的ETL和查询

对于我们日常的数据清理、预处理和分析方面的大多数任务&#xff0c;Pandas已经绰绰有余。但是当数据量变得非常大时&#xff0c;它的性能开始下降。 我们以前的两篇文章来测试Pandas 1.5.3、polar和Pandas 2.0.0之间的性能了&#xff0c;Polars 正好可以解决大数据量是处理的…

国内直接使用的ChatGTP

ChatGTP都能做一些什么事&#xff1a; 回答问题&#xff1a;我可以通过自然语言处理技术来回答用户的问题&#xff0c;提供有用的信息和解决方案。 聊天互动&#xff1a;我可以和用户聊天互动&#xff0c;倾听对话和提供支持。 搜索&#xff1a;我可以搜索互联网和已知的数据…

【Java笔试强训 19】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;汽水瓶 …

「Bug」解决办法:Could not switchto this profil,无法使用节点的解决方法,彻底解决

♥️作者&#xff1a;白日参商 &#x1f935;‍♂️个人主页&#xff1a;白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

【五一创作】Scratch资料袋

Scratch软件是免费的、免费的、免费的。任何需要花钱才能下载Scratch软件的全是骗子。 1、什么是Scratch Scratch是麻省理工学院的“终身幼儿园团队”开发的一种图形化编程工具。是面向青少年的一款模块化&#xff0c;积木化、可视化的编程语言。 什么是模块化、积木化&…

1. 安装Open vSwitch环境

1. 安装Open vSwitch环境 1 配置基础环境。 在VMware Workstation软件中创建一个虚拟机VM1&#xff0c;配置2张网卡&#xff0c;虚拟机VM1配置如图4-3所示。将网卡ens33地址配置为192.168.1.131/24&#xff0c;网卡ens34地址配置为192.168.2.131/24。 图4-3 VM1虚拟机配置 2…

好家伙,9:00面试,9:06就出来了,问的实在是太...

从外包出来&#xff0c;没想到死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到2月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推我去…

为什么在马云成功前就有那么多影像留下来?

马云创业的各个阶段&#xff0c;都有意无意得到媒体的推波助澜&#xff0c;不光是影像&#xff0c;还留下了很多相关的文字报道。站在当时的角度&#xff0c;马云或许并不总是以一种成功人士的身份出现&#xff0c;但即便如此&#xff0c;他做事情也足够新潮、足够前卫、或者足…

【Spring】三大依赖注入(@Autowired,Setter,构造方法)

目录 一、属性注入&#xff08;Autowired&#xff09; 1.1 优点分析 1.2 缺点分析 1.2.1 无法实现final修饰的变量注入。 1.2.2 兼容性不好 1.2.3 &#xff08;可能违背&#xff09;设计原则问题 1.2.4 代码举例&#xff1a; 1.2.5 出现循环依赖该怎么办&#xff1f; …

初识MySQL数据库——“MySQL数据库”

各位CSDN的uu们你们好呀&#xff0c;小雅兰好久没有更文啦&#xff0c;确实是心有余而力不足&#xff0c;最近学习的内容太难了&#xff0c;这篇博客又是小雅兰的新专栏啦&#xff0c;主要介绍的是一些MySQL数据库的知识点&#xff0c;下面&#xff0c;让我们进入初识MySQL数据…

【Java入门合集】第二章Java语言基础(二)

【Java入门合集】第二章Java语言基础&#xff08;二&#xff09; 博主&#xff1a;命运之光 专栏JAVA入门 学习目标 掌握变量、常量、表达式的概念&#xff0c;数据类型及变量的定义方法&#xff1b; 掌握常用运算符的使用&#xff1b; 掌握程序的顺序结构、选择结构和循环结构…

计算机是如何工作的

目录 一、冯诺依曼体系&#xff1a; 二、操作系统 三、进程 3.1 PCB&#xff08;进程控制块&#xff09;— 描述进程属性的结构体 3.2 CPU分配 — 进程调度 3.3 内存分配 — 虚拟地址 3.4 进程间通信 一、冯诺依曼体系&#xff1a; CPU中央处理器&#xff08;运算器控制…

算法记录 | Day45 动态规划

70.爬楼梯 &#xff08;进阶&#xff09; 改为&#xff1a;一步一个台阶&#xff0c;两个台阶&#xff0c;三个台阶&#xff0c;…&#xff0c;直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢&#xff1f; 1阶&#xff0c;2阶&#xff0c;… m阶就是物品&#xff0c;楼顶…

什么是VLAN?为什么要划分VLAN?

VLAN(Virtual Local Area Network)即虚拟局域网&#xff0c;是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。每个VLAN是一个广播域&#xff0c;VLAN内的主机间可以直接通信&#xff0c;而VLAN间则不能直接互通。这样&#xff0c;广播报文就被限制在一个VLAN内。 一、为…
最新文章