Ansible:从寄存器变量中提取值,以便在同一剧本中的其他剧本中使用它

Ansible:从寄存器变量中提取值,以便在同一剧本中的其他剧本中使用它

我正在使用 Ansible 设置一个完整的环境。由于某种原因,Ansible 没有拾取变量值。

我正在使用 Ansible 2.1.1.0。

下面是我正在尝试做的一个示例:

我已经向 注册了我的 vpc register: ec2_vpc

  syntax-1 # This doesn't work
        - name: Add to host vars
          add_host:
                name: "vpc subnets"
                groups: vpc_vars
                vpc_subnet_id: "{{ ec2_vpc.subnets[0].id }}"
                vpcid: "{{ ec2_vpc.vpc_id }}"
        - debug: var=vpc_subnet_id
        - debug: var=vpcid

   syntax-2 # These works
        - name: Record vpc id
          debug: var=ec2_vpc.vpc_id

        - name: Record subnet id
          debug: var=ec2_vpc.subnets[0].id

上述剥离的结果:

TASK [debug] *******************************************************************
ok: [localhost] => {
    "vpc_subnet_id": "VARIABLE IS NOT DEFINED!"
}

TASK [debug] *******************************************************************
ok: [localhost] => {
    "vpcid": "VARIABLE IS NOT DEFINED!"
}

TASK [Record vpc id] ***********************************************************
ok: [localhost] => {
    "ec2_vpc.vpc_id": "vpc-4sdh3832f"
}

TASK [Record subnet id] ********************************************************
ok: [localhost] => {
    "ec2_vpc.subnets[0].id": "subnet-edfjdh3482"
}

为什么我的第一个语法没有选择值而是返回VARIABLE IS NOT DEFINED!

更新:这里我的第二种语法描述了我正确地从已注册变量的 JSON 结果中筛选出值。但我希望它适用于我的第一个语法,这意味着我想将主机变量添加到动态清单中。这样我就可以在另一个游戏中重复使用它

答案1

add_host模块在动态主机列表中创建一个主机。然后,您针对该组主机运行另一个剧本(在同一个剧本中),并且从该剧本中,您将能够访问您设置的变量。

例如使用以下语法:

- hosts: all
  # ...
  tasks:
    - name: Add to host vars
        add_host:
          name: host_1
          groups: dynamic_hosts
          vpc_subnet_id: "{{ ec2_vpc.subnets[0].id }}"
          vpcid: "{{ ec2_vpc.vpc_id }}"

- hosts: dynamic_hosts
  # ...
  tasks:
    - debug: var=vpc_subnet_id
    - debug: var=vpcid

上述add_host示例中创建了一个内存库存文件,其内容如下:

[dynamic_hosts]
host_1 vpc_subnet_id="{{ ec2_vpc.subnets[0].id }}" vpcid="{{ ec2_vpc.vpc_id }}"

相关内容