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

如何将变量传递给ansible中包含的任务?,ansible,ansible-playbook,Ansible,Ansible Playbook,我有一个ansible文件(my_file.yml),看起来像这样: --- - name: The name hosts: all tasks: - include:my_tasks.yml vars: my_var: "{{ my_var }}" - name: Install Curl apt: pkg=curl state=installed - name: My task command: bash -c "curl -sS

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

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

    - include:my_tasks.yml
      vars:
          my_var: "{{ my_var }}"
- 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"
ansible-playbook my_file.yml --extra-vars "my_var=1.2.3"
- include:my_tasks.yml
  vars:
      my_var: "1.2.3"
my_tasks.yml
如下所示:

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

    - include:my_tasks.yml
      vars:
          my_var: "{{ my_var }}"
- 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"
ansible-playbook my_file.yml --extra-vars "my_var=1.2.3"
- include:my_tasks.yml
  vars:
      my_var: "1.2.3"
我想将
my_var
作为命令行参数传递给ansible,因此我喜欢这样:

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

    - include:my_tasks.yml
      vars:
          my_var: "{{ my_var }}"
- 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"
ansible-playbook my_file.yml --extra-vars "my_var=1.2.3"
- include:my_tasks.yml
  vars:
      my_var: "1.2.3"
但我最终犯了以下错误:

... Failed to template {{ my_var }}: Failed to template {{ my_var }}: recursive loop detected in template string: {{ my_var }}
如果我将
my_file.yml
中的
vars
设置为如下所示:

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

    - include:my_tasks.yml
      vars:
          my_var: "{{ my_var }}"
- 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"
ansible-playbook my_file.yml --extra-vars "my_var=1.2.3"
- include:my_tasks.yml
  vars:
      my_var: "1.2.3"
它起作用了!我还尝试将变量名更改为不等于
my_var
,例如:

- include:my_tasks.yml
  vars:
      my_var: "{{ my_var0 }}"

但我最终还是犯了一个错误。在我看来,变量没有展开,而是字符串
“{{my_var}}”
{{my_var}}
被传递到
my_tasks.yml
。如何解决此问题?

您不需要显式地将
my\u 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"

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

---
- 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 }}"

另一方面,playbook中的所有变量都可以在任务中访问。只需在任务中使用
{{some_other_var}}
,它应该可以正常工作。

如何从任务传递变量(而不是在playbook或命令行中设置变量)?谢谢!这正是我需要的!