Ansible基础五——条件语句、循环语句、handlers、任务失败处理

news2025/1/11 10:58:56

文章目录

  • 一、 循环语句
    • 1.1 单量循环
    • 1.2 多量循环
    • 1.3 老版本用法
    • 1.4 loop+register
  • 二、条件判断
    • 2.1 根据变量状态判断
    • 2.2 根据变量是否存在判断
    • 2.3 根据事实判断
    • 2.4 多条件判断
      • 2.4.1 and用法
      • 2.4.2 or用法
    • 2.5 循环判断
    • 2.6 根据上个任务结果判断
  • 三、handlers处理程序
  • 四、任务失败处理方法
    • 4.1 忽略失败任务
    • 4.2 强制执行失败任务

一、 循环语句

  • 可以使用item循环变量+loop模块组合使用,实现普通循环。
  • 常用于一键操作,比如一键安装所有组件服务。

1.1 单量循环

  • 只对一个变量进行循环

1.一键停止受控机上的两个服务。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 一键操作
  hosts: 192.168.130.161
  tasks:
    - name:  停止服务
      service:
        name: "{{ item }}"     ##引用循环变量。
        state: stopped
      loop:              ##使用loop模块,要操作的对象列表。
        - postfix
        - crond 

在这里插入图片描述
2.推荐写法,定义变量,一键启动受控机上的两个服务。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 一键操作
  vars:
    service_name:         ##定义变量,填写操作对象列表。
      - crond
      - postfix
  hosts: 192.168.130.161
  tasks:
    - name:  停止服务
      service:
        name: "{{ item }}"
        state: started
      loop: "{{ service_name }}"    ##模块直接引用变量。

在这里插入图片描述
3.使用变量文件定义,停止受控机上的两个服务。
在这里插入图片描述
在这里插入图片描述

1.2 多量循环

  • 对多个变量进行循环。

1.在受控机上创建两个用户,baimu1和baimu2,属组分别是root、qingjun。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 一键操作
  hosts: 192.168.130.161
  tasks:
    - name:  停止服务
      user:
        name: "{{ item.name }}"     ##循环变量。
        group: "{{ item.group  }}"
        state: present
      loop:           
        - name: baimu1
          group: root
        - name: baimu2
          group: qingjun

在这里插入图片描述

1.3 老版本用法

  • 之前版本的循环是通过以下字段来实现的。
循环关键字描述
with_items行为与简单列表的loop关键字相同,例如字符串列表或散列/字典列表。但与loop不同的是,如果为with_items提供了列表的列表,它们将被扁平化为单级列表。循环变量item保存每次迭代过程中使用的列表项。
with_file此关键字需要控制节点文件名列表。循环变量item在每次迭代过程中保存文件列表中相应文件的内容。
with_sequence此关键字不需要列表,而是需要参数来根据数字序列生成值列表。循环变量item在每次迭代过程中保存生成的序列中的一个生成项的值。

1.列出受控机的/opt目录下文件内容。
在这里插入图片描述
2.主控机编写剧本,验证查看。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 一键操作
  hosts: 192.168.130.161
  vars:
    qingjun:                ##定义变量qingjun。
      - /opt/baimu.txt
      - /opt/baimu1.txt
      - /opt/baimu2.txt
  tasks:
    - name:  获取文件内容
      shell: |
        cat "{{ item  }}"    ##循环变量。
      with_items: "{{ qingjun  }}"    ##使用with_items循环模块,应用变量qingjun,作用与loop模块相似。
      register: jis          ##将获取的结果注册到变量jis里去。
    - debug: var=jis    ##将jis变量内容打印出来。

在这里插入图片描述

1.4 loop+register

  • 配合打印循环。

1.打印出“zhangsan喜欢吃牛排”、“lisi喜欢吃牛排”的的信息。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 一键操作
  hosts: 192.168.130.161
  tasks:
    - name:  获取文件内容
      shell: |
        echo  "{{ item  }}" 特别喜欢吃牛排!      ##循环变量,依次跟局loop循环模块列表来执行。
      loop:
        - zhangsan
        - lisi
      register: qingjun      ##将获取的结果注册到循环变量里去。
    - name: Print  
      debug: 
        var: qingjun         ##打印输出。

