【发布时间】:2022-01-13 11:29:19
【问题描述】:
首先,这是我关于 SO 的第一个问题 - 它可能不完全符合 SO 标准。
我试图弄清楚如何将 ansible 剧本文件转换为 python 数据结构,如 docs.ansible.com 中提到的in this document。
# create data structure that represents our play, including tasks, this is basically what our YAML loader does internally.
play_source = dict(
name="Ansible Play",
hosts=host_list,
gather_facts='no',
tasks=[
dict(action=dict(module='shell', args='ls'), register='shell_out'),
dict(action=dict(module='debug', args=dict(msg='{{shell_out.stdout}}'))),
dict(action=dict(module='command', args=dict(cmd='/usr/bin/uptime'))),
]
)
我想这样做的原因是,Play() 不接受原始 yaml 文件,并且该示例很好地挂钩到提供的 ResultsCollectorJSONCallback(),这为我提供了一种捕获输出的好方法。我'我很清楚有一个 Playbook Executor 但并没有完全削减它,因为所有输出都转储到标准输出。
这段代码可以将其捕获到每个主机的文件中(也来自文档):
print("UP ***********")
for host, result in results_callback.host_ok.items():
print('{0} >>> {1}'.format(host, result._result['stdout']))
print("FAILED *******")
for host, result in results_callback.host_failed.items():
print('{0} >>> {1}'.format(host, result._result['msg']))
print("DOWN *********")
for host, result in results_callback.host_unreachable.items():
print('{0} >>> {1}'.format(host, result._result['msg']))
我试图找到 ansible 将 yaml 转换为该 python 数据结构的任何文档。评论清楚地表明“这基本上是我们的 YAML 加载器在内部执行的操作。”但我无法弄清楚他们是如何做到的,甚至试图弄清楚 PlaybookExecutor 是如何做到的,但要看到真正发生的事情非常复杂。我希望在 ansible 的 yaml 解析例程中的某处找到一个 yaml_to_datastructure 函数,但未能找到它。有没有人有这方面的经验?
我的剧本仅用于测试目的:
--- - 主持人:所有 变成:没有 任务: - 名称:创建文件夹 文件: 路径:/tmp/playbook_user 状态:目录 所有者:playbook_user - 外壳:“uname -a” 寄存器:输出 - 名称:在屏幕上给出输出 调试: var: output.stdout_lines - 名称:将输出保存到本地目录 复制: 内容:“{{ output.stdout | replace('\\n', '\n') }}” dest: "/tmp/playbook_user/test_{{ ansible_date_time.date }}_{{ inventory_hostname }}.txt" - 本地操作: 模块:复制 内容:“{{ output.stdout | replace('\\n', '\n') }}” 目标:/tmp/show_cmd_ouput_{{ inventory_hostname }}.txt 运行一次:真问候, 斯杰德
【问题讨论】:
-
您有 yaml 文件的示例吗?可能使用 rueml (yaml.readthedocs.io) 可以正常工作,请参见此处的示例:stackoverflow.com/questions/64342890/…
标签: python python-3.x ansible