我尝试过这个
---
- name: py
hosts: master
tasks:
- name:
command: /home/vagrant/test.py
register: csvfile
changed_when: false
- debug:
var: csvfile
- name: Create csvfile directories
file:
path: "/tmp/{{ item.host }}_{{ item.app }}"
state: directory
with_dict: "{{ csvfile }}"
Test.py
结果是:
{'key': 'stdout_lines', 'value': ["{'host': '123', 'app': 'abc'}", "{'host': '2345', 'app': 'def'}", "{'host': '8484', 'app': 'ghju'}", "{'host': '89393', 'app': 'yruru'}"]}
我在"/{{ item.host }}_{{ item.app }}"
上遇到错误
有人可以帮我吗?
答案 0 :(得分:0)
有一堆错误,所以虽然这是一个“答案”,因为它太大了,无法在此处对SO进行评论,但这并不是解决问题的方法,因为有太多错误和您的代码。
如您的调试输出所示,register:
捕获整个任务的输出,而不仅仅是捕获程序的输出。因此,至少您将需要with_dict: "{{ csvfile.stdout }}"
,但这也将不起作用,因为输出不是ansible可以使用的互操作性格式。仅仅因为它是用python编写的,而您的脚本是用python编写的,并不意味着他们可以交流
您需要对结果进行test.py
调用json.dump
或json.dumps
,而不仅仅是print()
或repr
或它现在正在调用的结果,以便输出可以通过ansible解析回您的剧本中的实际数据结构
然后,接下来要做什么取决于您是否继续按行从test.py
中写出每个字典,还是选择将它们全部打包到字典列表中并作为JSON转储>
首先将test.py
的输出固定为可以被ansible解析,然后我们将从那里开始
答案 1 :(得分:0)
注册变量 csvfile 必须具有属性 stdout_lines
csvfile:
stdout_lines:
- {'host': '123', 'app': 'abc'}
- {'host': '2345', 'app': 'def'}
- {'host': '8484', 'app': 'ghju'}
- {'host': '89393', 'app': 'yruru'}
简单的循环就可以完成工作
- name: Create csvfile directories
file:
path: "/tmp/{{ item.host }}_{{ item.app }}"
state: directory
loop: "{{ csvfile.stdout_lines }}"
很可能是 with_dict 添加了key/value
分解。请确认,更新并解决问题。发布任务的输出
- debug:
var: csvfile
答案 2 :(得分:0)
Sumanth,您可以尝试使用相同的方法,但要使用with_items:
- name: Create csvfile directories
file:
path: "/tmp/{{ item.host }}_{{ item.app }}"
state: directory
with_items: "{{ csvfile.stdout_lines }}"