如何在ansible中的任务文件中写入变量

如何在ansible中的任务文件中写入变量,ansible,ansible-playbook,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,它就会工作。但是我想在任务中包含变量,这样我就可以将不同任务的不同变量分开。变量

我有这个
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
,它就会工作。但是我想在任务中包含变量,这样我就可以将不同任务的不同变量分开。

变量定义用于任务中。但是如果您想将它们包括在任务中,可能需要使用
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
变量用于
apache1
,还有一个单独的
url
变量用于角色
apache2

注意:使用
set\u fact
将事实/变量设置到运行任务的远程服务器上,如下所述。然后,该事实/变量将在您的剧本的整个持续时间内持续存在于后续任务中

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


原始答案 在执行任务之前,请使用
set_fact
,设置似乎可以与变量互换的事实:

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

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

有关官方单词,请参阅。

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

- name: some example
  command: {{ myapp }} -a foo
这里的默认值是将
{{myapp}}-a foo的第一部分解析为字典而不是字符串,您将得到一个错误

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

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

我知道,这是很久以前的事了,但因为最简单的答案还没有公布,我会为其他可能会路过的用户这样做

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


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

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

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

  • 在游戏中设置变量。yml playbook

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

    这似乎是一个更好的解决方案,因为您可以将事实用作变量。请注意,与变量相比,此模块有一个细微的区别:此模块允许设置新变量。变量是按主机逐个设置的,就像设置模块发现的事实一样。这些变量将在两次播放之间继续存在。旁注:看来,您无法使用
    set\u fact
    在适当的位置更改变量。。。因此,如果该名称已被变量使用,则不会修改该名称。。。在剧本的更高级别上,将变量设置为相同名称可能会出错。因此,请确保您不会这样做(例如,使用一个可能唯一的名称,而不是“项”)。请在您的便笺上注明<代码>此外,这些事实是不可变的(在剧本的持续时间内),一旦设置,就不能更改。
    ——严格来说,这不是真的。您可以在以前的任务中覆盖使用
    set\u fact
    创建的事实,但不能以任何其他方式覆盖变量集。。。例如,如果您循环执行一组任务,并且在每次循环迭代开始时使用
    set\u fact:loop\u item='{{{item}}}
    ,然后使用
    debug:msg='{{{loop\u item}}}'
    ,您将看到每个循环迭代的事实都会发生变化。我以为寄存器只处理命令的输出?我如何在角色的
    角色//tasks/main.yml
    ?ThorCaller你的意思是像常规变量一样的静态变量?也许是这个?这个解决方案完全是过火了。U通过ssh将var值发送到远程主机,然后将其检索回来,以便在控制节点上本地使用!!这是真的,但它不能回答问题。
    - name: Download apache
      shell: wget {{url}}