变量定义
合法变量命名
以字母开头,包含字母、数字和下划线
合法 test,test_12
不合法
12_test,test-12,test#12,test.12
全局变量
定义在配置文件或者命令行中的变量
Play变量
定义在play当中
主机变量
定义在主机或者主机组
Playbook中的变量
定义变量
• 在vars中定义
- hosts: all
vars:
user: test
home: /home/test
• 在vars_files文件中定义
- hosts: all
vars_file:
- vars/users.yml
users.yml文件中定义的变量改内容
user: test
home: /home/test
变量引用
在playbook中引用变量时,使用双大括号“{{ }}”包围变量名称,而且要在前后括号建保留空格
- name: add user test
hosts: [node1,node2,node3]
vars:
username: test
tasks:
- name: add user {{ username }}
user:
name: "{{ username }}"
uid: 1001
state: present
...
注意:行6和行8的区别,当变量放置在赋值的首位时,需要双引号包围
字典变量
字典变量是由key:value方式构成
一个简单的字典:
name:tesla
复杂一点的字典:
users:
alice:
name: alice
sex: female
bob:
name: bob
sex: male
users:
user_a:
first_name: user
last_name: a
home_dir: /home/user_a
``````yaml
users:
user_a:
first_name: user
last_name: a
home_dir: /home/user_a
``````yaml
users:
user_a:
first_name: user
last_name: a
home_dir: /home/user_a
``````yaml
users:
user_a:
first_name: user
last_name: a
home_dir: /home/user_a
```引用方式:
• 如果需要获取bob的性别,表达式:
users.bob.sex或者users['bob']['sex']
以下是一个字典变量引用列子
```yaml
vars:
users:
alice:
name: Alice Appleworth
telephone: 123-456-7890
bob:
name: Bob Bananarama
telephone: 987-654-3210
tasks:
# with predefined vars
- name: Print phone records
debug:
msg: "User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})"
loop: "{{ lookup('dict', users) }}"
列表变量
如下是一个列表变量的定义,列表变量显著特征是通过破折号“-”或者通过中括号"[ ]"标识,要获得name的值,引用方式:employee1[0];同理,要获得employed的值,引用方式:employee1[3]
employee1:
- name: Martin D'vloper
- job: Developer
- skill: Elite
- employed: True
employee1[name: Martin D'vloper,job: Developer,skill: Elite,employed: True]字典和列表混合
如下employee2就是一个包含字典的单项列表,而employees就是一个包含字典的多项列表
```yaml employee2:
- name: Martin D'vloper
job: Developer
skill: Elite
employed: True
employees: - name: Martin D'vloper
job: Developer
skill: Elite
employed: True - name: bob
job: Developer
skill: Elite
employed: True字典和列表变量的引用
ansible 使用缩进来分割,如果有多行前面带有 – 的话,那就是 list , 如果不是则是 dict 。如果是多个 dict 并列组成一个 list , 那每个 dict 的第一对 key:value 需要有一个 – ,请参考最后这个例子里的变量内容。下面看看列表和字典如何引用:
`ok: [localhost] => {
"msg": {
"changed": false,
"datastores": [
{
"accessible": true,
"capacity": 23289061703680,
"datastore_cluster": "N/A",
"freeSpace": 7484953591808,
"maintenanceMode": "normal",
"multipleHostAccess": true,
"name": "vsanDatastore",
"provisioned": 30259182717392,
"type": "vsan",
"uncommitted": 14455074605520,
"url": "ds:///vmfs/volumes/vsan:52afb8b6b48c7f0c-6044a2809bb85992/"
}
],
"failed": false
}
}`
如果要获取"freeSpace"数值,首先我们知道datastores是一个列表变量,因为datastores后面是[],而且该变量中只有一个列表项(只有一个[]).
那么引用第一个列表项的表达式为:datastores[0]
"datastores": [
{
…
}
],
而在这个列表项中有嵌套一个字典(显示在{}中部分内容):
字典变量的引用方式是:key.dict或者key['dict'],注意,如果dict包含“.”时候,使用后一种引用方式,如key['192.168.10.5']。
{
"accessible": true,
"capacity": 23289061703680,
"datastore_cluster": "N/A",
"freeSpace": 7484953591808,
"maintenanceMode": "normal",
"multipleHostAccess": true,
"name": "vsanDatastore",
"provisioned": 30259182717392,
"type": "vsan",
"uncommitted": 14455074605520,
"url": "ds:///vmfs/volumes/vsan:52afb8b6b48c7f0c-6044a2809bb85992/"
}
那么,在以上字典和列表嵌套的情形下,需要引用到“FreeSpace”的值,写法应该是:
datastores[0].freeSpace或者datastores[0]['freeSpace']主机和主机组变量
变量定义
在清单文件中定义
因为不方便管理,该种方法已经不推荐使用[servers] servera remote_user=test # 为主机定义变量 [webserver] web1 web2 [webserver:vars] remote_user=test # 为主机组定义变量
使用变量文件夹
在inventory文件同级别目录下,创建host_vars和group_vars文件夹
如果需要为“servera”创建变量,那么,创建yaml格式文件host_vars/servera,文件内容为:
remote_user: test
如果需要为主机组“webserver”创建变量,那么创建yaml格式文件group_vars/webserver,文件内容为:
remote_user: test
此时是的目录结构类似如下:project | |--ansible.cfg |--group_vars | |--webserver | |--host_vars | |--servera | |--inventory | |--playbook.yml
数据变量
定义
users: user_a: first_name: user last_name: a home_dir: /home/user_a
引用变量
users.user_a.home_dir #返回/home/user_a
或者
users[‘user_a’][‘home_dir’]变量优先级别
命令行变量>>playbook变量>>主机和主机组变量