Ansible无法上传AWS公钥 - 错误的AWS凭据

时间:2017-11-18 15:38:47

标签: amazon-web-services amazon-ec2 ansible ansible-2.x

我正在尝试将自定义公钥对上传到我的Amazon AWS账户,因为我想使用自定义生成的密钥对与AWS进行通信。我正在尝试使用Ansible的ec2_key模块执行此上传。

这是我到目前为止所做的:

步骤1.注册Amazon AWS账户here。我输入了“AWS账户名称”和密码。

步骤2.安装Python包AWS CLIboto

$ 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.我将公钥(~/.ssh/id_rsa.pub)的内容复制到/home/username/.aws/credentials

步骤5.使用Ansible task使用Ansible将公钥上传到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

其他信息:

  1. 主机系统:Ubuntu 17.10(非root用户)
  2. 2个Ansible任务是从单独的Ansible剧本运行的 - 首先运行sshkeygen剧本,然后运行ec2_key剧本。 Ansible playbooks不能使用become
  3. 运行
  4. Ansible version = ansible==2.4.1.0
  5. Boto版本= boto==2.48.0botocore==1.7.47
  6. 问题

    1. 如何指示AWSCLI与我的在线帐户进行通信(步骤1)?似乎我在使用ec2_key模块的Ansible任务中的某处错过了这一步。
    2. 目前,我在(a)上传公钥的第二个Ansible任务和(b)/home/username/.aws/credentials中有SAME公钥。这个Ansible任务缺少什么/不正确吗?应该有第二张公钥吗?

3 个答案:

答案 0 :(得分:2)

您已将SSH公钥放入secret_access_key字段。

对我来说这看起来像这样(字母混合并在此替换,而不是我真正的密钥):

[Credentials]
    aws_access_key_id = FMZAIQGTCHSLGSNDIPXT
    aws_secret_access_key = gcmbyMs1Osj3ISCSasFtEx7sVCr92S3Mvjxlcwav 

如果您转到IAM(https://console.aws.amazon.com/iam),您可以重新生成密钥。 您需要转到IAM-&gt;用户,单击您的用户名,单击安全凭据和“创建访问密钥”。

如果您刚刚设置了自己的帐户,则可能是您没有IAM用户,只有所谓的root帐户用户(您注册的用户)。在这种情况下,请单击主屏幕顶部的名称,然后选择我的安全凭据。您可能会收到警告,但在您的情况下不用担心,您没有运营大型组织。单击“访问密钥”下拉列表,然后单击“创建新访问密钥”(您可能没有)。这将为您提供所需的钥匙。将它们保存在某个地方,因为当您离开屏幕时,您将不再有机会看到秘密访问密钥,只有密钥ID。

但是,如果您使用的是附加了角色的计算机,则根本不需要凭据,boto应该选择它们。

答案 1 :(得分:1)

您的密码在您的凭据中显示错误。如果您从附加了IAM角色的EC2实例运行,那么应与IAM用户关联或留空;不是你要上传的密钥。

答案 2 :(得分:0)

您可以通过SSH连接到主机吗?我认为未经授权的错误来自您尝试访问主机。 就像是: ssh ec2-user@165.0.0.105 - i my_key.pem

您可以在aws控制台中查看公共IP地址。如果您在那里遇到错误,请仔细检查实例是否接受安全配置文件中的ssh流量。