Cómo usar aws-cli desde Ansible Tower

Ansible dispone de varios módulos para manejar los servicios de AWS.

Si por alguna razón necesitas ejecutar algún comando concreto que no se puede hacer con los módulos que te ofrece Ansible, tienes que utilizar el cliente aws-cli.

De una forma sencilla podría ser algo así:

- hosts: 127.0.0.1 
  connection: local

  tasks: 
  - name: Describe Load Balancers 
    register: elbs 
    local_action: 
      module: shell aws elb describe-load-balancers

  - name: Print ELBs 
    debug: var=elbs

Perfecto, funciona!... si tienes instalado python3,

$ aws --version
aws-cli/1.2.9 Python/3.4.0 Linux/3.16.0-45-generic  

¿Qué pasa si quieres ejecutar ese mismo playbook desde Ansible Tower que se ejecuta con python2 ?

Lo primero es instalar aws-cli en el host de Ansible Tower.
Después Ansible Tower intentará ejecutar aws-cli con python2 dando un error parecido a este:

$ python2 /usr/bin/aws elb describe-load-balancers
Traceback (most recent call last):  
  File "/usr/bin/aws", line 15, in <module>
    import awscli.clidriver
  File "/usr/share/awscli/awscli/clidriver.py", line 16, in <module>
    import botocore.session

Aquí una posible solución usando -E
-E : ignore PYTHON* environment variables (such as PYTHONPATH)

- hosts: 127.0.0.1 
  connection: local

vars:  
  aws_env: 
   AWS_ACCESS_KEY_ID: "TICKETBIS" 
   AWS_SECRET_ACCESS_KEY: "ENGINEERING" 
   AWS_DEFAULT_REGION: "eu-west-1"

tasks:  
  - name: Describe Load Balancers 
    register: elbs 
    environment: aws_env 
    local_action: 
      module: shell python3 -E /usr/bin/aws elb describe-load-balancers

Gracias a Alberto Tablado ;)