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

时间:2019-11-19 13:23:31

标签: variables ansible undefined

当我尝试从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“}

1 个答案:

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