Como usar um papel do AWS EC2 Iam com o Ansible

3

Estou executando o Ansible em uma instância do EC2 com uma função IAM atribuída. Estou executando este manual:

$ cat s3.yaml
---
- hosts: localhost
  remote_user: ec2-user
  tasks:
    - name: download ec2.py from s3
      s3:
        bucket: mybucket
        object: /ec2.py
        dest: /tmp/ec2.py
        mode: get

Executá-lo com -vvv fornece esta mensagem de erro:

fatal: [localhost]: FAILED! => {
    "changed": false, 
    "failed": true, 
    "invocation": {
        "module_args": {
            "aws_access_key": null, 
            "aws_secret_key": null, 
            "bucket": "mybucket", 
            "dest": "/tmp/ec2.py", 
            "ec2_url": null, 
            "encrypt": true, 
            "expiry": "600", 
            "headers": null, 
            "marker": null, 
            "max_keys": "1000", 
            "metadata": null, 
            "mode": "get", 
            "object": "/ec2.py", 
            "overwrite": "always", 
            "permission": [
                "private"
            ], 
            "prefix": null, 
            "profile": null, 
            "region": null, 
            "retries": 0, 
            "rgw": false, 
            "s3_url": null, 
            "security_token": null, 
            "src": null, 
            "validate_certs": true, 
            "version": null
        }, 
        "module_name": "s3"
    }, 
    "msg": "Source bucket cannot be found"
}

De acordo com a documentação, o Ansible with boto deve ser capaz de pegar o papel de instância do EC2.

Até agora eu tenho:

  • Tentei a documentação, o que implica que ela deveria funcionar.
  • Confirmei que minha versão boto é nova o suficiente (boto 2.42)
  • Verificado o papel da instância do EC2 tem as permissões corretas ( aws s3 cp s3://mybucket/ec2.py /tmp/ec2.py funciona bem)
  • Verificado as credenciais da instância do EC2 estão disponíveis por meio de curl http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access

Esta questão foi respondida e a documentação indica que é possível .

Posso fazer isso sem disponibilizar as credenciais da instância para o boto / ansible diretamente? Se sim, como. A documentação parece um pouco deficiente.

    
por M. Glatki 07.12.2016 / 11:24

2 respostas

1

Depois de mais algumas depurações e experimentos, descobri que a causa do problema é um bug no módulo Ansible S3.

O ansioso manual que citei na minha pergunta original só funciona se o papel do IAM tiver permissões ListBucket além das permissões GetObject .

    
por 15.12.2016 / 14:46
0

Estou enfrentando exatamente o mesmo problema. Descobri que, se eu fornecer a ID da chave de acesso e a chave de acesso secreto da AWS por meio de uma lista de reprodução ansiosa, ela funcionará e fará o download do objeto da S3. Executá-lo como um comando ansible com chaves fornecidas em linha também funciona. Portanto, a mensagem "O intervalo de origem não pode ser encontrado" é enganosa e isso ocorre porque o Ansible não pode usar o papel do IAM.

Há um ticket de bug em Ansible GitHub (eu acho que foi aberto pelo mesmo autor) mas ainda é não resolvido.

    
por 09.02.2017 / 01:49