如何在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}}