Ansible:无法设置vars变量

时间:2018-05-18 07:38:50

标签: 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
      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 个答案:

答案 0 :(得分:1)

您的剧本存在一些问题。

1:

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

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

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

2:

你无法从ls -al获得输出,并且在同一个任务中操纵my_test_var。你需要使用单独的任务。请看下面我的剧本。

3:

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

my_test_var: "{{ my_test_var + [ out.stdout ] }}"

如果您打算添加out.stdout_lines(这是ls -al输出的每一行的列表),您的语法很好:

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

提示:

您不需要将my_test_var变量“初始化”为空列表。您可以使用:{/ p>来使用default过滤器

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