在这里插入图片描述
2.从打印的结果再取值。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 一键操作
  hosts: 192.168.130.161
  tasks:
    - name:  获取文件内容
      shell: |
        echo  "{{ item  }}" 特别喜欢吃牛排!
      loop:
        - zhangsan
        - lisi
      register: qingjun
    - name: Print  
      debug: 
        msg: |
          "结果是:{{ item.start  }}"     ##取results里面的start的值,再进行打印。
      loop: "{{ qingjun['results'] }}"     ##从打印的整体结果里卖弄再取results部分里面的值。
    ##loop: "{{ qingjun.results }}"  ##第二种写法。

在这里插入图片描述
在这里插入图片描述

二、条件判断

  • 使用when语句来进行条件判断,若条件满足,则运行任务;若条件不满足,则跳过任务。
  • when语句放在任务名称和模块(及模块参数)的后面。
标识符示例
等于(值为字符串)ansible_machine == “x86_64”
等于(值为数字)max_memory == 512
小于min_memory < 128
大于min_memory > 256
小于等于min_memory <= 256
大于等于min_memory >= 512
不等于min_memory != 512
变量存在min_memory is defined
变量不存在min_memory is not defined
布尔变量是True。1、True或yes的求值为Truememory_available
布尔变量是False。0、False或no的求值为Falsenot memory_available
第一个变量的值存在,作为第二个变量的列表中的值ansible_distribution in supported_distros

2.1 根据变量状态判断

1.根据某个变量的取值状态判断是否执行某个任务。这里根据变量service_status是否等于true来判断是否要安装httpd服务。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  vars:
    service_status: true    ##定义一个变量。
  tasks:
    - name: 判断apache是否安装
      yum:
        name: httpd
        state: present
      when: service_status      ##判断这个变量,条件语句里不能存在{{ }}引用符号。        

在这里插入图片描述

2.2 根据变量是否存在判断

1.根据上下文是否定义某个变量来判断是否执行某个任务。这里根据是否定义了变量service_name来判断是否要安装httpd服务。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  tasks:
    - name: 判断apache是否安装
      yum:
        name: "{{ service_name }}"    ##虽然引用变量,但此变量未被定义。
        state: absent
      when: service_name is defined

在这里插入图片描述

2.变量service_name为空,则不执行任务。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  vars:
    service_name: " "          ##定义变量,但值为空。
  tasks:
    - name: 判断apache是否安装
      yum:
        name: "{{ service_name }}"    ##引用变量。
        state: absent
      when: service_name is defined        ##判断变量是否为空,为空则不执行任务。        

在这里插入图片描述
3.变量存在,执行任务,卸载httpd。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  vars:
    service_name:
      - httpd
  tasks:
    - name: 判断apache是否安装
      yum:
        name: "{{ service_name }}"
        state: absent
      when: service_name is defined

在这里插入图片描述

2.3 根据事实判断

  • 根据取出的事实来判断是否在对受控机执行任务。

1.先取受控机的事实相关参数,比如这里我就根据系统版本来判断。

[root@localhost ansible]# ansible all -m setup -i inventory.ini |less

在这里插入图片描述
2.当系统版本等于7.5时,才执行条件循环语句,依次停止变量列表中的服务。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  vars:
    service_name:
      - firewalld
  tasks:
    - name: 判断apache是否安装
      service:
        name: "{{ item }}"
        state: started
      loop: "{{ service_name  }}"
      when: ansible_facts['distribution_version'] == "7.5"

在这里插入图片描述

2.4 多条件判断

  • 使用and表示所有条件满足时,才执行任务。
  • or表示满足任意一个条件时,就可执行任务。

2.4.1 and用法

1.当系统版本为7.5,且python版本大于2.7时才会执行任务。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  vars:
    service_name:
      - firewalld
  tasks:
    - name: 判断apache是否安装
      service:
        name: "{{ item }}"
        state: stopped
      loop: "{{ service_name  }}"
      when: ansible_facts['distribution_version'] == "7.5" and ansible_facts['python_version'] > 2.7

在这里插入图片描述
2.也可以多行写法。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  vars:
    service_name:
      - firewalld
  tasks:
    - name: 判断apache是否安装
      service:
        name: "{{ item }}"
        state: started
      loop: "{{ service_name  }}"
      when: 
        - ansible_facts['distribution_version'] == "7.5"
        - ansible_facts['python_version'] > 2.7

在这里插入图片描述

2.4.2 or用法

1.当系统版本为7.5,或python版本大于3时才会执行任务。我这里只满足了第一个条件,所以可以执行任务。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  vars:
    service_name:
      - firewalld
  tasks:
    - name: 判断apache是否安装
      service:
        name: "{{ item }}"
        state: started
      loop: "{{ service_name  }}"
      when: ansible_facts['distribution_version'] == "7.5" or ansible_facts['python_version'] > 3

