python - 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 可以使用的东西。
解决方案
可能,您需要对变量应用过滤器。尝试这个:
---
- name: execute script
script: python_script.py {{ test_var | to_yaml }}
args:
executable: python
推荐阅读
- kotlin - 如何更改通过序列中的数字查找完美数字的程序,使其在一行中?
- python - Telethon 中的 iter 消息出现问题,错误输出异常
- java - 如何在不同的类中应用 Java Swing?
- java - 我什么时候应该模拟或不模拟外部/依赖的公共接口
- flutter - StatefulBuilder vs ValueListenableBuilder Flutter
- php - php中cookie中未定义的索引
- java - 创建新对象时,Java 对于一个完整的初学者来说似乎是多余的
- c# - SQLCipher - 以编程方式解密数据库
- rebol - 如何检查char是否符合charset?
- webpack - 使用 webpack.config.js 混合寓言中的本地和共享配置