Ansible 变量

时间:2021-11-17 21:00:45

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 里面声明的变量是否和上面有同样的要求, 待验证-???