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

use*_*660 46 ansible ansible-playbook

我有这个 play.yml

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

  tasks:
     - include: apache.yml
Run Code Online (Sandbox Code Playgroud)

我的Apache看起来像这样:

vars:
    url: czxcxz

- name: Download apache
  shell: wget {{url}} 
Run Code Online (Sandbox Code Playgroud)

这给了我错误.

如果我删除vars然后它的工作原理.但是我希望将变量包含在任务中,以便我可以将不同的变量分别保存在不同的任务中.

dod*_*gio 67

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

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


原始答案

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

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

- name: Download Apache
  shell: wget {{ apache_url }}
Run Code Online (Sandbox Code Playgroud)

有关官方字词,请参见http://docs.ansible.com/set_fact_module.html.

  • 请注意与变量相比的这种细微差别:_此模块允许设置新变量.变量按主机设置,就像设置模块发现的事实一样.**这些变量将在戏剧之间存活.**_ (12认同)
  • 旁注:看来,你不能使用`set_fact`来改变一个变量...所以如果这个名字已经被一个变量占用了,它将不会修改那个...这很容易设置一个在剧本的更高级别上变量为相同的名称.因此,请确保您不会这样做(例如,使用可能唯一的名称,而不是'item'). (7认同)
  • 请注意您的笔记... `此外,这些事实是不可变的(在剧本的持续时间内),并且一旦设置就无法更改。` - 这不是严格正确的。您可以覆盖在早期任务中使用 `set_fact` 创建的事实,但不能以任何其他方式覆盖变量集...例如,如果您遍历一组任务,并且在每个任务的开始循环迭代你使用`set_fact: loop_item='{{ item }}'`,然后使用`debug: msg='{{ loop_item }}'`,你会看到*fact*随着每次循环迭代而变化。 (3认同)

app*_*ung 22

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

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

- name: Download apache
  vars:
    url: czxcxz
  shell: wget {{url}} 
Run Code Online (Sandbox Code Playgroud)


Ric*_*ico 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
Run Code Online (Sandbox Code Playgroud)

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

  • 这个解决方案完全是矫枉过正。您通过 ssh 将 var 值发送到远程主机,然后将其检索回来,以便在控制节点上本地使用它! (2认同)

mmv*_*-ru 6

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

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

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

播放.yml:

---
- hosts: localhost
  connection: local
  sudo: false

  roles:
     - apache
Run Code Online (Sandbox Code Playgroud)

角色/apache/defaults/main.yml :

---
url: czxcxz
Run Code Online (Sandbox Code Playgroud)

角色/apache/tasks/main.yml :

---
- name: Download apache
  shell: wget {{url}} 
Run Code Online (Sandbox Code Playgroud)

2. 在 play.yml playbook 中设置变量

播放.yml:

---
- hosts: localhost
  connection: local
  sudo: false

  vars:
    url: czxcxz

  tasks:
     - include: apache.yml
Run Code Online (Sandbox Code Playgroud)

阿帕奇.yml:

- name: Download apache
  shell: wget {{url}} 
Run Code Online (Sandbox Code Playgroud)

3.制作apache.yml完整的playbook并将其作为playbook导入到play.yml中

播放.yml:

---
- name: Configure Apache
  import_playbook: apache.yml
Run Code Online (Sandbox Code Playgroud)

阿帕奇.yml:

---
- name: Configure Apache
  hosts: localhost
  connection: local
  sudo: false

  vars:
    url: czxcxz

  tasks:
  - name: Download apache
    shell: wget {{url}} 
Run Code Online (Sandbox Code Playgroud)

4.从单独的文件导入变量

播放.yml:

---
- hosts: localhost

  tasks:
  - include: apache.yml
Run Code Online (Sandbox Code Playgroud)

阿帕奇.yml:

---
- name: Import apache vars
  # Static import var-file with single var look ugly
  include_vars: apache-vars.yml

- name: Download apache
  shell: wget {{ url }} 
Run Code Online (Sandbox Code Playgroud)

阿帕奇-vars.yml:

---
url: http://example.com/apache
Run Code Online (Sandbox Code Playgroud)

5.考虑将变量放入host_var或group_var

host_vars/localhost.yml :或 host_vars/localhost/apache.yml :

---
url: http://example.com/apache
Run Code Online (Sandbox Code Playgroud)