Variables Ansible变量未定义语法错误使用set_fact
当我尝试从set_fact中的另一个变量向变量“recdb”添加值时,我发现变量是未定义的错误 下面是我的剧本:Variables Ansible变量未定义语法错误使用set_fact,variables,ansible,undefined,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.r
- 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\u事实:\n^here\n”}
没有语法错误,只有一个未定义的变量 您的代码:
- set_fact:
recdb: "{{ recdb + inventory_hostname }}"
这明确地告诉ansible:
获取recdb
的当前值,添加inventory\u hostname
的值(作为字符串或列表操作,我无法从您的代码中看出…),并将结果分配给recdb
变量
在这个操作中,如果没有首先定义recdb
,您将得到一个未定义的var错误
Ansible有办法处理这种情况。我这里唯一的问题是要知道您是要连接两个字符串还是要连接两个列表。因此,我将为这两个方面给出一个例子
连接字符串
- 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_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...] }}"
没有语法错误,只有一个未定义的变量 您的代码:
- set_fact:
recdb: "{{ recdb + inventory_hostname }}"
这明确地告诉ansible:
获取recdb
的当前值,添加inventory\u hostname
的值(作为字符串或列表操作,我无法从您的代码中看出…),并将结果分配给recdb
变量
在这个操作中,如果没有首先定义recdb
,您将得到一个未定义的var错误
Ansible有办法处理这种情况。我这里唯一的问题是要知道您是要连接两个字符串还是要连接两个列表。因此,我将为这两个方面给出一个例子
连接字符串
- 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_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...] }}"
这回答了我的问题。谢谢你的意见,这回答了我的问题。谢谢你的投入。