Ansible如何在变量中"注册"包含剧本的结果?

Der*_*har 15 ansible ansible-playbook

一个变量中的Ansible剧本如何包含另一个剧本?register

例如,将以下寄存器执行的结果tasks/foo.ymlresult_of_foo

tasks:
  - include: tasks/foo.yml
  - register: result_of_foo
Run Code Online (Sandbox Code Playgroud)

Ansible如何记录任务序列的结果?

Bru*_*e P 12

简短的回答是,这是不可能做到的.

寄存器语句用于单个任务的输出存入一个变量.注册变量的确切内容可以根据任务类型的不同而有很大差异(例如,shell任务将包括您在注册变量中运行的命令的stdout和stderr输出,而stat任务将提供传递给的文件的详细信息任务).

如果你有一个包含任意数量任务的包含文件,那么Ansible将无法知道你的例子中的变量应该存储什么.

包含文件中的每个单独任务都可以注册变量,您可以在其他地方引用这些变量,因此实际上甚至不需要执行此类操作.

  • Ansible playbook遇到了我在其他领域特定语言(DSL)中观察到的一些问题,例如Ant,Java的构建语言.这些语言大多是声明性的,但也有不完整的功能或命令行为.Ansible剧本已逐渐填补了必要的空白,但正如本案例所示,仍然有填补空白.另一种方法是将DSL的设计基于现有的编程语言,但遵循较窄的语法或仅提供特定的功能.(YAML和XML不是*编程语言.) (3认同)

小智 8

我能够通过将变量名称作为要在任务中使用的变量传递来实现此目的.我包括了我的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
Run Code Online (Sandbox Code Playgroud)

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 }}"
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常有趣的发现,因此即使在最新发布的Ansible 2.7.6中,它也能正常工作,令我感到惊喜。但是它将在2.8中停止工作。在所有这三种情况下,Ansible 2.8.0dev0(从Github进行检查)都发出警告:“ register”不是可模板化的,但是我们发现:{{ret}},它不会被模板化,将“按原样”使用。实际上,ret0不会更改。因此,让它留在历史中,但“不要在新设计中使用它”;) (2认同)