首页 > 解决方案 > Ansible:将对象列表传递给python脚本

问题描述

我正在使用该script模块编写 Ansible 角色。脚本本身位于角色的files库中。环境变量test_var位于group_vars整个 playbook 文件夹下的 YAML 文件中:

---
- name: execute script
  script: python_script.py {{ test_var }}
  args:
    executable: python

如果它只是一种简单的“key=value”类型的参数,这很好用,但是我不确定我应该如何将复杂的项目(如列表或对象列表)传递给 python 脚本以将其用作 python 字典。

对此有最佳做法吗?

上面的 Ansible 角色只返回列表的第一项。

yaml 输入:

test_var:
  - val:
      something: 1
  - other_val:
    - '1'
    - '2'
    - '3'

蟒蛇代码:

import sys

i = 0

print('The first argument: ')
print sys.argv[1]
print(' ')

tmp_string = ""

print('Every argument printed out:')
for x in sys.argv:
  if i > 0:
    print x
    tmp_string += x
  i += 1

print(' ')
print('Concatenating together each argument:')
print tmp_string

结果:

changed: [localhost] => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to localhost closed.\r\n",
    "stderr_lines": [
        "Shared connection to localhost closed."
    ],
    "stdout": "The first argument: \r\n[{uval:\r\n \r\nEvery argument printed out:\r\n[{uval:\r\n{usomething:\r\n1}},\r\n{uother_val:\r\n[u1,\r\nu2,\r\nu3]}]\r\n \r\nConcatenateing together each argument:\r\n[{uval:{usomething:1}},{uother_val:[u1,u2,u3]}]\r\n",
    "stdout_lines": [
        "The first argument: ",
        "[{uval:",
        " ",
        "Every argument printed out:",
        "[{uval:",
        "{usomething:",
        "1}},",
        "{uother_val:",
        "[u1,",
        "u2,",
        "u3]}]",
        " ",
        "Concatenateing together each argument:",
        "[{uval:{usomething:1}},{uother_val:[u1,u2,u3]}]"
    ]
}

我不确定u每行开头的 s 该怎么做。

正如我所见,Ansible 将 yaml 的每一行作为不同的命令行参数传递,所以第一个只包含第一行。我可以将它们连接成一个带有for循环的单个字符串,但我不确定如何将其转换为字典或 python 可以使用的东西。

标签: pythonansible

解决方案


可能,您需要对变量应用过滤器。尝试这个:

---
- name: execute script
  script: python_script.py {{ test_var | to_yaml }}
  args:
    executable: python

推荐阅读