Ansible 从 Python 脚本传递字典

Ansible 从 Python 脚本传递字典

我正在运行一个 Ansible 脚本,该脚本调用一个 python 脚本,该脚本操纵一些数据并将其转换为字典。我想将 python 字典重定向到寄存器,然后使用它替换 json 文件的部分。我的脚本失败,没有任何消息。我可以单独运行 python 脚本,它会打印出字典。

我做错了什么?这是最好的方法吗?使用 shell、命令或脚本来调用 python 脚本更好吗?

pyscript.py
pydict[pykey] = pyvalue
print (pydict)


ansiblescript.yml
---
- hosts: 10.215.237.238
  tasks:  

  - name : Gather info
    shell: '/usr/bin/python /home/devoper/scripts/pyscript.py'
    register: pydict


  - name: Insert Info
    replace:
      destfile: /home/devoper/scripts/template.json
      regexp: "KEY1"
      replace: "{{ pydict.pykey }}"
      backup: yes

感谢您的时间。

答案1

注册变量有自己的键,如果你使用 -vvv 选项执行 ansible-playbook 就可以看到它。你不能直接将字典存储到注册变量中。

这取决于你需要实现什么,但我的建议如下:

  1. 创建自定义 ansible 模块。
  2. 执行自定义模块并存储返回值。
  3. 使用这些值作为字典。

创建自定义 ansible 模块

ansiblescript.yml
|_库
|_定制的pyscript.py

#!/usr/bin/python

from ansible.module_utils.basic import *

def main():

    module = AnsibleModule(argument_spec={})
    pydict = {"key1": "result1"}
    module.exit_json(changed=False, meta=pydict)

if __name__ == '__main__':  
    main()

执行自定义模块并存储返回值

ansiblescript.yml

---
- hosts: 10.215.237.238
  tasks:
- name: Gather info
  customized_pyscript:
  register: pydict

使用这些值作为字典

ansiblescript.yml

- name: Insert Info
  replace:
    destfile: /home/devoper/scripts/template.json
    regexp: "KEY1"
    replace: "{{ pydict.meta.KEY1 }}"
    backup: yes

相关内容