我正在尝试制作一个从我的主机收集某些信息的剧本。 因此,我只需启动一些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
答案 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