如何在ansible中的tasks文件中编写变量

时间:2014-03-20 03:38:00

标签: ansible ansible-playbook

我有play.yml

---
- hosts: 127.0.0.1
  connection: local
  sudo: false

  tasks:
     - include: apache.yml

我的Apache看起来像这样:

vars:
    url: czxcxz

- name: Download apache
  shell: wget {{url}} 

这给了我错误。

如果我删除vars,那么它可以正常工作。但是我希望将变量包含在任务中,以便我可以将不同的变量分别保存在不同的任务中。

5 个答案:

答案 0 :(得分:64)

注意:如下所述使用set_fact将事实/变量设置到运行任务的远程服务器上。然后,在整个剧本期间,此事实/变量将持续贯穿后续任务。

此外,这些事实是不可变的(在剧本的持续时间内),并且一旦设定就无法改变。


原始答案

在您的任务之前使用set_fact设置事实,它们似乎可以与变量互换:

- name: Set Apache URL
  set_fact:
    apache_url: 'http://example.com/apache'

- name: Download Apache
  shell: wget {{ apache_url }}

请参阅http://docs.ansible.com/set_fact_module.html官方字词。

答案 1 :(得分:9)

变量定义旨在用于任务。但是如果要将它们包含在任务中,可能需要使用register指令。像这样:

- name: Define variable in task.
  shell: echo "http://www.my.url.com"
  register: url

- name: Download apache
  shell: wget {{ item }}
  with_items: url.stdout

您还可以将roles视为根据不同角色roles分离任务的一种方式。这样,您可以为每个角色分别设置变量。例如,您可能拥有url的{​​{1}}变量和apache1角色的单独url变量。

答案 2 :(得分:5)

我知道,这是很久以前的事了,但是由于尚未发布最简单的答案,因此我将为可能会经过的其他用户这样做。

只需将var移动到“名称”块中即可:

print(soup.select_one("[idx='3']").text.strip())

答案 3 :(得分:1)

在您的示例中,apache.yml是任务列表,而不是剧本

根据所需的体系结构,您可以执行以下操作之一:

  1. 将apache.yml转换为角色。然后在role / apache / tasks / mail.yml中定义任务,并在role / apache / defaults / mail.yml中定义变量(应用角色时可以覆盖默认值的变量)

  2. 在play.yml剧本中设置vars

play.yml

---
- hosts: 127.0.0.1
  connection: local
  sudo: false

  vars:
    url: czxcxz

  tasks:
     - include: apache.yml

apache.yml

- name: Download apache
  shell: wget {{url}} 

答案 4 :(得分:-1)

每当在ansible的同一行上有一个模块后跟一个变量时,解析器会将引用变量视为内联字典的开头。例如:

- name: some example
  command: {{ myapp }} -a foo

此处的默认设置是将{{ myapp }} -a foo的第一部分解析为字典而不是字符串,您将收到错误。

所以你必须引用这样的论点:

- name: some example
  command: "{{ myapp }} -a foo"