如何使用ansible api进行变量替换?

2024-04-20 10:29:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我只想解析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扩展变量


2条回答

由于Ansible不在VAR上进行jinja2评估,因此您必须首先从playbook或其他方式评估这些值,然后用刚刚评估的内容填充新的库存文件

Ansible不在任何vars文件(包括库存文件)中进行jinja2评估(因此也不进行变量解析)。但是,在尝试使用这些变量时,它将执行递归jinja2求值,这可能会使vars文件看起来好像是在加载时求值的

我们可以看到,通过使用变量,而无需ansible触摸它;创建hello-world-y vars文件

# sample.yaml
hello: "{{ ansible_version }}"

然后展示两种不同的结果:

- hosts: localhost
  gather_facts: no
  vars_files:
  - sample.yaml
  tasks:
  - debug:
      msg: the hello from vars is {{ vars.hello }}
  - debug:
      msg: the hello in use is {{ hello }}

相关问题 更多 >