Python Ansible:无法设置vars变量

Python Ansible:无法设置vars变量,python,ansible,Python,Ansible,我正试图建立一个剧本,从我的主人那里收集某些信息。 因此,我将启动一些shell命令,并将其返回值存储在一个变量中。每个命令输出,例如“ls-la”都应与前者关联,因此如果所有主机都通过了,我将得到一个完整的列表 这是我的剧本: --- - name: try to set variable hosts: all vars: my_test_var: [] tasks: - name: just get a simple list and show it

我正试图建立一个剧本,从我的主人那里收集某些信息。 因此,我将启动一些shell命令,并将其返回值存储在一个变量中。每个命令输出,例如“ls-la”都应与前者关联,因此如果所有主机都通过了,我将得到一个完整的列表

这是我的剧本:

---
- name: try to set variable
  hosts: all

  vars:
    my_test_var: []

  tasks:

    - name: just get a simple list and show it
      shell: ls -la
      register: out
      my_test_var: "{{ my_test_var + out.stdout }}"

    - debug:
      msg: "Listing of current dir: {{ my_test_var }}"
因此,首先我创建一个名为:my_test_var的空列表,第一个任务应该附加ls-la命令的输出

但事实并非如此。 Ansible只是忽略变量。但为什么

[WARNING]: Ignoring invalid attribute: my_test_var

你的剧本有一些问题

1:

msg还需要一个缩进,您需要更改为:

- debug:
    msg: "Listing of current dir: {{ my_test_var }}"
2:

您无法从ls-al获得输出,并且在同一个任务中操作my_test_var。您需要使用不同的任务。关于这一点,请看下面我的剧本

3:

out.stdout变量是一个字符串变量,而my_test_变量是一个列表。如果要将整个out.stdout添加到列表中,则需要使用以下语法:

my_test_var: "{{ my_test_var + [ out.stdout ] }}"
如果您打算添加out.stdout_行,这是ls-al输出的每一行的列表,那么您的语法很好:

my_test_var: "{{ my_test_var + out.stdout_lines }}"
提示:

您不需要将my_test_var变量初始化为空列表。您可以通过以下方式使用默认过滤器:

my_test_var: "{{ my_test_var|default([]) + out.stdout_lines }}"
完整剧本如下:

---
- name: try to set variable
  hosts: localhost
  gather_facts: false

  vars:
    # my_test_var: []

  tasks:

    - name: just get a simple list and show it
      shell: ls -la
      register: out

    - name: print out
      debug:
        var: out

    - name: set the my_test_var to the output
      set_fact:
        my_test_var: "{{ my_test_var|default([]) + out.stdout_lines }}"

    - debug:
        var: my_test_var

嗨,非常感谢你的帮助。只有一件事:如果我有多个任务产生一些输出,我想添加到我的_test_var AFAIK中,我不能使用set_fact,因为一旦设置了它,你就不能覆盖它,你可以使用这个语法在my_test_var列表中附加更多的元素:my_test_var:{{my_test u var}default[]+}
---
- name: try to set variable
  hosts: localhost
  gather_facts: false

  vars:
    # my_test_var: []

  tasks:

    - name: just get a simple list and show it
      shell: ls -la
      register: out

    - name: print out
      debug:
        var: out

    - name: set the my_test_var to the output
      set_fact:
        my_test_var: "{{ my_test_var|default([]) + out.stdout_lines }}"

    - debug:
        var: my_test_var