判断的关键字是: when
ansible判断用的是jinja2的模板
1.判断数字的大小(大于等于小于)
---
- hosts: testB
remote_user: root
gather_facts: no
tasks:
- debug:
msg: "{{item}}"
with_items: [1,2,3]
when: item > 1
2.判断字符串
逻辑与
---
- hosts: testB
remote_user: root
tasks:
- debug:
msg: "System release is Redhat7"
when: ansible_distribution == "RedHat" and ansible_distribution_version == "7.5"
另外一种写法:
---
- hosts: testB
remote_user: root
tasks:
- debug:
msg: "System release is Redhat7"
when:
- ansible_distribution == "RedHat"
- ansible_distribution_version == "7.5"
逻辑或
---
- hosts: testB
remote_user: root
tasks:
- debug:
msg: "System release is Redhat7"
when: ansible_distribution == "RedHat" and (ansible_distribution_version == "7.5" or ansible_distribution_version == "7.3")
逻辑非
---
- hosts: testB
remote_user: root
tasks:
- debug:
msg: "System release is not windows"
when: not ansible_distribution == "Windows"
3.ignore_errors 忽略错误继续执行
---
- hosts: testB
remote_user: root
tasks:
- name: task1
shell: "ls /testaaa"
register: returnmsg
ignore_errors: true 忽略错误依然执行下面的task
- name: task2
debug:
msg: "Command execution successful"
when: returnmsg.rc == 0
- name: task3
debug:
msg: "Command execution failed"
when: returnmsg.rc != 0
---
- hosts: testB
remote_user: root
tasks:
- name: task1
shell: "dateeee"
register: returnmsg
ignore_errors: true
- name: tasks
debug:
var: returnmsg
4.判断文件是否存在(is exists or is not exists or not is exists)
---
- hosts: testB
remote_user: root
vars:
testpath: /testdir
tasks:
- debug:
msg: "file exist"
when: testpath is exists
---
- hosts: testB
remote_user: root
vars:
testpath: /testdieer
tasks:
- debug:
msg: "file not exist"
when: testpath is not exists
---
- hosts: testB
remote_user: root
vars:
testpath: /testdieer
tasks:
- debug:
msg: "file not exist"
when: not testpath is exists
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
testvar: "rico"
testvar1:
tasks:
- debug:
msg: "Variable is defined"
when: testvar is defined
- debug:
msg: "Variable is no defined"
when: testvar2 is undefined
- debug:
msg: "The variable is defined, but there is no value"
when: testvar1 is none
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
doshell: "yes"
tasks:
- shell: "cat /testdir/alll"
when: doshell == "yes"
register: returnmsg
ignore_errors: true
- debug:
msg: "success"
when: returnmsg is success
- debug:
msg: "failed"
when: returnmsg is failure
- debug:
msg: "changed"
when: returnmsg is change
- debug:
msg: "skip"
when: returnmsg is skip
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
var1: "/testdir/test"
var2: "/testdir/"
var3: "/testdir/testsoftlink"
var4: "/testdir/testhardlink"
var5: "/boot"
tasks:
- debug:
msg: "file"
when: var1 is file
- debug:
msg: "directory"
when: var2 is directory
- debug:
msg: "link"
when: var3 is link
- debug:
msg: "link"
when: var4 is link
- debug:
msg: "mount"
when: var5 is mount
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
var1: "abc"
var2: "ABC"
tasks:
- debug:
msg: "the string is all lowercase"
when: var1 is lower
- debug:
msg: "the string is all uppercase"
when: var2 is upper
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
num1: 6
num2: 9
num3: 81
tasks:
- debug:
msg: "an even num"
when: num1 is even
- debug:
msg: "an odd num"
when: num2 is odd
- debug:
msg: "can be divided exactly by"
when: num3 is divisibleby(9)
---
- hosts: testB
remote_user: root
vars:
var1: 7.4.1708
var2: 7.4.1707
tasks:
- debug:
msg: "This message can be displayed when the var1 is greater than var2"
when: var1 is version(var2,">")
- debug:
msg: "system version {{ansible_distribution_version}} greater than 7.3"
when: ansible_distribution_version is version("7.3","gt")
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
a:
- 1
- 10
b: [1,4,6,10,11]
tasks:
- debug:
msg: "A is subset B"
when: a is subset(b)
- debug:
msg: "B is the parent set of A"
when: b is superset(a)
判断一个对象是否是字符串
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
var1: 1 不是
var2: "2" 是
var3: b 是
tasks:
- debug:
msg: "the variable is string"
when: var1 is string
- debug:
msg: "the variable is string"
when: var2 is string
- debug:
msg: "the variable is string"
when: var3 is string
判断对象是否是数字
---
- hosts: testB
remote_user: root
gather_facts: no
vars:
var1: 1
var2: "2" 不是
var3: 0.3 是
tasks:
- debug:
msg: "the variable is number"
when: var1 is number
- debug:
msg: "the variable is number"
when: var2 is number
- debug:
msg: "the variable is number"
when: var3 is number
block: 当条件成立时,执行多个任务
---
- hosts: testB
remote_user: root
tasks:
- debug:
msg: "task1 not in block"
- block:
- debug:
msg: "task2 in block"
- debug:
msg: "task3 in block"
when: 2 > 1
如果任务一执行失败则执行任务二 如果成功则不执行任务二
---
- hosts: testB
remote_user: root
tasks:
- shell: "ls /omn"
register: return_value
ignore_errors: true
- debug:
msg: "I cought an error"
when: return_value is failed
rescue:如果block执行失败,就执行rescue中的语句
如果成功,就不执行
注意:只有block错误才会执行rescue
---
- hosts: testB
remote_user: root
tasks:
- block:
- shell: "ls /omn"
rescue:
- debug:
msg: "I cought an error"
按顺序执行,任意一个出错就会执行rescue,后面的不执行
---
- hosts: testB
remote_user: root
tasks:
- block:
- shell: "ls /opt"
- shell: "ls /omn"
- shell: "ls /testdir"
rescue:
- debug:
msg: "I cought an error"
在rescue中输出多个任务
---
- hosts: testB
remote_user: root
tasks:
- block:
- shell: "ls /opt"
- shell: "ls /omn"
- shell: "ls /testdir"
rescue:
- debug:
msg: "I cought an error1"
- debug:
msg: "I cought an error2"
always: 不管怎样都执行
---
- hosts: testB
remote_user: root
tasks:
- block:
- debug:
msg: "I execute normally"
- command: /bin/false 出错
- debug:
msg: "I never execute, due to the above task failing"
rescue:
- debug:
msg: "I cought an error"
- command: /bin/false 出错
- debug:
msg: "I also never execute"
always:
- debug:
msg: "This is always execute"
fail: 强制终止playbook运行
---
- hosts: testB
remote_user: root
tasks:
- debug:
msg: 1
- fail:
- debug:
msg: 2
fail提示信息也可以自定义
---
- hosts: testB
remote_user: root
tasks:
- debug:
msg: 1
- fail:
msg: "stop"
- debug:
msg: 2
判断,条件满足停止playbook
---
- hosts: testB
remote_user: root
tasks:
- shell: "echo '--error--'"
register: return_value
- fail:
msg: "running fail"
when: "'error' in return_value.stdout"
- debug:
msg: "I nerver execute, Because the playbook has stopped"
---
- hosts: testB
remote_user: root
tasks:
- shell: "echo '--zzzeeee--'"
register: return_value
- fail:
msg: "running fail"
when: "'error' in return_value.stdout"
- debug:
msg: "I nerver execute, Because the playbook has stopped"
failed_when: 当条件成立 执行状态设置为失败
并不代表任务真正的失败
从判断条件出发,而不是shell执行结果
---
- hosts: testB
remote_user: root
tasks:
- debug:
msg: "I execute normally"
- shell: "echo 'This is a string for testing error'"
register: return_value
failed_when: '"error" in return_value.stdout'
- debug:
msg: "I never execute,Because the playbook has stopped"
changed_when: 当条件成立时,将对应的状态设置为changed
---
- hosts: testB
remote_user: root
tasks:
- debug:
msg: "test message"
changed_when: 2 > 1 将状态设置为changed 从绿色变为黄色
---
- hosts: testB
remote_user: root
tasks:
- shell: "ls /opt"
改变执行状态
---
- hosts: testB
remote_user: root
tasks:
- shell: "ls /opt"
changed_when: false