【发布时间】:2021-05-15 04:41:24
【问题描述】:
我正在尝试使用 Ansible 的命令模块来运行以下命令:-
aws s3api put-bucket-encryption --bucket ovc-ov90test --server-side-encryption-configuration '{"Rules": [{"ApplyServerSideEncryptionByDefault": {"SSEAlgorithm": "AES256"}}]}'
当然,我想通过剧本变量传递标志值,这就是我正在使用的:
---
- name: Create s3 bucket
hosts: localhost
vars:
bucket_name: ovc-ov90test
encryption_rules: '{\"Rules\"\: [{\"ApplyServerSideEncryptionByDefault\"\: {\"SSEAlgorithm\"\: \"AES256\"}}]}'
tasks:
- name: Launch
block:
- name: Encrypt the bucket
command: 'aws s3api put-bucket-encryption --bucket {{ bucket_name }} --server-side-encryption-configuration {{ encryption_rules }}'
这是我的错误:
TASK [Encrypt the bucket] *******************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": ["aws", "s3api", "put-bucket-encryption", "--bucket", "ovc-ov90test", "--server-side-encryption-configuration", "{\"Rules\":", "[{\"ApplyServerSideEncryptionByDefault\":", "{\"SSEAlgorithm\":", "\"AES256\"}}]}"], "delta": "0:00:00.648339", "end": "2021-02-11 11:56:49.423938", "msg": "non-zero return code", "rc": 252, "start": "2021-02-11 11:56:48.775599", "stderr": "\nusage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]\nTo see help text, you can run:\n\n aws help\n aws <command> help\n aws <command> <subcommand> help\n\nUnknown options: {\"SSEAlgorithm\":, \"AES256\"}}]}, [{\"ApplyServerSideEncryptionByDefault\":", "stderr_lines": ["", "usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]", "To see help text, you can run:", "", " aws help", " aws <command> help", " aws <command> <subcommand> help", "", "Unknown options: {\"SSEAlgorithm\":, \"AES256\"}}]}, [{\"ApplyServerSideEncryptionByDefault\":"], "stdout": "", "stdout_lines": []}
PLAY RECAP **********************************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
我还尝试了encryption_values 的以下值(i. 转义双引号和大括号和方括号,以及 ii. 只转义双引号和大括号),但没有一个工作:
encryption_rules: '\{\"Rules\"\: \[\{\"ApplyServerSideEncryptionByDefault\"\: \{\"SSEAlgorithm\"\: \"AES256\"\}\}\]\}'
encryption_rules: '{\"Rules\"\: \[{\"ApplyServerSideEncryptionByDefault\"\: \{\"SSEAlgorithm\"\: \"AES256\"}}\]}'
从encryption_rules 变量中删除单引号后在任务中使用{{ encryption_rules | quote }} 也不起作用。我猜解决方案是转义正确字符的某种组合,但我不知道是哪个。任何帮助将不胜感激!
PS:这在命令行上运行正确,所以 IAM 权限绝对不是问题。
【问题讨论】:
-
我已经调试了你的问题,问题是在将 json 传递给命令模块时,它被空格分割,导致命令不正确,
aws实用程序生成错误。我试图将 JSON 包装为单个值,但 ansible 要么将所有双引号替换为单引号,要么完全删除它们,因为aws实用程序抱怨。如果您正在寻找问题,它是寻找的地方。 -
@ShubhamVaishnav 感谢您的帮助,不胜感激!