我只想解析ansible清单并获取变量值。以下是ansible项目的一个示例:
├── inventory
│ ├── hosts.yml
└── show_vars.yml
hosts.yml:
all:
children:
local:
hosts:
localhost:
ansible_connection: local
vars:
var01: "example value01"
var02: "example value02"
var_sub01: "var01 is {{var01}}"
var_sub02: "var02: {{var02}}; var01: {{var01}}"
var_sub03: "var_sub01 is {{var_sub01}}"
演出
- hosts: all
connection: local
vars:
save_hostvars_to_dir: "/tmp"
tasks:
- debug:
msg: "{{hostvars[ansible_host]}}"
- copy:
content: "{{hostvars[ansible_host]}}"
dest: "{{save_hostvars_to_dir}}/{{ansible_host}}.hostvars.json"
delegate_to: localhost
我尝试像这样使用ansible api:
import os
from ansible.vars.manager import VariableManager
from ansible.inventory.manager import InventoryManager
from ansible.parsing.dataloader import DataLoader
def get_host_vars_via_api(host_name: str, ansible_dir: str):
loader = DataLoader()
inventory = InventoryManager(loader=loader, sources=os.path.join(ansible_dir, 'inventory'))
var_manager = VariableManager(loader=loader, inventory=inventory)
return var_manager.get_vars(host=inventory.get_host(host_name))
当我使用该函数时,我得到:
>>> from pprint import pprint
>>> pprint(get_host_vars_via_api('localhost', './'))
{'ansible_version': 'Unknown',
'group_names': ['local'],
'groups': {'all': ['localhost'], 'local': ['localhost'], 'ungrouped': []},
...
'var01': 'example value01',
'var02': 'example value02',
'var_sub01': 'var01 is {{var01}}',
'var_sub02': 'var02: {{var02}}; var01: {{var01}}',
'var_sub03': 'var_sub01 is {{var_sub01}}'}
替换不是在这里发生的。如何使用ansible api扩展变量
由于Ansible不在VAR上进行jinja2评估,因此您必须首先从playbook或其他方式评估这些值,然后用刚刚评估的内容填充新的库存文件
Ansible不在任何vars文件(包括库存文件)中进行jinja2评估(因此也不进行变量解析)。但是,在尝试使用这些变量时,它将执行递归jinja2求值,这可能会使vars文件看起来好像是在加载时求值的
我们可以看到,通过使用变量,而无需ansible触摸它;创建hello-world-y vars文件
然后展示两种不同的结果:
相关问题 更多 >
编程相关推荐