1

为了支持 Ansible 中的动态键值对,我希望更新一个现有角色,该角色创建一个 AWS SSM 激活以允许在运行时传递任意标签。

到目前为止,我已尝试利用以下 Ansible 构造,但均未成功:list变量、变量、、dictloop原生 Python方法。with_dictwith_itemsdict

以下是我的 Ansible 环境的一些详细信息:

当前带有硬编码标签的角色/命令如下所示:

- name: Generate SSM activation code and ID
  command: |
    aws ssm create-activation
    --tags "Key=key1,Value=value1" "Key=key2,Value=value2"
  register: ssm_activation_code

我们的想法是将其更新为如下所示:

 name: Generate SSM activation code and ID
  command: |
    aws ssm create-activation
    --tags "Key={{ item.key }},Value={{ item.value }}"
  register: ssm_activation_code
  with_items: "{{ aws_ssm_instance_tags }}"

并让角色传递标签的消费者像这样:

- role: ansible-role-aws-sm-agent
  vars:
    aws_ssm_instance_tags: {
      "key1": "value1",
      "key2": "value2",
      .....
    }

所有循环结构的问题是任务为每个键值对运行一次,导致多个 SSM 激活,这是不正确的。相反,我想在一次执行中传递所有标签。如果需要,我很乐意提供任何其他详细信息。非常感谢您对此的任何帮助。

4

2 回答 2

1

--cli-input-json我认为,如果一个人希望指定多个参数或--tags只提供标签,那么试图将已经结构化的输入强制转换回 awscli 使用的“伪语法”是一种毁灭之路

- name: Generate SSM activation code and ID
  command: >-
    aws ssm create-activation
    --tags {{ cli_tags | to_json | quote }}
  register: ssm_activation_code
  vars:
    cli_tags: >-
      {%- set results = [] -%}
      {%- for k, v in aws_ssm_instance_tags.items() -%}
      {%-   set _ = results.append({"Key": k, "Value": v}) -%}
      {%- endfor -%}
      {{ results }}

给定您的示例输入会生成 shlex-ed cmd:

 ["aws", "ssm", "create-activation", "--tags", "[{\"Key\": \"key1\", \"Value\": \"value1\"}, {\"Key\": \"key2\", \"Value\": \"value2\"}]"]

请注意:我更新了您的代码片段,因为有一个错字:command: |保留换行符,因此最初存在的 shell 命令最终将成为两个命令,因为 bash 在正常情况下使用换行符来终止命令

于 2021-10-13T02:47:47.600 回答
0

Ansible 角色的代码工作副本:

- name: Generate SSM activation code and ID
  command: >-
    aws ssm create-activation
    --tags {{ cli_tags | to_json | quote }}
  register: ssm_activation
  vars:
    cli_tags: >-
      {%- set results = [] -%}
      {%- for k, v in aws_ssm_instance_tags.items() -%}
      {%-   set _ = results.append({"Key": k, "Value": v}) -%}
      {%- endfor -%}
      {{ results }}

以及调用该角色的 Ansible playbook 上的代码:

aws_ssm_instance_tags: {
    "key1": "value1",
    "key2": "value2",
    .....
}

衷心感谢mdaniel及时帮助我解决了这个问题。

于 2021-10-14T17:53:50.493 回答