如何将变量传递给ansible中包含的任务?

Joh*_*han 6 ansible ansible-playbook

我有一个ansible文件(my_file.yml),看起来像这样:

---
- name: The name
  hosts: all
  tasks:

    - include:my_tasks.yml
      vars:
          my_var: "{{ my_var }}"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

我想my_var作为命令行参数传递给ansible,所以我喜欢这样:

ansible-playbook my_file.yml --extra-vars "my_var=1.2.3"
Run Code Online (Sandbox Code Playgroud)

但我最终得到以下错误:

... Failed to template {{ my_var }}: Failed to template {{ my_var }}: recursive loop detected in template string: {{ my_var }}
Run Code Online (Sandbox Code Playgroud)

如果我vars在里面my_file.yml看起来像这样:

- include:my_tasks.yml
  vars:
      my_var: "1.2.3"
Run Code Online (Sandbox Code Playgroud)

有用!我也尝试将变量名称更改为不等于的值my_var,例如:

- include:my_tasks.yml
  vars:
      my_var: "{{ my_var0 }}"
Run Code Online (Sandbox Code Playgroud)

但后来我最终得到了一个错误.在我看来,变量没有扩展,而是字符串"{{ my_var }}"{{ my_var0 }}传递给my_tasks.yml.我该如何解决这个问题?

Vas*_*dev 14

在我的项目中遇到了同样的问题。事实证明,剧本和任务中的变量名称必须不同。

---
- 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 }}"
Run Code Online (Sandbox Code Playgroud)

同样在旁注中,剧本中的所有变量都可以在任务中访问。只需{{ some_other_var }}在任务中使用,它应该可以正常工作。


udo*_*dan 11

你不应该明确地传递my_varinclude.包括额外变量在内的所有变量应该可以直接在任何地方使用 所以干脆打电话

ansible-playbook my_file.yml --extra-vars "my_var=1.2.3"
Run Code Online (Sandbox Code Playgroud)

{{ my_var }}在任务中使用它应该工作.

- name: My task
  command: bash -c "curl -sSL http://x.com/file-{{ my_var }} > /tmp/file.deb"
Run Code Online (Sandbox Code Playgroud)

  • 如何从任务传递变量(而不是在playbook或命令行中设置var)? (5认同)