1. 变量来源
- inventoryfile中定义
- playbook中定义
- include文件和角色中定义变量
- 系统facts ansible hostname -m setup
- local facts
2. 变量的使用
{{ ansible_eth0["ipv4"]["address"] }} 或者 {{ ansible_eth0.ipv4.address }}. 复杂变量可以像字典或者熟悉一样访问. 效果一样
3. 本地变量
ansible hostname -m setup 可以获取固定的系统facts, 在playbook中设置gather_fact:yes, playbook会自动获取远程机器的facts. 但是ansible也支持用户自定义facts
如果目标机器上有/etc/ansible/facts.d/目录, 在该目录下有.fact结尾的json ini 或者可执行并返回json过的脚本, 都可以作为本地便变量
例如
/etc/ansible/facts.d/preferences.fact: [general]
asdf=1
bar=2
使用变量 {{ ansible_local.preferences.general.asdf }}
4. 魔法变量
- hostvars 可以让你调用其他host的变量和facts, 即使你没有在这个机器上执行过playbook, 你仍然可以访问变量, 但是不能访问facts. 例如: {{ hostvars['test.example.com']['ansible_distribution'] }}
- group_names 当前host所在的group的组名列表. 包括其父组
- groups 所有组包括组中的hosts
- inventory_hostname 配置在inventory文件中当前机器的hostname
-
play_hosts
执行当前playbook的所有机器的列表 - inventory_dir inventory文件的路径
- inventory_file inventory文件的路径和文件名
- role_path 当前role的路径
5. 变量作用域
- 全局作用域: 设置在config, 环境变量, 和命令行中的变量
- play: 作用于play和包含的structure, 变量, role中的default和vars
- host: inventory, facts和register产生的变量, 只作用于某个host
Note 1: 子组的变量会覆盖父组的变量, host的变量会覆盖其组的变量
Note 2: 变量优先级
roles/x/defaults/main.yml -> inventory file -> roles/x/vars/main.yml -> 调用role时的参数 -> role play 中的变量 -> 执行命令-e 传入的变量.
6. fact缓存
如果想在一个host*问另一个host的fact 必须设置gathering
setting to smart
, 否则,如果你想访问另一个机器的fact, 那你必须在另外一台机器上执行过gather_fact.
inventory 里面声明的变量是否和上面有同样的要求, 待验证-???