我有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
,那么它可以正常工作。但是我希望将变量包含在任务中,以便我可以将不同的变量分别保存在不同的任务中。
答案 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 }}
答案 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是任务列表,而不是剧本
根据所需的体系结构,您可以执行以下操作之一:
将apache.yml转换为角色。然后在role / apache / tasks / mail.yml中定义任务,并在role / apache / defaults / mail.yml中定义变量(应用角色时可以覆盖默认值的变量)
在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"