在这里插入图片描述
2.也可以多行写法。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  vars:
    service_name:
      - firewalld
  tasks:
    - name: 判断apache是否安装
      service:
        name: "{{ item }}"
        state: stopped
      loop: "{{ service_name  }}"
      when: 
        ansible_facts['distribution_version'] == "7.5"
        or
        ansible_facts['python_version'] > 3

在这里插入图片描述

2.5 循环判断

  • 结合loop模块实现循环判断。

1.循环事实里的条件,条件满足执行任务。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  tasks:
    - name: 判断apache是否安装
      yum:
        name: httpd
        state: present
      loop: "{{ ansible_facts['mounts'] }}"  ##取事实里的mounts内的内容,其下面有多个挂载点,根据when条件来判断是否执行任务。
      when: 
        - item.mount == "/"           ##ansible_facts['mounts']['mount'] 的值是否为“/”。
        - item.size_available > 700    ##ansible_facts['mounts'][’size_avaliable‘]的值是否大于700.

在这里插入图片描述

2.6 根据上个任务结果判断

  • 根据上个任务结果来判断是否要执行后面的任务。
  • 比如,第一个任务是安装服务,若是安装成功则执行第二步启动服务;若是安装失败,就不需要继续执行任务了。

1.rc是任务执行后输出的一个值,当rc=0时,代表任务执行成功。
在这里插入图片描述
2.当第一步安装httpd服务成功时,会输出rc=0,之后才会执行第二步。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  tasks:
    - name: 判断服务是否安装
      yum:
        name: httpd
        state: present
      ignore_errors: yes   ##任务执行失败直接跳过,可以继续执行后面任务。
      register: qingjun     ##获取任务输出的结果,讲结果注册到变量qingjun里去。

    - name: 启动服务
      service:
        name: httpd
        state: started
      when: 
        - qingjun.rc == 0   ##变量qingjun里的内容有个rc值,rc=0时才会执行第二步。

在这里插入图片描述

三、handlers处理程序

基本了解:

  • handlers和tasks功能一样,也是用于处理任务的,只是它常用于更改服务配置文件后需要重启服务这种场景常用。
  • handlers和tasks是同级别,需要在tasks任务里定义notify语句,当notify语句所在的任务结果显示为changed时,才会触发handlers任务。

注意事项:

  1. 当tasks中有多个任务定义notify语句时,触发任务会按照handlers任务里的顺序来执行。
  2. 若tasks中定义多个notify语句具备相同的名称时,最终只会触发一个handlers任务。
  3. 即使有多个任务通知处理程序,该处理程序依然仅运行一次。如果没有任务通知处理程序,它就不会运行。

1.主控机的playbook目录下有个专门存放受控机配置文件的目录,此时配置文件http.conf是原文件,监听端口未被修改。
在这里插入图片描述
2.编写playbook,当notify所在的任务发生了改变就会触发handlers任务,从而重启服务。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  tasks:
    - name: 判断服务是否安装
      yum:
        name: httpd
        state: present
      ignore_errors: yes

    - name: 更改服务配置文件
      template:
        src: ./file/httpd.conf               ##将主控机上的文件传到受控机上,若文件内容发生改变则触发任务。
        dest: /etc/httpd/conf/httpd.conf
      notify:
       - restart httpd   ##需要与handlers名称一致。

    - name: 启动服务
      service:
        name: httpd
        state: started
  handlers:
    - name: restart httpd     ##需与notify名称一致。
      service:
        name: httpd
        state: restarted

3.执行playbook,此时主控机上的http.conf文件内容未被修改,传到受控机上也不会出现覆盖动作,所以notify是直接返回的ok,此时不触发handlers任务。
在这里插入图片描述
4.访问受控机安装的httpd服务,默认80端口。
在这里插入图片描述

5.此时修改主控机上的http.conf文件内容,将监听端口改成88,执行playbook会触发handlers任务,因为两边文件内容不一样,传过去会覆盖受控机上的原文件。
在这里插入图片描述
在这里插入图片描述
6.再次访问受控机安装的httpd服务,需要88端口。
在这里插入图片描述

四、任务失败处理方法

4.1 忽略失败任务

  • 添加参数ignore_errors: yes,可以让playbook在任务失败时继续执行。

