回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在使用<code>script</code>模块编写一个Ansible角色。脚本本身位于角色的<code>files</code>库中。环境变量<code>test_var</code>位于整个playbook的<code>group_vars</code>文件夹下的YAML文件中:</p>
<pre><code>---
- name: execute script
script: python_script.py {{ test_var }}
args:
executable: python
</code></pre>
<p>如果它只是一个简单的“key=value”类型的参数,那么它就可以很好地工作,但是我不确定如何将列表或对象列表之类的复杂项传递给python脚本以将其用作python字典。你知道吗</p>
<p>有没有最佳实践?你知道吗</p>
<p>上面的Ansible角色只返回列表的第一项。你知道吗</p>
<p>yaml输入:</p>
<pre><code>test_var:
- val:
something: 1
- other_val:
- '1'
- '2'
- '3'
</code></pre>
<p>python代码:</p>
<pre><code>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
</code></pre>
<p>结果:</p>
<pre><code>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]}]"
]
}
</code></pre>
<p>我不知道如何处理每行开头的<code>u</code>。你知道吗</p>
<p>正如我看到的,Ansible将yaml的每一行作为不同的命令行参数传递,因此第一行只包含第一行。我可以用<code>for</code>循环将它们连接成一个字符串,但我不知道如何将其转换成字典或python可以使用的东西。你知道吗</p>