我正在遇到一个奇怪的问题,我敢肯定,这只是我缺乏经验,因为我对Ansible是相对较新(我只是一直在使用它几个星期(
因此,简而言之,我要做的就是使用命令模块运行AWS CLI命令来列出用户的AWS Access键,然后从该用户中删除它们。我使用CLI而不是IAM模块的原因是因为我相信IAM模块在删除访问密钥方面存在错误。即使我指定状态更新和访问键删除和访问密钥状态的访问键仍然不会删除访问键,或者在将访问密钥状态设置为无活动时使其不活动。
第一个任务列出了给定用户的访问键,并注册输出:
- name: List the access keys (if any) of the user(s) we just created
vars:
use_key: "{{ enable_access_keys }}"
command: "aws iam list-access-keys --user-name {{ item }}"
with_items:
- "{{ iam_user_name_list }}"
when: not use_key
register: list_key_output
^请记住,IAM_USER_NAME_LIST目前仅包含1个用户,这就是为什么我以自己的方式访问结果。我知道将来需要更改。
由于list_key_output的stdout看起来像
"stdout": "{n "AccessKeyMetadata": [n {n "UserName": "other-guy", n "Status": "Active", n "CreateDate": "2017-06-29T18:45:04Z", n "AccessKeyId": "removed"n }n ]n}",
i调试MSG,并将其注册到可变测试中,以提供适当的JSON格式,而无需斜线和新线,因此我可以使用JSON_QUERY从Stdout中获取键。我正在使用JSON查询,因为AccessKeyId出于任何原因都不被认为是AccessKeyMetadata词典的关键。
- name: list keys stdout
debug:
msg: "{{ list_key_output.results[0].stdout }}"
register: test
- name: test variable output
debug:
msg: "{{ test.msg.AccessKeyMetadata | json_query('[].AccessKeyId') }}"
此时,我成功地从stdout获取了访问密钥
ok: [127.0.0.1] => {
"changed": false,
"msg": [
"correct access key here"
]
}
现在,我将访问键输入delete cli命令,例如so
- name: Remove any access keys our new console user might have
vars:
use_key: "{{ enable_access_keys }}"
command: "aws iam delete-access-key --access-key {{ test.msg.AccessKeyMetadata | json_query('[].AccessKeyId') }} --user-name other-guy"
when: not use_key
register: delete_key_output
由于提供了无效的访问密钥,因此此任务失败了。
fatal: [127.0.0.1]: FAILED! => {"changed": true, "cmd": ["aws", "iam", "delete-access-key", "--access-key", "[u********************]", "--user-name", "other-guy"], "delta": "0:00:00.388902", "end": "2017-06-29 18:59:13.308230", "failed": true, "rc": 255, "start": "2017-06-29 18:59:12.919328", "stderr": "nAn error occurred (ValidationError) when calling the DeleteAccessKey operation: The specified value for accessKeyId is invalid. It must contain only alphanumeric characters.", "stderr_lines": ["", "An error occurred (ValidationError) when calling the DeleteAccessKey operation: The specified value for accessKeyId is invalid. It must contain only alphanumeric characters."], "stdout": "", "stdout_lines": []}
您可以看到,当我将访问键传递到命令时,[u被准备到访问键的正面,]将附加到其背面。
为什么会发生这种情况?如何实现我的目标,而不会将3个字符添加到访问密钥中,这使其无效?我不明白为什么会发生这种情况,因为当我以将其提供给命令的方式相同的方式时,它仅显示访问密钥,而没有[u在前面和后面]。
很抱歉长期发布,但我觉得我确实必须描述这种情况才能在这里获得帮助。预先感谢您的任何答案!
回答您的确切问题:
ok: [127.0.0.1] => {
"changed": false,
"msg": [
"correct access key here"
]
}
请注意msg
中的[
和]
- 这意味着您打印一个包含一个元素的列表 - correct access key here
字符串。
尝试将列表转换为字符串时,您会得到它是Python的解释[u'correct access key here']
。
您需要获取列表的第一个元素:
{{ test.msg.AccessKeyMetadata | json_query('[].AccessKeyId') | first }}
P.S。但是从我的角度来看,您的方式是错误的。尝试使用IAM模块来解决您的问题。