我有一个ansible文件(my_file.yml
),看起来像这样:
---
- name: The name
hosts: all
tasks:
- include:my_tasks.yml
vars:
my_var: "{{ my_var }}"
my_tasks.yml
看起来像这样:
- name: Install Curl
apt: pkg=curl state=installed
- name: My task
command: bash -c "curl -sSL http://x.com/file-{{ my_var }} > /tmp/file.deb"
我想将my_var
作为命令行参数传递给ansible,所以我喜欢这样:
ansible-playbook my_file.yml --extra-vars "my_var=1.2.3"
但我最终得到以下错误:
... Failed to template {{ my_var }}: Failed to template {{ my_var }}: recursive loop detected in template string: {{ my_var }}
如果我vars
中的my_file.yml
看起来像这样:
- include:my_tasks.yml
vars:
my_var: "1.2.3"
它有效!我还尝试将变量名称更改为不等于my_var
的内容,例如:
- include:my_tasks.yml
vars:
my_var: "{{ my_var0 }}"
然后我最终得到了一个错误。在我看来,变量未展开,而是将字符串"{{ my_var }}"
或{{ my_var0 }}
传递给my_tasks.yml
。我该如何解决这个问题?
答案 0 :(得分:11)
您不需要明确地将my_var
传递给include
。包括额外变量在内的所有变量应该可以直接在任何地方使用所以简单地调用
ansible-playbook my_file.yml --extra-vars "my_var=1.2.3"
并在任务中使用它{{ my_var }}
应该有效。
- name: My task
command: bash -c "curl -sSL http://x.com/file-{{ my_var }} > /tmp/file.deb"
答案 1 :(得分:1)
在我的项目中遇到了同样的问题。事实证明,剧本和任务中的变量名称必须不同。
---
- name: The name
hosts: all
vars:
my_var_play: "I need to send this value to the task"
some_other_var: "This is directly accessible in task"
tasks:
- include:my_tasks.yml
vars:
my_var: "{{ my_var_play }}"
此外,在任务中可以访问剧本中的所有变量。只需在任务中使用{{ some_other_var }}
,它就可以正常工作。