使用 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...] }}"
当我尝试从 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 ofinventory_hostname
and assign the result to therecdb
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...] }}"