1 when控制语句

when 判断在用于控制在满足when所指定的条件的情况下才执行响应的动作。

使用场景:

  • 比如: web 节点都需要配置 nginx 仓库,但其他节点并不需要,此时就会用到when 判断。
  • 比如: CentosUbuntu 都需要安装 Apache ,而 Centos 系统软件包为httpd ,而 Ubuntu 系统软件包为 httpd2 ,那么此时就需要判断主机系统,然后为不同的主机系统安装不同的软件包。

1.1 根据不同操作系统安装相同的软件

需求:为所有主机安装 Apache 软件,若系统为 CentOS :安装 httpd,若系统为 Ubuntu :安装 httpd2

ansible_distribution变量可以获取到主机的发行版本。

  • playbook编写如下:

    1. [root@xuzhichao playbook]# cat when1.yml
    2. - hosts: webs
    3. remote_user: root
    4. tasks:
    5. - name: CentOS Install httpd
    6. yum:
    7. name: httpd
    8. state: present
    9. when: ansible_distribution == "CentOS" <==判断版本语句,此处变量不需要{{ }}引用。
    10. - name: Ubuntu Install httpd
    11. yum:
    12. name: httpd2
    13. state: present
    14. when: ansible_distribution == "Ubuntu"
  • 主机hosts文件如下:

    1. [root@xuzhichao playbook]# tail /etc/ansible/hosts
    2. [webs]
    3. 192.168.20.22
    4. 192.168.20.23
  • 执行结果:

    1. [root@xuzhichao playbook]# ansible-playbook when1.yml
    2. PLAY [webs] ***************************************************************************************************************************************************
    3. TASK [CentOS Install httpd] ***********************************************************************************************************************************
    4. ok: [192.168.20.22]
    5. ok: [192.168.20.23]
    6. TASK [Ubuntu Install httpd] ***********************************************************************************************************************************
    7. skipping: [192.168.20.22] <==跳过执行此任务
    8. skipping: [192.168.20.23]
    9. PLAY RECAP ****************************************************************************************************************************************************
    10. 192.168.20.22 : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
    11. 192.168.20.23 : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0

1.2 为不同centos版本安装httpd软件

centos6centos7中的httpd服务,版本不同,配置文件也不相同,此时可以将模板根据centos的版本发送到指定的目标主机。

ansible_distribution_major_version变量用于判断centos主版本号。

  • playbook文件如下:

    1. ---
    2. - hosts: web
    3. remote_user: root
    4. tasks:
    5. - name: install package
    6. yum:
    7. name: httpd
    8. - name: copy template centos6
    9. template:
    10. src: httpd_6.conf.j2
    11. dest: /etc/httpd/conf/httpd.conf
    12. notify: restart service
    13. when: ansible_distribution_major_version == "6" <==判断版本语句,此处变量不需要{{ }}引用。
    14. - name: copy template centos7
    15. template:
    16. src: httpd_7.conf.j2
    17. dest: /etc/httpd/conf/httpd.conf
    18. notify: restart service
    19. when: ansible_distribution_major_version == "7" <==判断版本语句
    20. - name: start service
    21. service:
    22. name: httpd
    23. state: started
    24. handlers:
    25. - name: restart service
    26. service:
    27. name: httpd
    28. state: restarted

1.3 为特定的主机添加Nginx仓库

为特定的主机添加 Nginx 仓库:主机名为 web 则添加 Nginx 仓库,主机名不为 web 则不做任何处理。

