当我尝试从set_fact中的另一个变量将值“追加”到变量“ recdb”时,我得到的变量是未定义错误。
下面是我的剧本:
- name: "Collecting information"
shell: "ls -l {{ item }}\n\"
register: APP
with_fileglob:
- "{{ playbook_dir }}/tmpfiles/*"
- set_fact:
fdet: "{{ APP.results|map(attribute='stdout')|list }}"
- set_fact:
recdb: "{{ recdb + inventory_hostname }}"
- set_fact:
recdb: "{{ recdb + item }}"
loop: "{{ fdet }}"
- debug: msg="SOLUTION FOR TRICKY {{ recdb }}"
recdb变量的预期输出应如下所示:
10.7.7.111
177 0 -rw-rw-r-- 1 user1 was 0 Sep 23 10:29 /was/user1/fname1.out
177 0 -rw-rw-r-- 1 user1 was 0 Sep 23 10:29 /was/user1/fname2.out
10.9.12.11
177 0 -rw-rw-r-- 1 user1 was 0 Sep 23 10:29 /was/user1/fname1.out
177 0 -rw-rw-r-- 1 user1 was 0 Sep 23 10:29 /was/user1/fname2.out
但是,我在运行剧本时遇到以下错误。
致命:[10.9.12.11]:失败! => {“ msg”:“该任务包括带有未定义变量的选项。错误是:'recdb'未定义\ n \ n错误似乎在'/app/deploy.yml'中:第942行,第6列,但可能\ n根据确切的语法问题,不在文件中的其他位置。\ n \ n出现问题的行似乎是:\ n \ n \ n-set_fact:\ n ^此处\ n“}
答案 0 :(得分:2)
没有语法错误,只有一个未定义的变量。
您的代码:
- set_fact:
recdb: "{{ recdb + inventory_hostname }}"
这是明确地告诉ansible:
采用
recdb
的当前值,添加inventory_hostname
的值(作为字符串或列表操作,我无法从您的代码中得知...。)并将结果分配给{{ 1}}变种。
在此操作中,如果未首先定义recdb
,则会收到未定义的var错误。
Ansible有一个default
filter来处理这种情况。我唯一的问题是知道您是要连接两个字符串还是要连接两个列表。因此,我将举两个例子。
连接字符串
recdb
加入列表
- set_fact:
my_string_var: "{{ my_string_var | default('') + my_string_var_to_concat }}"
如果您要一次添加多个值:
- set_fact:
my_list_var: "{{ my_list_var | default([]) + [my_new_value] }}"