没有准备好进行身份验证的处理程序。已检查1个处理程序:['HmacAuthV4Handler'] 检查您的凭据。

15

我正在尝试在 AWS 上的我的 EC2 实例上第一次运行 ansible,但每次我尝试运行 play 时,我都无法绕过此错误消息:

PLAY [localhost]
**************************************************************

TASK: [make one instance]
***************************************************** 
failed: [localhost] => {"failed": true} msg: No handler was ready to
authenticate. 1 handlers were checked. ['HmacAuthV4Handler'] Check
your credentials

FATAL: all hosts have already failed -- aborting

PLAY RECAP
********************************************************************
   to retry, use: --limit @/home/ubuntu/ans_test.retry

localhost                  : ok=0    changed=0    unreachable=0   
failed=1

我认为我的IAM用户和组的权限可能存在问题。我已将我的IAM用户和组分别分配了ReadOnlyAccess、AdministratorAccess和PowerUserAccess权限。我有一组访问ID和秘密访问密钥,我正在使用以下命令将其设置为环境变量:

   export AWS_ACCESS_KEY_ID='AK123'
   export AWS_SECRET_ACCESS_KEY='abc123'

把我的实际id和key值替换为“AK123”和“abc123”。为了使ansible ec2任务起作用,我还需要做什么?

更新:
我已经解决了这个问题,我想我并没有真正理解环境变量是什么。我通过在我的ec2任务中设置aws_access_key和aws_secret_key来解决了这个问题,下面是我的工作剧本。

- hosts: localhost  
  connection: local  
  gather_facts: False  

  tasks:  
    #this task creates 5 ec2 instances that are all named demo and are copies of the image specified  
    - name: Provision a set of instances  
      ec2:  
         aws_access_key: .....  
         aws_secret_key: ....  
         key_name: .....  
         group: .....  
         instance_type: t2.micro  
         image: ......  
         region: us-east-1  
         ec2_url: .......  
         wait: true  
         exact_count: 5  
         count_tag:  
            Name: Demo  
         instance_tags:  
            Name: Demo  
      register: ec2  

我想现在我需要开始使用Ansible Vault来保存我的密钥和ID。


你能在你的问题中包含playbook吗? - jonatan
我认为Ansible在整个play期间不会保留环境变量。你尝试过在命令中设置变量吗?例如:command: " export AWS_ACCESS_KEY_ID='AK123' && export AWS_SECRET_ACCESS_KEY='abc123' && actual command" - Henrik Pingel
5个回答

12

对于遇到这个问题的人,您可以通过在playbook中设置become/sudo: Falseconnection: local来解决它。

---
- hosts: localhost
  connection: local
  become: False
  tasks:
   ...
   ...

希望这能帮助其他人。


4

我解决了这个问题,我猜我对环境变量的理解并不扎实。我通过在我的ec2任务中设置aws_access_key和aws_secret_key来解决了它,以下是我的可行剧本。

- hosts: localhost  
  connection: local  
  gather_facts: False  

  tasks:  
    #this task creates 5 ec2 instances that are all named demo and are copies of the image specified  
    - name: Provision a set of instances  
      ec2:  
         aws_access_key: .....  
         aws_secret_key: ....  
         key_name: .....  
         group: .....  
         instance_type: t2.micro  
         image: ......  
         region: us-east-1  
         ec2_url: .......  
         wait: true  
         exact_count: 5  
         count_tag:  
            Name: Demo  
         instance_tags:  
            Name: Demo  
      register: ec2  

我想现在我需要开始使用ansible vault来保存我的密钥和ID。


3
在我的情况下,变量必须用引号括起来(单引号或双引号都可以)。
不好的写法:
export AWS_ACCESS_KEY_ID=AK123
export AWS_SECRET_ACCESS_KEY=abc123

好的:

export AWS_ACCESS_KEY_ID='AK123'
export AWS_SECRET_ACCESS_KEY='abc123'

GOOD:

export AWS_ACCESS_KEY_ID="AK123"
export AWS_SECRET_ACCESS_KEY="abc123"

1
如果变量中有特殊字符,这将非常重要。例如,单引号不会扩展$或!,而双引号会。如果您在这些字符中使用双引号,这将导致身份验证失败。 - krad

0
值得一提的是,ec2 模块使用了 boto 包,而较新的 ec2_instance 模块则使用了 boto3
很明显,这两个软件包/版本在检测凭据或其环境方面存在差异。我还没有找到一个解决方案,使得 ec2 模块能够在 ECS 容器内工作,最可能是因为 ECS 在 boto 的最后一个版本发布时并不存在,因此它无法检测 ECS 容器的 "实例配置文件"。而对于 ec2_instance,这个问题不需要任何额外的配置就可以解决。

0
这是一个示例.boto文件的样式,其他任何样式都会导致问题和错误。
[凭证]
#aws_access_key_id =
#aws_secret_access_key =

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接