Ansible & Jinja2: 如何引用变量作为JSON结构项的键?

64次阅读
没有评论

问题描述

正在使用Ansible的community.aws.iam_server_certificate_info模块获取AWS EC2上服务器证书的信息,并将其注册为变量server_cert_info_result。不幸的是,该模块返回的是一个具有高级键的JSON结构,该键是服务器证书的实际值,而不是返回一个包含{name: }的字典列表的更标准的格式。用户在playbook中有一个名为server_ssl_cert_name的变量,其中包含证书的实际名称。用户想要获取arn的值,以便使用Jinja2过滤器创建一个带有HTTPS监听器的应用弹性负载均衡器。用户想知道如何使用Jinja2过滤器检索arn的值。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Jinja2中,可以使用标准的属性访问语法来获取arn的值。不需要特殊处理。
以下是使用Jinja2的步骤:
1. 使用ansible.builtin.debug任务来调试Jinja2过滤器。
2. 在msg参数中使用server_cert_info_result.ansible_module_results[server_ssl_certificate_name].arn来获取arn的值。
下面是一个示例任务:

- name: Debug jinja2
  ansible.builtin.debug:
    msg: "{{ server_cert_info_result.ansible_module_results[server_ssl_certificate_name].arn }}"
  tags: list_server_certificate_info

方案2

请注意以下操作注意版本差异及修改前做好备份。
如果方案1不起作用,可以尝试使用attr过滤器来获取arn的值。
以下是使用Jinja2的步骤:
1. 使用ansible.builtin.debug任务来调试Jinja2过滤器。
2. 在msg参数中使用server_cert_info_result.ansible_module_results | attr(server_ssl_certificate_name).arn来获取arn的值。
下面是一个示例任务:

- name: Debug jinja2 attr filter
  ansible.builtin.debug:
    msg: "{{ server_cert_info_result.ansible_module_results | attr(server_ssl_certificate_name).arn }}"
  tags: list_server_certificate_info

请注意,方案2中使用的attr过滤器需要确保server_ssl_certificate_name是一个字符串,而不是一个变量。如果server_ssl_certificate_name是一个变量,你可以在使用attr过滤器之前使用set_fact任务将其转换为字符串。
以上是两种使用Jinja2过滤器获取arn值的方法。请根据你的具体情况选择适合你的方法。

正文完