编写playbook文件:

  1. [root@xuzhichao playbook]# cat when2.yml
  2. - hosts: all
  3. remote_user: root
  4. tasks:
  5. - name: Add Nginx Yum Repository
  6. yum_repository:
  7. name: nginx
  8. description: Nginx Repository
  9. baseurl: http://nginx.org/packages/centos/7/$basearch/
  10. gpgcheck: no
  11. when: (ansible_hostname is match("web*")) or (ansible_hostname is match("nginx*")
  12. #when也可以使用and与or方式进行多项匹配。

运行playbook

  1. [root@xuzhichao playbook]# ansible-playbook when2.yml

查看运行效果:

  1. [root@nginx03 ~]# cat /etc/yum.repos.d/nginx.repo
  2. [nginx]
  3. baseurl = http://nginx.org/packages/centos/7/$basearch/
  4. gpgcheck = 0
  5. name = Nginx Repository

1.4 判断服务是否正常运行

判断 nginx 服务是否处于运行状态,已运行:则重启服务;未运行:则不做处理。

playbook文件如下:

  1. [root@xuzhichao playbook]# cat when3.yml
  2. - hosts: NginxWebs
  3. remote_user: root
  4. tasks:
  5. - name: Check Nginx Status
  6. shell:
  7. cmd: systemctl is-active nginx
  8. ignore_errors: yes
  9. register: check_nginx
  10. - name: Print Check_nginx
  11. debug:
  12. var:
  13. "check_nginx" <==#通过debugvar输出该变量的所有内容
  14. - name: Nginx Restart
  15. service:
  16. name: nginx
  17. state: restarted
  18. when: check_nginx.rc == 0 <==.rccheck_nginx变量中的执行结果,见下面的执行过程

执行playbook

  1. #其中192.168.20.22主机nginx检测失败,没有重启服务;
  2. #192.168.20.23主机nginx检测成功,重启服务;
  3. [root@xuzhichao playbook]# ansible-playbook when3.yml
  4. PLAY [NginxWebs] **********************************************************************************************************************************************
  5. TASK [Check Nginx Status] *************************************************************************************************************************************
  6. fatal: [192.168.20.22]: FAILED! => {"changed": true, "cmd": "systemctl is-active nginx", "delta": "0:00:00.007774", "end": "2021-08-04 18:33:05.331828", "msg": "non-zero return code", "rc": 3, "start": "2021-08-04 18:33:05.324054", "stderr": "", "stderr_lines": [], "stdout": "unknown", "stdout_lines": ["unknown"]}
  7. ...ignoring
  8. changed: [192.168.20.23]
  9. TASK [Print Check_nginx] **************************************************************************************************************************************
  10. ok: [192.168.20.22] => {
  11. "check_nginx": {
  12. "changed": true,
  13. "cmd": "systemctl is-active nginx",
  14. "delta": "0:00:00.007774",
  15. "end": "2021-08-04 18:33:05.331828",
  16. "failed": true,
  17. "msg": "non-zero return code",
  18. "rc": 3, <==.rccheck_nginx变量中的执行结果状态
  19. "start": "2021-08-04 18:33:05.324054",
  20. "stderr": "",
  21. "stderr_lines": [],
  22. "stdout": "unknown",
  23. "stdout_lines": [
  24. "unknown" <==执行结果。
  25. ]
  26. }
  27. }
  28. ok: [192.168.20.23] => {
  29. "check_nginx": {
  30. "changed": true,
  31. "cmd": "systemctl is-active nginx",
  32. "delta": "0:00:00.007241",
  33. "end": "2021-08-04 18:33:05.331485",
  34. "failed": false,
  35. "rc": 0, <==.rccheck_nginx变量中的执行结果状态,0表示执行正常
  36. "start": "2021-08-04 18:33:05.324244",
  37. "stderr": "",
  38. "stderr_lines": [],
  39. "stdout": "active",
  40. "stdout_lines": [
  41. "active" <==执行结果。
  42. ]
  43. }
  44. }
  45. TASK [Nginx Restart] ******************************************************************************************************************************************
  46. skipping: [192.168.20.22]
  47. changed: [192.168.20.23]
  48. PLAY RECAP ****************************************************************************************************************************************************
  49. 192.168.20.22 : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=1
  50. 192.168.20.23 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

ansible系列(23)--ansible的when控制语句的更多相关文章

  1. Ansible系列(二):选项和常用模块

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  2. Ansible系列(一):基本配置和使用

    本文目录:1.1 安装Ansible1.2 配置Ansible 1.2.1 环境配置 1.2.2 SSH互信配置 1.2.3 简单测试1.3 inventory Ansible是一种批量.自动部署工具 ...

  3. Ansible系列(五):playbook应用和roles自动化批量安装示例

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  4. Ansible系列(六):各种变量定义方式和变量引用

    本文目录:1.1 ansible facts1.2 变量引用json数据的方式 1.2.1 引用json字典数据的方式 1.2.2 引用json数组数据的方式 1.2.3 引用facts数据1.3 设 ...

  5. Ansible系列(三):YAML语法和playbook写法

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  6. Ansible系列(六):循环和条件判断

    本文目录:1. 循环 1.1 with_items迭代列表 1.2 with_dict迭代字典项 1.3 with_fileglob迭代文件 1.4 with_lines迭代行 1.5 with_ne ...

  7. Ansible系列(七):执行过程分析、异步模式和速度优化

    本文目录:1.1 ansible执行过程分析1.2 ansible并发和异步1.3 ansible的-t选项妙用1.4 优化ansible速度 1.4.1 设置ansible开启ssh长连接 1.4. ...

  8. Ansible系列(四):playbook应用和roles自动化批量安装示例

    Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html playbook是ansible实现批量自动化最重要的手段.在其中可以使用变 ...

  9. Ansible系列(五):各种变量定义方式和变量引用

    Ansible系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 1.1 ansible facts facts组件是用来收集被管理节点信息的 ...

  10. 自动化运维工具ansible学习+使用ansible批量推送公钥到远程主机

    目录: 一.ansible简介 1.1.ansible是什么 1.2.ansible如何工作 1.3.ansible优缺点 1.4.ansible安装方式 1.5.ansible文件简单介绍 1.6. ...

随机推荐

  1. Finereport11 类Excel筛选

    微信公众号:次世代数据技术 关注可了解更多的教程.问题或建议,请公众号留言或联系本人; 微信号:weibw162 本教程视频讲解可以关注本人B站账号进行观看:weibw162 一.需求描述 在使用FI ...

  2. Android开发 活动activity

    一.关于Activity 关于Activity必须要了解的内容有:Activity的生命周期.android任务栈.Activity启动模式.scheme跳转协议. 1.1  什么是Activity ...

  3. openstack-train-ovs-ceph 部署

    第一章 Openstack简介 https://baike.baidu.com/item/OpenStack/342467?fr=aladdin Openstack框架图![img](file:/// ...

  4. 构筑立体世界,AR Engine助力B站会员购打造沉浸式营销

    随着购物场景的逐渐多元化,越来越多电商平台把线下购物体验搬到线上,运用AR技术,跨越空间距离,帮助用户在购买前"体验"商品,增强购买意愿. 哔哩哔哩会员购(后称会员购)是B站于20 ...

  5. CabloyJS 4.22重磅推出弹出式页面交互风格

    升级说明 我们知道CabloyJS提供了pc=mobile+pad自适应布局机制,可以通过一套代码同时适配mobile端和pc端.基本思路就是优先适配mobile端,然后再把mobile端的交互体验带 ...

  6. Java实现打包压缩文件或文件夹生成zip以实现多文件批量下载

    有时候在系统中需要一次性下载多个文件,但逐个下载文件比较麻烦.这时候,最好的解决办法是将所有文件打包成一个压缩文件,然后下载这个压缩文件,这样就可以一次性获取所有所需的文件了. 下面是一个名为Comp ...

  7. Redis Stack功能介绍及redis-om-dotnet使用示例

    为了简化开发人员对较新的 Redis 模块及其提供的功能的体验,同时简化支持其功能的文档和客户端.以帮助开发人员从开始使用 Redis 的那一刻起,就能充分提高工作效率.Redis Stack诞生了. ...

  8. redis 简单整理——redis shell[九]

    前言 简单介绍一下redis的shell命令. 正文 redis 提供了一些工具,如redis-cli.redis-server.redis-benchmark等. redis-cli -r 对red ...

  9. 简单介绍 Vue 3.0 项目创建

    一.前期转杯 确保电脑上已安装 node.js. 可通过命令 npm --version进行查询,如果展示了版本号,则说明已安装,若提示 npm 不是有内部或外部命令,也不是可运行的程序,则说明未安装 ...

  10. 技术人如何"结构化"高效思考?

    1 前言 你是否在解决问题时,常常觉得脑子很乱,很多零散的信息迸发出来,但就是无法形成解决方案. 之所以这样,原因就在于,我们的大脑处理不了太多零散而复杂的信息.人类大脑在处理信息的时候,有两个规律: ...