在Ansible中使用python变量

时间:2019-12-26 18:38:00

标签: variables ansible ansible-facts

我尝试过这个

---
- 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 }}"上遇到错误

有人可以帮我吗?

3 个答案:

答案 0 :(得分:0)

有一堆错误,所以虽然这是一个“答案”,因为它太大了,无法在此处对SO进行评论,但这并不是解决问题的方法,因为有太多错误和您的代码。

如您的调试输出所示,register:捕获整个任务的输出,而不仅仅是捕获程序的输出。因此,至少您将需要with_dict: "{{ csvfile.stdout }}",但这也将不起作用,因为输出不是ansible可以使用的互操作性格式。仅仅因为它是用python编写的,而您的脚本是用python编写的,并不意味着他们可以交流

您需要对结果进行test.py调用json.dumpjson.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 }}"