простой 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 - это добавление "," в конце всегда последний элемент, как удалить этот "," если это последний совпадающий элемент.