создать список из списка при сопоставлении с использованием jinja - PullRequest
0 голосов
/ 08 мая 2020

простой ansible playbook описан ниже:

мы хотим отфильтровать accounts из соответствия filtered_accounts. для простоты значения приведены в виде единого списка, но на самом деле это карта списка.


---

- name: my playbook
  hosts: localhost
  vars:
    accounts: ["1111111111","2222222222","3333333333","4444444444"]
    filter_account: ["1111111111","3333333333"]
  tasks:

    - name: "Generate KMS policy to allow access for all Organisation child accounts"
      template:
        src: "data-kms-policy.json.j2"
        dest: "data-kms-policy.json"
      tags: gk

    - name: "cat kms json file"
      shell: "cat data-kms-policy.json"
      register: result
      tags: gk

data-kms-policy. json .j2:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Allow cross-account use of the key",
      "Effect": "Allow",
      "Principal": {
         "AWS": [{% for host in accounts %}{% if host in filter_account and not loop.last %}"arn:aws:iam::{{ host }}:root",{% endif %}{% if host in filter_account and loop.last %}"arn:aws:iam::{{ host }}:root"{% endif %}{% endfor %}]
         },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    }
]}

ожидаемый результат:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Allow cross-account use of the key",
      "Effect": "Allow",
      "Principal": {
         "AWS": ["arn:aws:iam::1111111111:root","arn:aws:iam::3333333333:root"]
         },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    }]}


фактический результат:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Allow cross-account use of the key",
      "Effect": "Allow",
      "Principal": {
         "AWS": ["arn:aws:iam::1111111111:root","arn:aws:iam::3333333333:root", ]
         },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    }]}


проблема с текущей политикой data-kms. json .j2 - это добавление "," в конце всегда последний элемент, как удалить этот "," если это последний совпадающий элемент.

1 Ответ

1 голос
/ 08 мая 2020

Вам, вероятно, понравится не так много копий-макарон, переместив это предложение if host in в for l oop, а затем извлекая тест-разделитель

- debug:
    msg: |
       "AWS": [
          {%- for host in accounts if host in filter_account -%}
          {{ "" if loop.first else "," }}
          "arn:aws:iam::{{ host }}:root"
          {%- endfor -%}
       ]

Обычно я бы также настоятельно рекомендую использовать | to_json для создания данных в формате JSON, так как это позволяет получить один из бизнес-правил «это законно JSON», но в этом случае риск довольно низок, а код построения list довольно подробный из-за необходимости format

...