ansible的when条件判断
条件判断使用场景
- 1.基于可用内存
- 2.基于命令的输出,比如程序运行失败,然后就跳过或执行某个步骤
- 3.根据facts变量然后决定使用什么模板文件
- 4.根据cpu的数量来调优web服务器
- 5.比较register变量来决定是否一个服务状态要改变。例如md5
操作 | 举例 | 注释 |
---|---|---|
等于(string) | ansible_machine == ‘x86_64’ | 当架构等于x86 |
等于 | ansible_distribution == “RedHat” | 当前发行版是Rehdat |
等于 | ansible_distribution_major_version == “8” | 当前的系统版本是8 |
小于 | min_memory < 128 | 当最小内存小于128 |
大于 | min_memory > 128 | 当最小内存大于128 |
小于等于 | min_memory <= 256 | 当最小内存小于等于256 |
大于等于 | min_memory >= 512 | 当最小内存大于等于512 |
不等于 | min_memory != 512 | 当最小内存不等于512 |
被定义 | min_memory is defined | 当min_memory变量被定义 |
没有被定义 | min_memory is not defined | 当min_memory变量没有被定义 |
当某个值为True | memory_available | 当memory_available 为True |
取反 | not memory_available | 当memory_available 不为True |
当a在b(list)中 | centos in rhel | 当centos在rhel(列表)中 |
示例剧本
when判断在调用变量时,不用加"{{ }}"
示例1: 根据facts变量判断
如果剩余内存小于70,关闭防火墙服务
---
- hosts: all
name: test
tasks:
- name: 关闭firewalld服务
service:
name: firewalld
state: stopped
enabled: no
when: ansible_memfree_mb<70 # 如果剩余内存小于70,执行任务:关闭firewalld服务
示例2:裸变量定义
---
- name: task demo
hosts: all
vars:
# 定义一个变量为True
run_my_tasks: true
tasks:
- name: httpd is installd
yum:
name: httpd
when: run_my_tasks
# 当run_my_tasks为True时执行这个tasks
示例:当变量被定义时执行taks
当变量定义时运行示例:
下面这个play没有定义my_pkg变量,所以不会运行demo2这个tasks
---
- name: 变量判断演示2
hosts: all
tasks:
- name: demo2
yum:
name: "{{ my_pkg }}"
state: removed
when: my_pkg is defined
多条件 and or
字符串比较时,用““把字符串引起来
示例 | 注释 |
---|---|
ansible_distribution == “RedHat” and ansible_distribution_major_version == “8” | 当系统发行版是RedHat 且 系统版本是8 |
ansible_distribution == “RedHat” or ansible_distribution_major_version == “8” | 当系统发行版是RedHat 或 系统版本是8 |
当系统发行版是RedHat且内核版本等于3.10
when: ansible_distribution == "RedHat" and ansible_kernel == "3.10.0.327.e17.x86_64"
and多条件列表写法:
---
- name: 列表and条件判断演示
hosts: all
vars:
- var1: 1
- var2: 3
tasks:
- debug:
msg: "{{ var1 }} {{ var2 }}"
when: # 当var1 == 1 and var2 == 2 时才执行tasks
- var1 == 1
- var2 == 2
# var2变量的值是3,不满足条件,所以不会执行tasks
运行结果
# 条件不满足,跳过运行tasks
[student@workstation data-variables]$ ansible-playbook and.yml
PLAY [列表and演示] ***************************************************************************
TASK [Gathering Facts] *******************************************************************
ok: [servera.lab.example.com]
TASK [debug] *****************************************************************************
skipping: [servera.lab.example.com]
PLAY RECAP *******************************************************************************
servera.lab.example.com : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
or多条件嵌套条件
when: >可以像python 一样将条件扩起来,不要忘了when:后面要加 >回车。
loop结合when
- name: loop循环结合when判断演示
yum:
name: mariadb-server
loop: "{{ ansible_mounts }}"
when: item.mount == "/" and item.size_available > 300000000
# 当ansible_mounts.mount的值是/且ansible_mounts.size_available 大于300000000时才执行tasks