76

我有这个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然后它工作。但我想在任务中包含变量,以便我可以为不同的任务保留不同的变量。

4

6 回答 6

92

注意:使用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

于 2015-01-16T02:40:04.513 回答
70

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

只需将 var 移到“name”块中:

- name: Download apache
  vars:
    url: czxcxz
  shell: wget {{url}} 
于 2019-03-07T06:24:18.337 回答
13

变量定义旨在用于任务。但是,如果您想将它们包含在任务中,则可能使用该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

您还可以将角色视为根据不同角色角色分离任务的一种方式。这样,您可以为每个角色拥有单独的变量。例如,您可能有一个url变量 forapache1和一个单独的url变量 for the role apache2

于 2014-03-22T02:27:53.163 回答
3

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

取决于所需的架构,您可以执行以下操作之一:

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

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

播放.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}} 
于 2019-03-22T11:38:38.980 回答
0

如果您需要仅通过特定任务持续存在的局部变量,您可以这样做:

- name: My Task
  vars:
    my_var: 123

当您希望拥有更多可重用的角色时,这可能很有用,它需要一些通用变量(参数)。例如:

my_debug_role/main.yml

- name: Output me
  ansible.builtin.debug:
    msg: "Your output was: {{ my_msg }}"

然后在您的剧本中,您可以使用更具体的变量重用它,例如:

my_playbook.yml

- name: Output my custom log
  include_role:
    name: my_debug_role
  vars:
    my_msg: "{{ some_custom_specific_variable }}"
于 2022-01-26T08:08:56.830 回答
-3

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

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

这里的默认设置是将第一部分解析{{ myapp }} -a foo为字典而不是字符串,你会得到一个错误。

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

- name: some example
  command: "{{ myapp }} -a foo"
于 2016-11-08T03:04:18.907 回答