python - 来自 with_items 的 Ansible 设置变量

标签 python ansible jinja2 jmespath

我正在尝试为每个 ec2 实例运行一个模板任务,从其他已注册的变量中获取变量。实例日期存储在ec2.tagged_instances中,另外两个接口(interface)的IP信息分别存储在eni_dc和eni_spoke中。

显示 IP 提取的调试示例:

- debug:
    msg: "{{ eni_dc.results|json_query(s_query) }}"
  vars:
    s_query: "[?interface.attachment.instance_id=='i-x].interface.private_ip_address"

TASK [configure_vsrx : debug] **********************************************************************
ok: [localhost] => {
    "changed": false, 
    "msg": [
        "10.24.200.57"
    ]
}

尝试使用 ec2 注册变量中的实例 ID 提取 IP 的调试示例:

- debug:
    msg: "{{ eni_dc.results|json_query(s_query) }}"
  vars:
    s_query: "[?interface.attachment.instance_id==inst_id].interface.private_ip_address"
    inst_id: "{{ item.id }}"
  with_items:
    - "{{ ec2.tagged_instances }}"

TASK [configure_vsrx : debug] **********************************************************************
ok: [localhost] => (item={u'kernel': None, u'root_device_type': u'ebs', u'private_dns_name': u'ip-10-24-200-11.us-west-2.compute.internal', u'public_ip': None, u'private_ip': u'10.24.200.11', u'id': u'i-x', u'ebs_optimized': False, u'state': u'running', u'virtualization_type': u'hvm', u'architecture': u'x86_64', u'ramdisk': None, u'block_device_mapping': {u'/dev/sda1': {u'status': u'attached', u'delete_on_termination': True, u'volume_id': u'vol-x}}, u'key_name': u'USWest-TransVPC', u'image_id': u'ami-408b1620', u'tenancy': u'default', u'groups': {u'sg-f51e838e': u'secgroup-vsrx-transit'}, u'public_dns_name': u'', u'state_code': 16, u'tags': {u'Name': u'vSRX-hub', u'vsrx': u'vsrx-hub'}, u'placement': u'us-west-2a', u'ami_launch_index': u'0', u'dns_name': u'', u'region': u'us-west-2', u'launch_time': u'2017-05-05T12:16:11.000Z', u'instance_type': u'm4.xlarge', u'root_device_name': u'/dev/sda1', u'hypervisor': u'xen'}) => {
"item": {
    <per instance dict>
}, 
"msg": []
}

我得到了 ec2.tagged_instance 字典,但它似乎没有填充 inst_id。调试变量 s_query,我得到这个:

"msg": "[?interface.attachment.instance_id==inst_id].interface.private_ip_address"

关于如何让变量随任务的每次迭代填充有什么建议吗?

编辑:

我得到了实例 ID 来填充调试单引号中的 vars 语句中的变量:

  debug:
    msg:
      - "{{ eni_dc.results|json_query(s_query) }}"
  vars:
    s_query: "[?interface.attachment.instance_id=='{{ item.id }}'].interface.private_ip_address"
  with_items:
    - "{{ ec2.tagged_instances }}"

但是,我现在正在尝试基于此构建配置:

- name: Build Interface config
  template: >
    src=vrf.conf.j2
    dest={{ build_dir }}/{{ item.id }}-vrf.conf.part
  with_items:
    - "{{ ec2.tagged_instances }}"
  vars:
    eni_dc_ip: "{{ eni_dc | json_query(s_query) }}"
    eni_spoke_ip: "{{ eni_spoke | json_query(s_query) }}"
    s_query: "[?interface.attachment.instance_id=='{{ item.id }}'].interface.private_ip_address"

我得到 eni_dc_ip 和 eni_spoke_ip 的空白。

最佳答案

我最终在使用它们的任务之前添加了另一个任务来设置查询变量。

- name: Setting Instance ID and query to use in looking up instance variables
  set_fact:
    inst_query:
      - inst_id: "{{ item.id }}"
        ip_query: "[?interface.attachment.instance_id=='{{ item.id }}'].interface.private_ip_address|[0]"
        sec_ip_query: "[?interface.attachment.instance_id=='{{ item.id }}'].interface.private_ip_addresses[?primary_address==false].[private_ip_address]"
  with_items:
    - "{{ ec2.tagged_instances }}"
- debug:
    msg: "{{ eni_dc.results|json_query(item.sec_ip_query) }}"
  with_items:
    - "{{ inst_query }}"

- name: Build VRF config
  template: >
    src=vrf.conf.j2
    dest={{ build_dir }}/{{ item.inst_id }}-vrf.conf.part
  with_items:
    - "{{ inst_query }}"
  vars:
    eni_dc_ip: "{{ eni_dc.results|json_query(item.ip_query) }}"
    eni_spoke_ip: "{{ eni_spoke.results|json_query(item.ip_query) }}"

关于python - 来自 with_items 的 Ansible 设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43873687/

相关文章:

ansible - 如何在 Ansible(脚本模块)中转义反斜杠和双引号

javascript - 使用按钮和 javascript 在 Flask 中设置 python 变量

python - 如何调整仅在移动鼠标时才起作用的代码

python - 如何将 numpy 子矩阵 View 数组 d 表示为一维矩阵而不是二维矩阵

python - 哪个 winsorize 更准确,Python 还是 R

ansible - 在 playbook 中运行任务之前,如何设置确认提示?

Ansible:管理 Grafana 仪表板

python - 如何在Linux上使用python检测系统ACPI G2/S5软关闭事件

python - 当我安装 Jinja2 时 "the speedup extension could not be compiled, Jinja will fall back to the native python classes"是什么意思?

python - 无法使用 jinja2 加载模板