1.安装一个不存在的任务会失败,添加ignore_errors会忽略继续执行后面任务。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  tasks:
    - name: 判断服务是否安装
      yum:
        name: httpds
        state: present
      ignore_errors: yes

    - name: 更改服务配置文件
      template:
        src: ./file/httpd.conf
        dest: /etc/httpd/conf/httpd.conf
      notify:
       - restart httpd

    - name: 启动服务
      service:
        name: httpd
        state: started
  handlers:
    - name: restart httpd
      service:
        name: httpd
        state: restarted

在这里插入图片描述

4.2 强制执行失败任务

  • 添加参数force_handlers: yes,针对性的适用handlers处理程序的场景。
  • 正常情况下,当某一个任务执行失败时就会停止其他程序处理;当使用此参数时,即时前面有任务执行失败,后面的handlers也会在notify函数所在的任务发生改变时正常执行。

1.中间的启动服务步骤会失败,但不影响后面的handlers任务正常执行。当修改配置文件监听端口为90,notify语句会触发handlers执行程序任务,从而重启服务,可以使用90端口访问web页。

[root@localhost playbook]# cat qingjun.yml 
---
- name: 安装服务
  hosts: 192.168.130.161
  force_handlers: yes
  tasks:
    - name: 判断服务是否安装
      yum:
        name: httpd
        state: present

    - name: 更改服务配置文件
      template:
        src: ./file/httpd.conf
        dest: /etc/httpd/conf/httpd.conf
      notify:
       - restart httpd

    - name: 启动服务
      service:
        name: httpds
        state: started
  handlers:
    - name: restart httpd
      service:
        name: httpd
        state: restarted

在这里插入图片描述
2.使用受控机ip:90访问web。
在这里插入图片描述

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

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

相关文章

5月《中国数据库行业分析报告》正式发布,首发时序、实时数据库两大【全球产业图谱】

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…

ubuntu20安装xrdp以及解决黑屏问题

1、安装xrdp sudo apt-get install xrdp 2、将xrdp用户加入到如下用户组 sudo adduser xrdp ssl-cert 3、重启xrdp sudo service xrdp restart 4、打开windows远程面&#xff0c;连接&#xff0c;如果出现黑屏 sudo -s sudo vim /etc/xrdp/startwm.sh 加入如下内容&#xff…

攻防世界-web-Web_php_unserialize

1. 题目描述&#xff1a;查看以下代码&#xff0c;获取flag 2. 思路分析 从代码中不难看出&#xff0c;这里共有三个地方需要绕过 2.1 __wakeup函数&#xff1a;若在对象的魔法函数中存在的__wakeup方法&#xff0c;那么之后再调用 unserilize() 方法进行反序列化之前则会先…

数据分析概述

数据分析概述 数据的性质数据的概念数据与信息的区别和联系 数据的类型按照度量尺度分按时间状况分 什么是数据分析数据分析的重要性数据分析的内容数据分析作用 数据分析的基本流程典型的数据分析的流程 数据分析方法对比分析法分组分析法定量数据分布分析——具体事例 结构分…

上海亚商投顾:沪指高开高走 地产股迎来久违反弹

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日高开高走&#xff0c;沪指午后涨近1%&#xff0c;深成指、创业板指涨超1.2%&#xff0c;上证50盘中大…

惠更斯定理和格林定理

惠更斯原理和格林定理 惠更斯原理显示了表面上的波场如何决定表面 S S S外的波场。惠更斯在17世纪启发性地表达了这一概念。但这个想法的数学表达是由于19世纪的乔治格林。这一概念可以在数学上表达为标量波和矢量波。矢量波情形的推导与标量波情形是同态的。但是标量波情况下…

少儿编程python-一级

少儿编程python 文章目录 前言CSP-J与CSP-S少儿编程证书含金量排名&#xff08;国家承认的少儿编程证书&#xff09;非专业级软件能力认证&#xff08;CSP-J/S&#xff09;青少年编程能力等级测试&#xff08;CPA&#xff09;蓝桥杯青少年信息技术等级考试全国青少年软件编程等…

造船厂事故/风险(背景+官方统计数据)

造船厂事故/风险&#xff08;背景官方统计数据&#xff09; 船厂工地常见事故船厂事故:发人深省的伤害统计船厂工地常见的风险有哪些? 造船业是周期性的、资本密集型的行业。更严格的环境法规于2020年初生效&#xff0c;引发了对抑制船舶废气硫排放技术的需求。与此同时&#…

数据标记工具

