У меня работает новый сервер Ansible AWX, и одна из вещей, которые я хотел бы с ним сделать, - это создать AMI экземпляров AWS перед установкой регулярных обновлений экземпляров.
У меня есть playbooks, которые хорошо работают с установкой обновлений, но я не могу заставить пользовательский интерфейс AWX правильно передавать учетные данные AWS через шаблон.
Я запускаю тестовый шаблон, который только создает AMI, и я постоянно выхожу из строя с сообщением о том, что не могу найти учетные данные.
В AWX есть раздел учетных данных. Я добавил ключ доступа и секретный ключ пользователя IAM, у которого есть на это права. Несмотря на добавление этих учетных данных в шаблон вакансии, я получаю вот такой результат:
{
"_ansible_parsed": true,
"exception": "Traceback (most recent call last):\n File \"/tmp/ansible_fj8G6M/ansible_module_ec2_ami.py\", line 433, in create_image\n image_id = connection.create_image(**params).get('ImageId')\n File \"/usr/lib/python2.7/site-packages/botocore/client.py\", line 320, in _api_call\n return self._make_api_call(operation_name, kwargs)\n File \"/usr/lib/python2.7/site-packages/botocore/client.py\", line 610, in _make_api_call\n operation_model, request_dict)\n File \"/usr/lib/python2.7/site-packages/botocore/endpoint.py\", line 102, in make_request\n return self._send_request(request_dict, operation_model)\n File \"/usr/lib/python2.7/site-packages/botocore/endpoint.py\", line 132, in _send_request\n request = self.create_request(request_dict, operation_model)\n File \"/usr/lib/python2.7/site-packages/botocore/endpoint.py\", line 116, in create_request\n operation_name=operation_model.name)\n File \"/usr/lib/python2.7/site-packages/botocore/hooks.py\", line 356, in emit\n return self._emitter.emit(aliased_event_name, **kwargs)\n File \"/usr/lib/python2.7/site-packages/botocore/hooks.py\", line 228, in emit\n return self._emit(event_name, kwargs)\n File \"/usr/lib/python2.7/site-packages/botocore/hooks.py\", line 211, in _emit\n response = handler(**kwargs)\n File \"/usr/lib/python2.7/site-packages/botocore/signers.py\", line 90, in handler\n return self.sign(operation_name, request)\n File \"/usr/lib/python2.7/site-packages/botocore/signers.py\", line 157, in sign\n auth.add_auth(request)\n File \"/usr/lib/python2.7/site-packages/botocore/auth.py\", line 356, in add_auth\n raise NoCredentialsError\nNoCredentialsError: Unable to locate credentials\n",
"_ansible_no_log": false,
"botocore_version": "1.12.16",
"changed": false,
"invocation": {
"module_args": {
"enhanced_networking": null,
"purge_tags": false,
"launch_permissions": null,
"ramdisk_id": null,
"no_reboot": false,
"ec2_url": null,
"aws_secret_key": null,
"billing_products": null,
"state": "present",
"virtualization_type": "hvm",
"sriov_net_support": null,
"architecture": "x86_64",
"profile": null,
"image_location": null,
"description": "",
"tags": {
"Name": "i-sdfsdf987987"
},
"kernel_id": null,
"image_id": null,
"wait_timeout": 900,
"wait": false,
"aws_access_key": null,
"name": "i-sdfsdf987987",
"security_token": null,
"delete_snapshot": false,
"region": "eu-west-2",
"instance_id": "i-sdfsdf987987",
"root_device_name": null,
"validate_certs": true,
"device_mapping": null
}
},
"msg": "Error registering image: Unable to locate credentials",
"boto3_version": "1.9.16"
И это моя игра:
---
- hosts: all
remote_user: "{{ remote_user }}"
become: yes
tasks:
- name: create an ami
ec2_ami:
instance_id: "{{ instance_id }}"
name: "{{ instance_id }}"
region: "{{ aws_region }}"
tags:
Name: "{{ instance_id }}"
Если я добавлю учетные данные вручную в качестве переменной на хосте в пользовательском интерфейсе AWX, то добавьте строки:
aws_access_key: "{{ aws_access_key }}"
aws_secret_key: "{{ aws_secret_key }}"
тогда все хорошо. Но это, казалось бы, игнорирует очевидные преимущества использования поддержки хранилища учетных данных AWX.
Детали окружающей среды:
Кто-нибудь может увидеть, что я делаю не так?
Итак, в конце концов я настроил учетные данные AWS на каждой машине и сделал это таким образом. Кажется, это должно быть возможно сделать так, как я изначально пытался, но мне нужно, чтобы это работало.
На целевой машине убедитесь, что awscli tools
установлены, затем запустите aws configure
для добавления учетных данных, региона по умолчанию и, если вам нравится вариант вывода по умолчанию.
Вам также необходимо убедиться pip
, boto
и botocore
установлены.
Затем я обновил playbook следующим образом:
---
- hosts: all
remote_user: "{{ remote_user }}"
tasks:
- name: create an ami
ec2_ami:
instance_id: "{{ instance_id }}"
name: "{{ instance_id }}-{{ ansible_date_time.iso8601_basic }}"
tags:
Name: "{{ instance_id }}-{{ ansible_date_time.iso8601_basic }}"
Как видите, я удалил region
так как это указано на каждой машине, и изменено название AMI. Я также удалил become
потому что конфигурация AWS не выполняется под пользователем root, поэтому это также вызывает сбой.