2015-03-11 2 views
4

Я пытаюсь использовать Ansible для загрузки некоторых файлов в различные экземпляры EC2. Проблема, с которой я сталкиваюсь, - это когда речь заходит о моих учетных данных AWS. Модули AWS Ansible работают отлично, включая модуль S3. Следующий (когда я заменяю свои учетные данные AWS) работает как шарм.Ansible и s3 module

- name: upload data import file 
    s3: aws_access_key=<accesskey> aws_secret_key=<secretkey> bucket=my-bucket object=/data.zip mode=get 

Однако мне нужно анзибль playbooks и роли, которую я пишу, чтобы использоваться кем-либо, и я не хочу иметь учетные данные AWS жёстко прописанные. В других местах я использую модули Ansible AWS, я удалил aws_access_key и aws_secret_key, и он отлично работает, поскольку Ansible ищет эти значения в переменных среды. Однако, с каждым другим использованием, я запускаю их как локальные действия. Таким образом, он вытаскивает учетные данные с моей локальной машины, чего я хочу. Проблема заключается в том, когда я бегу модуль S3 на одном из моих случаев, если исключить из учетных параметров, я получаю:

failed: [54.173.19.238] => {"failed": true} 
msg: No handler was ready to authenticate. 1 handlers were checked. ['HmacAuthV1Handler'] Check your credentials 

Я полагаю, что это потому, что, так как я не указаны учетные данные, это ищет их в переменных среды на моем экземпляре, где они не установлены. Я также не хочу устанавливать их в переменных среды на экземпляре.

Есть ли способ загрузить файл с S3 с возможностью доступа и не указывать свои учетные данные AWS?

ответ

2

В экземпляре EC2 лучшим способом разрешить запуск кода для доступа к ресурсу AWS является использование роли IAM.

Вы назначаете роль любому экземпляру при его запуске. В роли может быть задана любая политика.

Внутри экземпляра любой процесс может подключаться к известному URL-адресу для извлечения временных клавиш для аутентификации любой службы AWS.

Boto, библиотека Python, используемая модулем Ansible S3, имеет автоматическую поддержку ролей IAM. Поэтому, если ключ не предоставляется напрямую или в переменной среды, Boto запросит известный URL-адрес, чтобы получить ключ экземпляра.

Более подробную информацию о том, как IAM ролей работы можно найти здесь: http://docs.aws.amazon.com/IAM/latest/UserGuide/roles-usingrole-ec2instance.html#role-usecase-ec2app-permissions

+0

Роли IAM отличные.Кроме того, если создатель пытается сделать это из экземпляра, отличного от EC2, он использует формат учетных данных boto, и вы можете изменять профили с помощью 'AWS_DEFAULT_PROFILE =" profilename "'. – tedder42

+0

Проблема с подходом к профилю boto заключается в том, что у OP есть учетные данные на хосте Ansible, но не на хосте, на котором работает модуль S3, и он не хочет, чтобы ключи были жестко закодированы в любом месте. Чтобы временно использовать профиль boto, ему нужно будет выписать временный профиль boto с соответствующими учетными данными на целевом хосте, вызвать модуль S3, а затем удалить профиль. Это большая работа. –

+0

Это работало отлично для меня. Я изменил сценарии Ansible, которые я использую для создания своих экземпляров EC2, исключил все упоминания учетных данных в другом месте и voila. Благодаря! –

2

Если у вас есть AWS_SECRET_KEY и AWS_ACCESS_KEY переменные окружения, установленные на вашем анзибль хосте, то вы могли бы потенциально передать их в качестве переменных на анзибль командной строке что вы могли бы ссылаться на них в вашем PlayBook:

$ ansible-playbook playbook.yml --extra-vars="mykey=${AWS_ACCESS_KEY} mysecret=${AWS_SECRET_KEY}" 

Если вы вызываете ваш сборник пьес из сценария, то это потенциально хороший способ сделать это. Другой подход состоял бы в том, чтобы прочитать эти переменные в вашей книге, а затем ссылаться на них таким образом. Я не пробовал это сам, но что-то вдоль этих линий должно работать: модуль

- name: get AWS_ACCESS_KEY 
    local_action: shell echo ${AWS_ACCESS_KEY} 
    register: mykey 

- name: get AWS_SECRET_KEY 
    local_action: shell echo ${AWS_SECRET_KEY} 
    register: mysecret 

- name: upload data import file 
    s3: aws_access_key={{ mykey.stdout }} aws_secret_key={{ mysecret.stdout }} bucket=my-bucket object=/data.zip mode=get 
3

S3 в анзибле не поддерживает опцию профиля, но вы можете использовать, как это, если вы экспортировали aws_key и aws_secret как переменные:

export aws_key="AAAAAAAAAAAAAAAAAAAAAAAAAA" 
export aws_secret="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 

Затем вы можете использовать их как это:

s3: 
    aws_access_key: "{{ lookup('env','aws_key') }}" 
    aws_secret_key: "{{ lookup('env','aws_secret') }}" 
    bucket: "my-bucket" 
    object: "/data.zip" 
    mode: get 

надеется, что это поможет вам или кому-либо, кто ищет, чтобы использовать локальные переменные среды внутри апа sible playbook. Спасибо

+0

вы могли бы просто экспортировать переменные среды оболочки AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY', а ansible будет автоматически использовать их без необходимости измените свой код. –

Смежные вопросы