使用 set_fact 的 Ansible 变量未定义语法错误

Ansible variable undefined syntax error using set_fact

当我尝试从 set_fact.

中的另一个变量将 'appending' 值赋给变量 '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

但是,我收到以下错误 运行 我的剧本。

fatal: [10.9.12.11]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'recdb' is undefined\n\nThe error appears to be in '/app/deploy.yml': line 942, column 6, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - set_fact:\n ^ here\n"}

没有语法错误,只有一个未定义的变量。

您的代码:

- set_fact:
    recdb: "{{ recdb + inventory_hostname }}"

这是明确告诉 ansible 的:

Take the current value of recdb, add (either as string or list operation, I cannot tell from your code....) the value of inventory_hostname and assign the result to the recdb var.

在这个操作中,如果recdb没有首先定义,你会得到一个undefined var错误。

Ansible 有一个 default filter 来处理这种情况。我这里唯一的问题是要知道您是要连接两个字符串还是要加入 2 个列表。因此,我将为两者举一个例子。

连接字符串

- 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] }}"

如果您要同时添加多个值:

- set_fact:
    my_list_var: "{{ my_list_var | default([]) + [my_new_value1, my_new_value2, my_new_value3...] }}"