[TOC]
### when 语句
#### 使用 when 来判断这台主机是否要执行
```
# 只有当系统是Debian的时候才执行
tasks:
- name: XXXXXX
command: XXXXXXX
when: ansible_os_family == "Debian"
```
#### 根据某条命令的成功或失败来执行不同的语句
使用`ignore_errors: True` 来忽略语句执行是否成功,避免在之后的 task 中不在该主机上执行
```
tasks:
- command: /bin/false
register: result # 将语句执行的结果赋值给 result
ignore_errors: True
- command: /bin/something
when: result|failed
- command: /bin/something_else
when: result|success
- command: /bin/still/something_else
when: result|skipped
```
#### 文本类型转成数值类型
比如某个文件中记录了应用的版本,内容如下:
`10`
这个时候可以这样来对字符串进行操作
```
tasks:
- name: read txt file
shell: car /pwd/file.txt
register: version # 这个时候version的值是10,但是这个是文本格式,不能比较数值
when: version|int ==10 # 使用 |int 将version 的内容转换成数值类型
```
#### 判断奇偶性
`even`:判断数值是否是偶数,是偶数则返回真
`odd`:判断数值是否是奇数,是奇数则返回真
`divisibleby(num)`:判断是否可以整除指定的数值,如果除以指定的值以后余数为0,则返回真
```
vars:
num_1: 1
num_2: 2
num_3: 3
tasks:
- name XXXX
shell: XXXXX
when: num_1 is odd # 判断是否为奇数
- name: XXXX
shell: XXXXX
when: num_2 is even # 判断是都为偶数
- name: XXXX
shell:XXXX
when: num_3 is divisibleby(3) # 判断能不能被 3 这个数整除
```
#### 布尔值运算
```
vars:
value: true
tasks:
-name: XXX
when: value
-name: XXX
when: not value
```
#### 在 Roles 中使用 When 语句
```
- hosts: all
roles:
- { role: some_role , when: ansible_os_family == 'Debian' }
```
#### 带有条件的导入
不同的操作系统中,可能使用不同的变量,比如Centos中网络服务使用`network`,在Ubuntu中可能使用`networking`
```
---
- hosts: all
remote_user: root
vars_files:
- "vars/common.yml"
- [ "vars/{{ ansible_os_family }}.yml", "vars/os_defaults.yml" ]
tasks:
- name: make sure apache is running
service: name={{ apache }} state=running
```
- 如果是 Cenots 系统,则导入`var/centos.yaml`中网络服务名的变量`network`
- 如果是 Ubuntu 系统,则导入`var/ubuntu.yaml`中网络服务名的变量`networking`
- 如果 Centos 和 Ubuntu 文件都没有,那就使用默认的 `os_defaults.yml` 文件
