首页 > 解决方案 > 如何使用 ansible api 进行变量替换?

问题描述

我只是想解析 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}}"

show_vars.yml

- 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 扩展变量?

标签: pythonansible

解决方案


由于 Ansible 不对 vars 进行 jinja2 评估,您必须首先从 playbook 或其他方式评估这些值,然后使用您刚刚评估的内容填充新的清单文件。


推荐阅读