检测分割标定 labelstudio https://labelstud.io/sudo apt install libpq-dev python3-devconda activate paddle_envpip install label-studiolabel-studio startlabel-studio --data-dir /data/data_label_studio<View><Image name"image" value"$im…

【shiro】shiro整合JWT——2.如何整合

前言 shiro整合JWT系列&#xff0c;主要记录核心思路–如何在shiroredis整合JWTToken。 上一篇中&#xff0c;我们知道了需要创建JwtToken、JwtUtil、JwtFilter。 该篇主要讲如何在shiro框架中&#xff0c;配置Jwt。 ps&#xff1a;本文主要以记录核心思路为主。 1、ShiroCon…

如何零基础自学黑客?

我经常会看到这一类的问题&#xff1a; 学习XXX知识没效果&#xff1b;学习XXX技能没方向&#xff1b;学习XXX没办法入门&#xff1b; 给大家一个忠告&#xff0c;如果你完全没有基础的话&#xff0c;前期最好不要盲目去找资料学习&#xff0c;因为大部分人把资料收集好之后&…

Android中的WorkManager

Android中的WorkManager 在后台运行任务会消耗设备有限的资源&#xff0c;如RAM和电池。这可能会导致用户体验不佳。例如&#xff0c;后台任务可能会降低设备的电池寿命或用户在观看视频、玩游戏、使用相机等时可能会遇到设备性能不佳的情况。 为了提高电池性能&#xff0c;An…

关于人力资源管理职能,你需要知道的事

每个成功的企业都有一个称职的人力资源部门。它是任何企业的重要组成部分&#xff0c;是员工和管理层之间的纽带。人力资源涵盖影响组织人员的所有任务&#xff0c;从基本的人力资源活动到战略决策。 对于任何希望可持续发展的企业来说&#xff0c;人力资源管理职能的重要性不…

0802数量积向量积混合积-向量代数与空间解析几何

文章目录 1 两向量的数量积1.1 引例1.2 定义1.3 推论1.4 运算规律1.4 数量积的坐标表示 2 两向量的向量积2.1 定义2.2 重要结论2.3 几何意义&#xff08;向量积模&#xff09;2.4 向量积的运算规律2.5 向量积的坐标表示 3 向量的混合积3.1 混合积的定义3.2 混合积的坐标表示3.3…

初识报表引擎-FineReport

简介 提到报表引擎大家可能都会说帆软。目前商用的比较突出的两个报表引擎&#xff1a;分别是帆软FineReport、RDP报表引擎&#xff0c;其中帆软功能突出且非常完整但是价格较高&#xff0c;RDP功能相对完整但是不够强大貌似还有些BUG&#xff0c;不过价格很低。就目前的情况来…

《模板的进阶》

本文主要介绍C模板知识&#xff0c;包括模板的参数类型&#xff0c;模板的特化&#xff0c;模板的分离编译 文章目录 思维导图一、非类型模板参数二、模板的特化2.1模板特化的概念2.2函数模板特化2.3类模板的特化2.3.1全特化2.3.2偏特化 2.4非类型模板参数也是可以特化的 三、模…

Android 调用系统隐藏的类和方法

1.Android系统隐藏的类和方法 阅读Android源码时&#xff0c;会发现很多被UnsupportedAppUsage注解的方法&#xff0c;这些方法不能被外部应用访问。 比如Android中的PackageParser类&#xff0c;这个类是在android.content.pm包下面&#xff1a; 可以看到这个类是隐藏的&…

有哪些自动化构建工具推荐? - 易智编译EaseEditing

以下是几个常用的自动化构建工具推荐&#xff1a; Jenkins&#xff1a; Jenkins 是一个开源的自动化构建工具&#xff0c;广泛用于持续集成和持续交付。 它支持各种编程语言和版本控制系统&#xff0c;并提供了丰富的插件生态系统&#xff0c;可实现灵活的构建流程和自动化部…

【Spring】— 动态SQL :<choose>、<when>和<otherwise>元素

<choose>、<when>和<otherwise>元素 在使用<if>元素时&#xff0c;只要test属性中的表达式为true&#xff0c;就会执行元素中的条件语句&#xff0c;但是在实际应用中&#xff0c;有时只需要从多个选项中选择一个执行。例如&#xff0c;若用户姓名不为…

九、Docker网络

Docker网络 一、docker网络介绍 Docker网络在Docker的基础知识中算比较重要的了&#xff0c;需要多多实验理解。 Docker服务安装启动后默认在host上创建了三个网络&#xff1a; [rootk8s-m1 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UN…