“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,您能提供一个证明链接吗?在我发现的文档链接中没有这样的警告。这是代码中的注释吗?