如何从Ansible Command模块的执行结果中生成列表
提取Ansible循环注册结果中的特定属性生成列表
我来帮你搞定这个问题!当你用with_dict循环执行Ansible的command模块后,注册的elbv2_target_groups变量是一个包含多个结果的集合——它的核心结构是results数组,每个数组元素对应一次循环执行的输出。要从中提取特定属性生成列表,用Ansible的过滤器链就能轻松实现。
步骤1:理解注册变量的结构
首先,你注册的elbv2_target_groups大致结构如下(简化版):
elbv2_target_groups: results: - stdout: '{"TargetGroups": [{"TargetGroupArn": "arn:aws:elasticloadbalancing:...", "TargetGroupName": "...", ...}]}' # 其他字段如changed、rc等 - stdout: '{"TargetGroups": [{"TargetGroupArn": "arn:aws:elasticloadbalancing:...", "TargetGroupName": "...", ...}]}' # 其他字段
因为command模块返回的JSON是字符串格式,所以第一步需要把它转换成可操作的字典对象。
步骤2:用过滤器链提取属性生成列表
假设你想要提取每个目标组的TargetGroupArn,可以用set_fact任务来生成这个列表:
- name: Extract target group ARNs into a dedicated list set_fact: elbv2_tg_arns: "{{ elbv2_target_groups.results | map(attribute='stdout') | map('from_json') | map(attribute='TargetGroups.0.TargetGroupArn') | list }}"
让我拆解一下每个过滤器的作用:
map(attribute='stdout'):从循环的每个结果中取出stdout字段(也就是aws命令返回的JSON字符串)map('from_json'):把JSON字符串转换成Ansible可以识别的字典/数组结构map(attribute='TargetGroups.0.TargetGroupArn'):从转换后的结构中提取指定属性——这里TargetGroups是数组,.0表示取第一个元素,然后拿到它的TargetGroupArnlist:把过滤器处理后的结果转换成标准列表格式
如果你需要提取其他属性,比如目标组名称TargetGroupName,只需要修改最后一个map的属性路径:
map(attribute='TargetGroups.0.TargetGroupName')
步骤3:验证结果(可选)
如果你不确定注册变量的具体结构,或者想验证提取结果,可以先添加一个debug任务查看细节:
- name: Debug registered target groups data debug: var: elbv2_target_groups.results - name: Debug extracted target group ARNs debug: var: elbv2_tg_arns
后续使用
生成的elbv2_tg_arns列表可以直接在后续任务中使用,比如关联到负载均衡器的监听规则:
- name: Associate target groups with listener elbv2_listener: ... default_actions: - type: forward target_group_arn: "{{ item }}" ... loop: "{{ elbv2_tg_arns }}"
内容的提问来源于stack exchange,提问作者aqz
相关产品推荐
相关产品推荐

