文章目录
- 1. 变量简介
-
- 1.1 创建有效的变量名
- 1.2 变量范围
- 1.3 变量的优先级
- 2. 变量设定
-
- 2.1 在playbook中直接设定
- 2.2 在文件中设定
- 2.3 列表变量
- 2.4 字典变量
- 3. 主机清单变量
- 4. 目录中的变量
- 5. 注册变量
- 6. 引用嵌套事实变量
- 7. 魔术变量
变量详解官方文档
1. 变量简介
1.1 创建有效的变量名
- 只能包含字母,数字和下划线
- 不能出现Python关键字或剧本关键字
- 不能以数字开头
1.2 变量范围
Global | 由配置,环境变量和命令行设置 |
Play | 每次播放并包含结构,vars条目(vars; vars_files; vars_prompt),角色默认值和vars |
Host | 直接与主机相关联的变量,例如 inventory清单,include_vars,facts 或已注册的任务输出 |
- 优先级:Host>Play>Global
1.3 变量的优先级
通常,Ansible优先使用最近定义,更活跃且定义范围更广的变量。角色内默认文件夹中的变量很容易被覆盖。角色的vars目录中的所有内容都会覆盖名称空间中该变量的先前版本。主机和/或库存变量将覆盖角色默认值,但显式包含(如vars目录)或 include_vars
任务将覆盖inventory库存变量
优先级从 低→高 | |
---|---|
1 | 命令行值不是变量: |
2 | role defaults(在role / defaults / main.yml中定义) |
3 | inventory file or script group vars |
4 | inventory group_vars/all |
5 | playbook group_vars/all |
6 | inventory group_vars/* |
7 | playbook group_vars/* |
8 | inventory file or script host vars |
9 | inventory host_vars/* |
10 | playbook host_vars/* |
11 | host facts / cached set_facts |
12 | play vars |
13 | play vars_prompt |
14 | play vars_files |
15 | role vars(在role / vars / main.yml中定义) |
16 | block变量(仅适用于block中的任务) |
17 | 任务变量(仅适用于任务) |
18 | include_vars |
19 | set_facts /已注册的变量 |
20 | 角色(和include_role)参数 |
21 | 包含参数 |
22 | 额外的变量 (例如 )(始终优先) |
- 【在任何部分中,重新定义var都会覆盖前一个实例。如果多个模块组具有相同的变量,则最后一个加载者获胜。】
- 【在play的vars:部分中两次定义变量,则第二个变量获胜】
2. 变量设定
2.1 在playbook中直接设定
---
- hosts: test
vars:
http_port: 80 #通过修改变量值,控制tast组成员的Apache端口
tasks:
2.2 在文件中设定
变量文件:
---
web_pkg: httpd
playbook文件:
---
- host: test
vars_files:
- 变量文件的路径
tasks:
- name: 安装 apache
dnf:
name: "{{ web_pkg }}"
state: present
2.3 列表变量
定义列表变量
region:
- northeast
- southeast
也可以存储在方括号中[],并用逗号分隔
引用列表变量
2.4 字典变量
定义字典变量
foo:
field1: one
field2: two
引用字典变量
两种引用方式:
foo['field1'] #官方推荐
foo.field1
3. 主机清单变量
主机变量
[test]
server2 http_port=80 ansible_connection=ssh ansible_user=myotheruser
主机组变量
[test]
server2
[test:vars]
http_port=80
组的组的组变量
[test]
server2
[prod]
server3
[webserver:children]
test
prod
[webserver:vars]
http_port=80
4. 目录中的变量
- group_vars目录:清单变量(目录中的文件名称与主机清单名称一致)
- host_vars目录:主机变量(目录中的文件名称与主机名称一致)(取决于清单里是主机名还是ip)
示例:
#主机清单hosts
[test]
server1
则在文件group_vars/test中定义变量
5. 注册变量
- 使用task关键字从Ansible任务的输出中创建变量
,可以在剧本的任何后续任务中使用注册的变量register
- 注册变量是主机级变量。在具有循环的任务中注册变量时,注册的变量包含循环中每个项目的值。在循环期间放置在变量中的数据结构将包含一个
属性,该属性是模块中所有响应的列表results
---
- name: 测试Apache,返回直
uri:
url: "http://172.25.17.2:{{http_port}}"
return_content: yes
status_code: 200
register: result
- debug:
msg: "{{ result['stdout'] }}"
6. 引用嵌套事实变量
许多注册变量和事实变量是嵌套的YAML或JSON数据结构
Ansible事实是与远程系统相关的数据,包括操作系统,IP地址,附加的文件系统等
引用事实变量
{{ ansible_facts["网卡"]["ipv4"]["address"] }}
{{ ansible_facts.网卡.ipv4.address }}
查看事实变量:
ansible <hostname> -m setup
缓存事实变量
与注册变量一样,事实默认情况下将事实存储在内存中。但是,与注册变量不同,事实可以独立收集并缓存以供重复使用。使用缓存的事实,即使Ansible首先在第二个系统上执行当前播放,也可以在配置第二个系统时从一个系统引用事实
禁用事实变量
- hosts: whatever
gather_facts: no #禁用事实变量
7. 魔术变量
- 魔术变量是Special Variables。魔术变量名称是保留的,请勿使用这些名称设置变量。该变量环境也被保留
- 常用的魔术变量:
- hostvars
- groups
- group_names
- inventory_hostname
- 使用hostvars,可以在剧本的任何位置访问为剧本中的任何主机定义的变量。也可以使用hostvars变量来访问Ansible事实
使用groups清单中所有组(和主机)的列表,枚举组中的所有主机
{% for host in groups['组名'] %}
# something that applies to all app servers.
{% endfor %}
使用groups和hostvars来查找组中的所有IP地址
{% for host in groups['组名'] %}
{{ hostvars[主机]['ansible_facts']['网卡名']['ipv4']['address'] }}
{% endfor %}
其他魔术变量 | |
---|---|
ansible_play_hosts | 是当前播放中仍处于活动状态的所有主机的列表 |
ansible_play_batch | 是主机名的列表,该主机名属于该剧的当前“批处理” |
serial | 批处理大小(如果未设置,则等于整个运行) |
ansible_playbook_python | 是用于调用Ansible命令行工具的python可执行文件的路径 |
inventory_dir | 是保存Ansible的清单主机文件的目录的路径名 |
inventory_file | 是指向Ansible的清单主机文件的路径名和文件名 |
playbook_dir | 包含剧本的基本目录 |
role_path | 包含当前角色的路径名,并且仅在角色内部起作用 |
ansible_check_mode | 是一个布尔值,True如果使用来运行Ansible ,则设置为--check |
示例: