Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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_Ansible Playbook - Fatal编程技术网

“Ansible”怎么说;登记册;在变量中,包含剧本的结果是什么?

“Ansible”怎么说;登记册;在变量中,包含剧本的结果是什么?,ansible,ansible-playbook,Ansible,Ansible Playbook,一个变量中的一个剧本怎么可能是另一个剧本的结果 例如,下面的代码是否会将执行tasks/foo.yml的结果注册到result\u of_foo tasks: - include: tasks/foo.yml - register: result_of_foo Ansible还能记录任务序列的结果吗?简而言之,这是不可能做到的 该语句用于将单个任务的输出存储到变量中。根据任务的类型,注册变量的确切内容可能会有很大的不同(例如,shell任务将包括您在注册变量中运行的命令的stdout&

一个变量中的一个剧本怎么可能是另一个剧本的结果

例如,下面的代码是否会将执行
tasks/foo.yml
的结果注册到
result\u of_foo

tasks:
  - include: tasks/foo.yml
  - register: result_of_foo

Ansible还能记录任务序列的结果吗?

简而言之,这是不可能做到的

该语句用于将单个任务的输出存储到变量中。根据任务的类型,注册变量的确切内容可能会有很大的不同(例如,
shell
任务将包括您在注册变量中运行的命令的stdout&stderr输出,而
stat
任务将提供传递给任务的文件的详细信息)

如果您有一个包含任意数量任务的include文件,那么Ansible将无法知道在示例中的变量中存储什么


include文件中的每个任务都可以注册变量,您可以在其他地方引用这些变量,因此实际上根本不需要执行类似的操作。

我可以通过传递变量名作为任务中要使用的变量来实现这一点。我在下面包括了main.yaml和cgw.yaml文件

main.yaml:

- name: Create App A CGW
  include: cgw.yaml
  vars:
    bgp_asn: "{{ asn_spoke }}"
    ip_address: "{{ eip_app_a.public_ip }}"
    name: cgw-app-a
    region: "{{ aws_region }}"
    aws_access_key: "{{ ec2_access_key }}"
    aws_secret_key: "{{ ec2_secret_key }}"
    register: cgw_app_a
cgw.yaml:

- name: "{{ name }}"
  ec2_customer_gateway:
    bgp_asn: "{{ bgp_asn }}"
    ip_address: "{{ ip_address }}"
    name: "{{ name }}"
    region: "{{ region }}"
    aws_access_key: "{{ aws_access_key }}"
    aws_secret_key: "{{ aws_secret_key }}"
  register: "{{ register }}"

如果你把一个剧本当作一个不透明的盒子(即一个函数),有一个简单的、定义良好的界面,这是有必要的。为什么playbook不应该有作用域变量和返回值?Ansible playbook遇到了我在其他领域特定语言(DSL)中观察到的一些问题,如Java构建语言Ant。这类语言大多是声明性的,但也有不完整的功能性或命令性行为。Ansible playbook一直在逐步填补必要的空白,但正如本案例所示,仍有漏洞需要填补。另一种方法是在现有编程语言的基础上设计DSL,但遵循更窄的语法或只提供特定的功能。(YAML和XML不是编程语言。)即使剧本中只有一个任务,这仍然不可能吗?你能注册这个任务的结果,然后在最初的剧本中引用它吗?这是一个非常有趣的发现,所以我惊喜地发现,即使是最新发布的Ansible 2.7.6,它也能工作。但它将在2.8中停止工作。在所有这三种情况下,Ansible 2.8.0dev0(刚刚从Github检查过)警告:“register”不可模板化,但我们发现:{{ret},它将不被模板化,而是按原样使用。事实上,ret0没有改变。所以,让它留在这里作为历史,但“不要在新设计中使用它”;)我的评论与我在Gist@mz0中复制的本答案版本有关,其中关于在Ansible 2.8中放弃对
寄存器
模式的支持的信息?没有提到它。@LeoY从引用的警告:“register”是不可模板化的,但我们发现:{{ret},它将不会被模板化,并将按原样使用@mz0,您能提供一个证明链接吗?在我发现的文档链接中没有这样的警告。这是代码中的注释吗?