Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在无块的ansible角色/任务文件中定义变量吗?_Ansible - Fatal编程技术网

我可以在无块的ansible角色/任务文件中定义变量吗?

我可以在无块的ansible角色/任务文件中定义变量吗?,ansible,Ansible,我有一个角色,其中包含一个包含任务的文件。该文件中的所有任务都使用一个变量 --- vars: name: john - name: say hello debug: msg: "{{name}} says hello" - name: say goodbye debug: msg: "{{name}} says goodbye" 那不行。但我可以通过以下方式实现: 将所有内容移动到块中 使用set\u fact,但这会将变量泄漏到整个剧本中(不是我想要的)

我有一个角色,其中包含一个包含任务的文件。该文件中的所有任务都使用一个变量

---
vars:
  name: john

- name: say hello
  debug:
    msg: "{{name}} says hello"

- name: say goodbye
  debug:
    msg: "{{name}} says goodbye"
那不行。但我可以通过以下方式实现:

  • 将所有内容移动到
    块中
  • 使用
    set\u fact
    ,但这会将变量泄漏到整个剧本中(不是我想要的)
我能不受阻碍地做这件事吗


(我发现foo in bar中的block in block凌乱不堪,有时我不想分割成多个文件。)

您的角色变量应该存储在
角色/Your_pretty_role/vars/下的YAML文件中

在该目录中,会自动加载
main.yml
。所以在
角色/your_pretty_角色/vars/main.yml
中:

---
name: john
- name: say hello
  debug:
    msg: "{{name}} says hello"

- name: say goodbye
  debug:
    msg: "{{name}} says goodbye"
---
name: mike
在您的
角色/your_pretty_角色/tasks/main.yml
中:

---
name: john
- name: say hello
  debug:
    msg: "{{name}} says hello"

- name: say goodbye
  debug:
    msg: "{{name}} says goodbye"
---
name: mike
要知道,假设您在整个角色中不需要这些变量,您最终可以拆分该目录中其他YAML文件中的变量,但在这种情况下,您只需使用
include\u vars:.yml
将它们包括在内。因此,将您的var移动到
角色/your_pretty_角色/vars/hello.yml

---
name: john
- name: say hello
  debug:
    msg: "{{name}} says hello"

- name: say goodbye
  debug:
    msg: "{{name}} says goodbye"
---
name: mike
在所需的任务文件中,您必须添加以下内容:

- name: Include needed variables
  include_vars: hello.yml

- name: say hello
  debug:
    msg: "{{name}} says hello"

- name: say goodbye
  debug:
    msg: "{{name}} says goodbye"
您还可以在角色中声明默认变量。它们的优先级很低,很容易被覆盖。这些必须存储在
角色/your_pretty_角色/default

医生 这是关于这件事的唯一文件:


谢谢。但是这个变量对角色中的所有人都是可用的,而我要问的是一个仅限于该文件(或块)的变量。除了您提出的方法之外,没有其他方法可以做到这一点吗?是的,您可以使用
include\u vars
来做到这一点。只需将变量放入一个单独的文件
vars/hello.yml
。默认情况下,角色不会加载此文件(仅
vars/main.yml
is)。因此,在要获取这些变量的任务文件中,必须显式添加一个任务
-include_vars:hello.yml
。据我所知,这满足了您的需要。不幸的是,变量的作用域不能与编程时的作用域相同。ansible方法很混乱,但你的方法是一个很好的解决方法。谢谢我更新了我的答案,例如,包含变量的示例更适合您的需要。顺便说一句,它不仅仅是一个解决方案,它是一个功能,它是角色变量的设计使用方式。你可以看看Galaxy上提供的角色。你会发现很多例子。来自Jeff Geerling,用于导入操作系统特定的变量。