概述
参考:http://www.zsythink.net/archives/2862
when
[root@localhost ~]#vim test.yml
---
- hosts: B
remote_user: root
tasks:
- debug: msg="system release is centos" #“”不能少
when: ansible_distribution == "CentOS" #==两端加空格, "CentOS"引号不能少。在when中变量名不用加{{}}
[root@localhost ~]#vim test.yml
---
- hosts: B
remote_user: root
tasks:
- debug: msg={{item}}
with_items: [1,2,3]
when: item > 2
运算比较符:
==
!=
>
<
>=
<=
and
or
not
()
---
- hosts: B
remote_user: root
tasks:
- debug:
msg: "System release is centos6 or centos7"
when: ansible_distribution == "CentOS" and (ansible_distribution_major_version == "6" or ansible_distribution_major_version == "7")
ignore_errors
ansible默认机制是当playbook中某个task执行失败,后面的task便不会执行。如想要跳过错误继续执行,需要ignore_errors
[root@localhost ~]#vim test.yml
---
- hosts: B
remote_user: root
tasks:
- shell: ls /data/f1
register: return #register:取得shell模块的返回结果并赋值给return
- debug: msg="success"
when: teturn.rc == 0 #rc:执行状态返回码。0为真,非0为假
- debug: msg="fail"
when: return.rc != 0
TASK [shell] *****************************************************************************************************
fatal: [192.168.91.132]: FAILED! => {"changed": true, "cmd": "ls /data/f1", "delta": "0:00:00.004392", "end": "2019-05-31 10:07:10.136161", "msg": "non-zero return code", "rc": 2, "start": "2019-05-31 10:07:10.131769", "stderr": "ls: cannot access /data/f1: No such file or directory", "stderr_lines": ["ls: cannot access /data/f1: No such file or directory"], "stdout": "", "stdout_lines": []}
PLAY RECAP *******************************************************************************************************
192.168.91.132 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
"non-zero return code", "rc": 2:非零返回码。rc为2.后面的task不会执行
[root@localhost ~]#vim test.yml
---
- hosts: B
remote_user: root
tasks:
- shell: ls /data/f1
register: return
ignore_errors: true #可以用yes代替true
- debug: msg="success"
when: teturn.rc == 0
ignore_errors: true
- debug: msg="fail"
when: return.rc != 0
exists
---
- hosts: B
remote_user: root
gather_facts: no
vars:
testpath: /testdir
tasks:
- debug:
msg: "file exist"
when: testpath is exists #exists关键字,注意检查的是ansible主机。is not exists表示不存在,也可以用not testpath is exists
判断变量的关键字
defined:判断变量是否已定义。已定义为真
undefined:判断变脸是否已定义。没定义为真
none: 判断变量值是否为空。已定义且为空为真
[root@localhost ~]#vim test.yml
---
- hosts: B
remote_user: root
vars:
var1: test
var2:
tasks:
- debug: msg="value is defined"
when: var1 is defined
- debug: msg="value is undefined"
when: var3 is undefined
- debug: msg="value is defined,but have no value"
when: var2 is none
判断执行结果的关键字
success|succeeded:通过task的返回信息判断任务执行状态,成功为真
failure|failed:通过task的返回信息判断任务执行状态,失败为真
change|changed:通过task的返回信息判断任务执行状态,执行状态为changed为真
skip|skipped:通过task的返回信息判断任务执行状态,当任务被跳过执行时为真
---
- hosts: test70
remote_user: root
gather_facts: no
vars:
doshell: "yes"
tasks:
- shell: "cat /testdir/abc"
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
判断路径的关键字
注意:如下关键字针对的是ansible主机,与目标主机无关
file:判断路径是否是一个文件。是文件为真
directory:判断路径是否是一个目录。是目录为真
link:判断路径是否是软连接。是则为真
mount:判断路径是否是挂载点,是则为真
exists:判断路径是否存在,存在为真
---
- hosts: B
remote_user: root
gather_facts: no
vars:
testpath1: "/testdir/test"
testpath2: "/testdir/"
testpath3: "/testdir/testsoftlink"
testpath4: "/testdir/testhardlink"
testpath5: "/boot"
tasks:
- debug:
msg: "file"
when: testpath1 is file
- debug:
msg: "directory"
when: testpath2 is directory
- debug:
msg: "link"
when: testpath3 is link
- debug:
msg: "link"
when: testpath4 is link
- debug:
msg: "mount"
when: testpath5 is mount
- debug:
msg: "exists"
when: testpath1 is exists
判断字符串的关键字
lower:
upper:
[root@localhost ~]#vim test.yml
---
- hosts: B
remote_user: root
vars:
var1: ABCD
var2: abcd
tasks:
- debug: msg="upper"
when: var1 is upper
- debug: msg="lower"
when: var2 is lower
判断字符串关键字
string:是字符串为真
---
- hosts: B
remote_user: root
gather_facts: no
vars:
testvar1: 1
testvar2: "1"
testvar3: a
tasks:
- debug:
msg: "This variable is a string"
when: testvar1 is string
- debug:
msg: "This variable is a string"
when: testvar2 is string
- debug:
msg: "This variable is a string"
when: testvar3 is string
testvar2,testvar3为真
判断数字关键字
number:对象是数字为真
---
- hosts: B
remote_user: root
gather_facts: no
vars:
testvar1: 1
testvar2: "1"
testvar3: 00.20
tasks:
- debug:
msg: "This variable is number"
when: testvar1 is number
- debug:
msg: "This variable is a number"
when: testvar2 is number
- debug:
msg: "This variable is a number"
when: testvar3 is number
判断子集父集关键字
subset:
superset:
---
- hosts: B
remote_user: root
gather_facts: no
vars:
a:
- 2
- 5
b: [1,2,3,4,5]
tasks:
- debug:
msg: "A is a subset of B"
when: a is subset(b)
- debug:
msg: "B is the parent set of A"
when: b is superset(a)
判断整除的关键字
even:奇数为真
odd:偶数为真
divisibleby(num):可以整除指定数字为真
---
- hosts: B
remote_user: root
gather_facts: no
vars:
num1: 4
num2: 7
num3: 64
tasks:
- debug:
msg: "An even number"
when: num1 is even
- debug:
msg: "An odd number"
when: num2 is odd
- debug:
msg: "Can be divided exactly by"
when: num3 is divisibleby(8)
block
在默认情况下,当条件判断成立时,只能执行一个任务。如要执行多个任务。使用block
---
- hosts: B
remote_user: root
tasks:
- debug:
msg: "task1 not in block"
- block:
- debug:
msg: "task2 in block1"
- debug:
msg: "task3 in block1"
when: 2 > 1
错误处理rescue
错误处理,通常与block一起使用
[root@localhost ~]#vim test.yml
---
- hosts: B
remote_user: root
tasks:
- block:
- shell: ls /000
- service: name=httpd state=started
rescue:
- debug: msg="error"
当block中的任意任务执行失败就会执行rescue中的任务
always
在always中的任务总是会被执行
---
- hosts: B
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 caught an error'
- command: /bin/false
- debug:
msg: 'I also never execute'
always:
- debug:
msg: "This always executes"
/bin/false执行后,跳到rescue中的debug,然后跳到always
fail模块
自定义一个错误来中断playbook的执行。通常与when一起使用
[root@localhost ~]#vim test.yml
---
- hosts: B
remote_user: root
tasks:
- debug: msg="1"
- debug: msg="2"
- fail: msg="custom error" #后面的任务不会执行,除非有ignore_errors存在
- debug: msg="3"
---
- hosts: B
remote_user: root
tasks:
- shell: "echo 'This is a string for testing--error'"
register: return_value #把shell执行的结果赋值给register变量,其中包含"error"字符串
- fail:
msg: "Conditions established,Interrupt running playbook"
when: "'error' in return_value.stdout" #in关键字。当变量中含有“error”字符串为真。注意:“”‘’不能少
- debug:
msg: "I never execute,Because the playbook has stopped"
fail_when
---
- hosts: B
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
当条件判断为真时,把执行状态从ok改为changed
---
- hosts: B
remote_user: root
tasks:
- debug:
msg: "test message"
changed_when: 2 > 1
最后
以上就是纯情雪碧为你收集整理的ansible条件判断的全部内容,希望文章能够帮你解决ansible条件判断所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复