python - 如何使用 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 扩展变量?
解决方案
由于 Ansible 不对 vars 进行 jinja2 评估,您必须首先从 playbook 或其他方式评估这些值,然后使用您刚刚评估的内容填充新的清单文件。
推荐阅读
- javascript - 当我将切好的图像重新组合到表格中时,如何阻止出现间隙?
- r - 隐藏 shindydashboard 正文中的按钮,直到呈现表格
- python-3.x - 如何从图像中裁剪绿色矩形
- docker - docker FROM 和 RUN apt-get 有什么区别?
- python - 如何在 sqlite3 中使用 blob 数据更新行?
- c# - ASP.NET Core 2.2 Razor Pages MVVM 查询 AspNetUsers 和 AspNetRoles 表
- php - 从不同的网络连接到 MySQL 数据库?
- css - 固定宽度的 Bootstrap 4 位置继承不起作用
- django - 让消息在一段时间内消失
- mysql - Wordpress move MySql 遇到 DATETIME DEFAULT SQL 错误:1067