Ansible 无法上传 AWS public 密钥 - 错误的 AWS 凭证
Ansible cannot upload AWS public key - wrong AWS credentials
我正在尝试将自定义 Public 密钥对上传到我的 Amazon AWS 帐户,因为我想使用自定义生成的密钥对与 AWS 进行通信。我正在尝试使用 Ansible 的 ec2_key
模块执行此上传。
这是我到目前为止所做的:
第 1 步。注册亚马逊 AWS 帐户 here。我输入了 "AWS Account Name" 和密码。
第 2 步。安装 Python 包 AWS CLI
和 boto
:
$ pip install awscli boto
第 3 步。生成 SSH 密钥对(我也使用了 Ansible):
- name: Generate a 2048-bit SSH key for user
user:
name: "{{ ansible_ssh_user }}"
generate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: ~/.ssh/id_rsa
第 4 步。我将 public 密钥 (~/.ssh/id_rsa.pub
) 的内容复制到 /home/username/.aws/credentials
。
第 5 步。使用 Ansible task 使用 Ansible 将 public 密钥上传到 Amazon AWS:
vars:
aws_access_key_id: my_key_name
aws_region: "us-west-2"
aws_secret_access_key: "ssh-rsa Y...r"
tasks:
- name: example3 ec2 key
ec2_key:
name: "{{ aws_access_key_id }}"
region: "{{ aws_region }}"
key_material: "{{ aws_secret_access_key }}"
state: present
force: True
validate_certs: yes
第 5 步的输出是:
An exception occurred during task execution. ..."module_stderr": "Traceback (most
recent call last):\n File \"/tmp/ansible_WqbqHU/ansible_module_ec2_key.py\",...
raise self.ResponseError(response.status, response.reason,
body)\nboto.exception.EC2ResponseError: EC2ResponseError: 401 Unauthorized\n<?xml
version=\"1.0\" encoding=\"UTF-8\"?>
\n<Response><Errors><Error><Code>AuthFailure</Code><Message>AWS was not able to
validate the provided access credentials</Message></Error></Errors>...
这是我的/home/username/.aws/credentials
(我刚编了一些key_id
):
[default]
aws_access_key_id = my_key_name
aws_secret_access_key = ssh-rsa Y...r
这是我的 /home/username/.aws/config
:
[default]
output = json
region = us-west-2
这两个文件似乎都符合 AWS 文档要求 here。
附加信息:
- 主机系统:Ubuntu 17.10(非根用户)
- 2 个 Ansible 任务 运行 来自单独的 Ansible 剧本 - 首先是 sshkeygen 剧本 运行,然后 ec2_key 剧本是 运行。 Ansible 剧本不是 运行 使用
become
.
- Ansible 版本 =
ansible==2.4.1.0
- Boto 版本 =
boto==2.48.0
, botocore==1.7.47
问题
- 如何指示 AWSCLI 与我的在线账户通信(第 1 步)?似乎我在使用
ec2_key
模块的 Ansible 任务中的某个地方错过了这一步。
- 目前,我在 (a) 第二个 Ansible 任务中有相同的 public 密钥来上传 public 密钥和 (b)
/home/username/.aws/credentials
。是否缺少此 Ansible 任务 something/incorrect?应该有第二个 public 键吗?
您的凭据中的秘密访问密钥看起来有误。如果您 运行 来自附加了 IAM 角色的 EC2 实例,那应该与 IAM 用户关联或留空;不是您要上传的密钥。
您已将 SSH public 密钥放入 secret_access_key 字段。
我看起来是这样的(当然这里的字母混合和替换,不是我真正的钥匙):
[Credentials]
aws_access_key_id = FMZAIQGTCHSLGSNDIPXT
aws_secret_access_key = gcmbyMs1Osj3ISCSasFtEx7sVCr92S3Mvjxlcwav
如果您转到 IAM (https://console.aws.amazon.com/iam),您可以重新生成您的密钥。
您需要转到 IAM->Users,单击您的用户名,单击 Security Credentials,然后 "Create Access Key".
如果您刚刚设置帐户,您可能没有 IAM 用户,只有所谓的根帐户用户(您注册的用户)。在这种情况下,单击主屏幕顶部的您的姓名,然后单击 select 我的安全凭证。您可能会收到警告,但不用担心,您不是 运行 大型组织。单击访问密钥下拉菜单并单击创建新访问密钥(您可能有 none)。这将为您提供所需的密钥。将它们保存在某个地方,因为当您离开屏幕时,您将不再有机会看到秘密访问密钥,只能看到密钥 ID。
但是,如果您使用的是附加了角色的计算机,则根本不需要凭据,boto 应该会选择它们。
你可以通过 SSH 连接到主机吗?我认为未经授权的错误来自您尝试访问主机。
就像是:
ssh ec2-user@165.0.0.105 - i my_key.pem
您可以在 aws 控制台中看到您的 public ip 地址。如果您在那里遇到错误,请仔细检查实例是否接受安全配置文件中的 ssh 流量。
我正在尝试将自定义 Public 密钥对上传到我的 Amazon AWS 帐户,因为我想使用自定义生成的密钥对与 AWS 进行通信。我正在尝试使用 Ansible 的 ec2_key
模块执行此上传。
这是我到目前为止所做的:
第 1 步。注册亚马逊 AWS 帐户 here。我输入了 "AWS Account Name" 和密码。
第 2 步。安装 Python 包 AWS CLI
和 boto
:
$ pip install awscli boto
第 3 步。生成 SSH 密钥对(我也使用了 Ansible):
- name: Generate a 2048-bit SSH key for user
user:
name: "{{ ansible_ssh_user }}"
generate_ssh_key: yes
ssh_key_bits: 2048
ssh_key_file: ~/.ssh/id_rsa
第 4 步。我将 public 密钥 (~/.ssh/id_rsa.pub
) 的内容复制到 /home/username/.aws/credentials
。
第 5 步。使用 Ansible task 使用 Ansible 将 public 密钥上传到 Amazon AWS:
vars:
aws_access_key_id: my_key_name
aws_region: "us-west-2"
aws_secret_access_key: "ssh-rsa Y...r"
tasks:
- name: example3 ec2 key
ec2_key:
name: "{{ aws_access_key_id }}"
region: "{{ aws_region }}"
key_material: "{{ aws_secret_access_key }}"
state: present
force: True
validate_certs: yes
第 5 步的输出是:
An exception occurred during task execution. ..."module_stderr": "Traceback (most
recent call last):\n File \"/tmp/ansible_WqbqHU/ansible_module_ec2_key.py\",...
raise self.ResponseError(response.status, response.reason,
body)\nboto.exception.EC2ResponseError: EC2ResponseError: 401 Unauthorized\n<?xml
version=\"1.0\" encoding=\"UTF-8\"?>
\n<Response><Errors><Error><Code>AuthFailure</Code><Message>AWS was not able to
validate the provided access credentials</Message></Error></Errors>...
这是我的/home/username/.aws/credentials
(我刚编了一些key_id
):
[default]
aws_access_key_id = my_key_name
aws_secret_access_key = ssh-rsa Y...r
这是我的 /home/username/.aws/config
:
[default]
output = json
region = us-west-2
这两个文件似乎都符合 AWS 文档要求 here。
附加信息:
- 主机系统:Ubuntu 17.10(非根用户)
- 2 个 Ansible 任务 运行 来自单独的 Ansible 剧本 - 首先是 sshkeygen 剧本 运行,然后 ec2_key 剧本是 运行。 Ansible 剧本不是 运行 使用
become
. - Ansible 版本 =
ansible==2.4.1.0
- Boto 版本 =
boto==2.48.0
,botocore==1.7.47
问题
- 如何指示 AWSCLI 与我的在线账户通信(第 1 步)?似乎我在使用
ec2_key
模块的 Ansible 任务中的某个地方错过了这一步。 - 目前,我在 (a) 第二个 Ansible 任务中有相同的 public 密钥来上传 public 密钥和 (b)
/home/username/.aws/credentials
。是否缺少此 Ansible 任务 something/incorrect?应该有第二个 public 键吗?
您的凭据中的秘密访问密钥看起来有误。如果您 运行 来自附加了 IAM 角色的 EC2 实例,那应该与 IAM 用户关联或留空;不是您要上传的密钥。
您已将 SSH public 密钥放入 secret_access_key 字段。
我看起来是这样的(当然这里的字母混合和替换,不是我真正的钥匙):
[Credentials]
aws_access_key_id = FMZAIQGTCHSLGSNDIPXT
aws_secret_access_key = gcmbyMs1Osj3ISCSasFtEx7sVCr92S3Mvjxlcwav
如果您转到 IAM (https://console.aws.amazon.com/iam),您可以重新生成您的密钥。 您需要转到 IAM->Users,单击您的用户名,单击 Security Credentials,然后 "Create Access Key".
如果您刚刚设置帐户,您可能没有 IAM 用户,只有所谓的根帐户用户(您注册的用户)。在这种情况下,单击主屏幕顶部的您的姓名,然后单击 select 我的安全凭证。您可能会收到警告,但不用担心,您不是 运行 大型组织。单击访问密钥下拉菜单并单击创建新访问密钥(您可能有 none)。这将为您提供所需的密钥。将它们保存在某个地方,因为当您离开屏幕时,您将不再有机会看到秘密访问密钥,只能看到密钥 ID。
但是,如果您使用的是附加了角色的计算机,则根本不需要凭据,boto 应该会选择它们。
你可以通过 SSH 连接到主机吗?我认为未经授权的错误来自您尝试访问主机。
就像是:
ssh ec2-user@165.0.0.105 - i my_key.pem
您可以在 aws 控制台中看到您的 public ip 地址。如果您在那里遇到错误,请仔细检查实例是否接受安全配置文件中的 ssh 流量。