[TOC]
## 变量
#### Facts 变量
在执行`ansible-playbook`命令的时候,`ansible`才会默认采集`fact`信息

直接使用`ansible`就不会生效

#### 判断变量是都存在
使用关键字 `defind` 判断变量是否存在的方式来避免某些变量未定义的报错
```
tasks:
- name: XXX
shell: XXX {{ someone }}
when: someone is defined
- name: XXX
shell: XXX {{ someone }}
when: someone is not defined
```
#### 获取内置变量 Facts
在ansible中会内置一些默认采集的变量,比如远端系统的IP、系统版本、主机名等,可以通过下面的命令来获取远端所有的内置变量:
```
ansible XXX.XXX.XXX.XXX -m setup
```
会得到很多变量值的返回

> 关闭 Facts
> ```
> - host:all
> gather_facts: no
> ```
#### 引用内置变量


> **引用变量需要注意**
> 如果引用变量的时候,是直接以 {{ XXX }} is something 开头的
> 需要在引用变量的时候给这句话添加引号:“ {{ XXX }} is something ”
## 注册变量
#### 在 playbook 中使用 register 注册变量
```
- hosts: all
tasks:
- shell: /usr/bin/foo
register: var_1 # register 将shell 语句返回的结果赋值给 var_1
- shell: /usr/bin/bar
when: var_1 == 5
```
## 预留变量
hostvars’,’group_names’,‘groups’
#### 本台主机使用另外一台主机的变量
```
{{ hostvars['some_host'][some_vars] }}
```
#### 循环与判断主机组中的组员
```
# 判断
{% if 'server' in group_names %}
XXXXXXXXXXX
{% endif %}
```
```
#循环
{% for host in groups['group_name'] %}
XXXXX {{ host }}
{% endfor %}
```
## 其他方式定义变量
#### 在文件中定义变量
定义变量文件 `/pwd/var_file.yaml`
```
---
key_1: var_1
key_2: var_2
```
使用文件变量
```
---
- host: all
vars_files:
- /pwd/var_file.yaml
tasks:
- name: XXXXX
shell: echo {{ key_1 }}
```
#### 命令行中定义变量
定义变量
```
ansible-playbook release.yml --extra-vars "hosts=XXXX user=XXXXX"
```
使用变量
```
---
- hosts: '{{ hosts }}'
remote_user: '{{ user }}'
tasks:
```
## 变量的优先级
- 在命令行中使用 -e 优先级最高
- 在inventory中定义的连接变量(比如ansible_ssh_user)
- 大多数的其它变量(命令行转换,play中的变量,included的变量,role中的变量等)
- 在inventory定义的其它变量
- 由系统发现的facts
- 最是 "role默认变量", 这个是最默认的值
