如何在Ansible任务中将整数列表转为字符串列表适配AWS命令
解决Ansible中整数列表转字符串列表适配AWS命令的问题
嘿,这个场景我之前处理过,刚好能给你几个实用的方案:
方案1:用map+join直接转换格式
AWS的disassociate-members命令要求--account-ids后面跟空格分隔的字符串账号ID,所以我们可以用Ansible的map过滤器把整数列表里的每个元素转成字符串,再用join拼成空格分隔的格式:
- name: Disassociates all current members command: sh -c 'aws guardduty disassociate-members --account-ids "{{ member_ids | map("string") | join(" ") }}" --detector-id "{{ detector_id }}" --region "{{ TARGET_AWS_REGION }}"' environment: AWS_ACCESS_KEY_ID: "{{ assumed_role.sts_creds.access_key }}" AWS_SECRET_ACCESS_KEY: "{{ assumed_role.sts_creds.secret_key }}" AWS_SESSION_TOKEN: "{{ assumed_role.sts_creds.session_token }}" register: response
关键过滤器解释:
map("string"):遍历member_ids列表,把每个整数元素转换成字符串类型join(" "):将转换后的字符串列表用空格连接,刚好符合AWS命令的参数格式要求
方案2:添加空列表判断,避免无效执行
如果member_ids有可能是空列表,建议加个条件判断,防止执行命令时出现参数错误:
- name: Disassociates all current members command: sh -c 'aws guardduty disassociate-members --account-ids "{{ member_ids | map("string") | join(" ") }}" --detector-id "{{ detector_id }}" --region "{{ TARGET_AWS_REGION }}"' environment: AWS_ACCESS_KEY_ID: "{{ assumed_role.sts_creds.access_key }}" AWS_SECRET_ACCESS_KEY: "{{ assumed_role.sts_creds.secret_key }}" AWS_SESSION_TOKEN: "{{ assumed_role.sts_creds.session_token }}" register: response when: member_ids | length > 0
方案3:更规范的命令参数写法(推荐)
其实Ansible的command模块支持直接拆分参数,不用嵌套sh -c,这样更安全也更易维护,同样用map转换格式:
- name: Disassociates all current members command: cmd: aws guardduty disassociate-members args: --account-ids: "{{ member_ids | map('string') | list }}" --detector-id: "{{ detector_id }}" --region: "{{ TARGET_AWS_REGION }}" environment: AWS_ACCESS_KEY_ID: "{{ assumed_role.sts_creds.access_key }}" AWS_SECRET_ACCESS_KEY: "{{ assumed_role.sts_creds.secret_key }}" AWS_SESSION_TOKEN: "{{ assumed_role.sts_creds.session_token }}" register: response when: member_ids | length > 0
这里map('string') | list会把整数列表转换成字符串列表,Ansible会自动将列表参数展开成空格分隔的字符串传给AWS命令,效果和方案1一致,但写法更符合Ansible的最佳实践。
内容的提问来源于stack exchange,提问作者Forrest
相关产品推荐
相关产品推荐

