Статический инвентарь не будет служить потребностям при отслеживании и развертывании к нескольким источникам с хостами, вращающимися вверх и отключение в ответ на бизнес-требования. Решением такой сменной инфраструктуры будет несеменным динамическим запасом. Для этого вам понадобится файл INI Provider Cloud Provider (E.g aws.ini) и EC2.PY (какое неизбежное использование для связи с AWS API для получения метаданных для всех экземпляров). Этот пост ориентирован на AWS (Amazon Web Service).
EC2.INI
Файл, предоставленный Anisible. Все облачный провайдер .ini.ini.
можно найти здесь https://github.com/ansable/ansable/tree/stable-2.9/Contrib/inventory.
EC2.PY: EC2 Сценарий внешнего запаса, который динамически выбирает данные от AWS API
Чтобы настроить внешний инвентарный запас EC2, скопируйте скрипт на /etc/ansable/ec2.py
и бежать chmod + x/etc/ansable/ec2.py
Отказ Вам также нужно будет скопировать EC2.INI
Файл на /etc/ansable/ec2.ini
Отказ Затем запустите Ansible-Playbook нормально, можно проанализировать —лимит Args.
Чтобы сделать успешный звонок AWS API, настроить Boto. Доступны различные методы, вы можете добавить настройки вашего учетных данных AWS, настроив свой ~/.aws/учетные данные
Или экспортировать следующие переменные среды:
export AWS_ACCESS_KEY_ID='mYaWeSoMeAcCeSsKeY′ export AWS_SECRET_ACCESS_KEY='IcAnToTaLlYpUtMySeCrEtHeRe′
Настройте еще несколько переменных окружающей среды к сценарию управления запасами, таким как
$ export ANSIBLE_HOSTS=/PATH/ec2.py $ export EC2_INI_PATH=/PATH/ec2.ini
Эта переменная устанавливает Ansible-Playbook для использования сценария Dynamic EC2 вместо статического /etc/ansible/hosts
файл. Откройте EC2.PY
В текстовом редакторе и убедитесь, что путь к файлу конфигурации EC2.INI Config определен правильно в верхней части скрипта:
EC2_INI_PATH
Поручает EC2.PY
Где EC2.INI
Config файл находится.
Сделайте сценарий исполняемого и проверить его, запустив ./ec2.py. -список
$ ./ec2.py --list { "_meta": { "hostvars": { "1.9O.1OO.12O": { "ansible_host": "1.9O.1OO.12O", "ec2__in_monitoring_element": false, "ec2_account_id": "19OP23I42OF3", "ec2_ami_launch_index": "0", .... "ec2_tag_App": "olonje", "ec2_tag_Env": "Staging", "ec2_tag_Name": "Bami Gbe", "ec2_virtualization_type": "hvm", "ec2_vpc_id": "vpc-IaMhIdDeN" }, "4.OOO.122.1OO9": { "ansible_host": "4.OOO.122.1OO9", "ec2__in_monitoring_element": false, ... "ec2_key_name": "emi-moni-profile", "ec2_root_device_name": "/dev/xvda", "ec2_tag_App": "ounje2", "ec2_tag_Env": "prod", "ec2_tag_Name": "Production Stack", "ec2_virtualization_type": "hvm", "ec2_vpc_id": "vpc-IaMhIdDeN" } } }, "ami_1k02nd83js84k6apO": [ "1.9O.1OO.12O", "4.OOO.122.1OO9" ], "tag_App_olonje": [ "1.9O.1OO.12O" ], "tag_App_order2": [ "4.OOO.122.1OO9" ], "tag_Env_Staging": [ "1.9O.1OO.12O" ], "tag_Env_prod": [ "4.OOO.122.1OO9" ], "tag_Name_app_Worker": [ "1.9O.1OO.12O" ], "tag_Name_Production_Stack": [ "4.OOO.122.1OO9" ], "vpc_id_vpc_IaMhIdDeN": [ "1.9O.1OO.12O", "4.OOO.122.1OO9" ] }
Чтобы точно настроить выходные данные и другие функции, которые не применимы, обратитесь к EC2.INI
файл. Для нескольких учетных записей AWS вы можете пройти - Профиль
Имя профиля на EC2.PY
скрипт
$ cat ~/.aws/credentials [default] aws_access_key_id =aws_secret_access_key = [profile tito] aws_access_key_id = aws_secret_access_key = [profile ounje] aws_access_key_id = aws_secret_access_key =
Чтобы получить инвентарь для учетной записи Ounje Run AWS_PROFILE = Ounje Ansible-Playbook -i/etc/ansable/ec2.py myplaybook.yml
Отказ Поскольку внешний инвентарь EC2 предоставляет сопоставлениями к экземплярам из нескольких групп, мы можем отфильтровать целевой экземпляр на основе тега ресурса. Говоря о Теги.
Теги
Каждый экземпляр имеет различные пары клавиш/значение, связанные с ним, называемыми на нем Теги Отказ Наиболее распространенной клавишей тега «Имя», хотя все возможно. Каждая пара Key/Value — это собственная группа экземпляров, снова со специальными символами, преобразованными в подчеркивание, в формате Tag_key_Value например tag_name_web
Может использоваться как tag_name_redis-master-001
становится tag_name_redis_master_001.
tag_aws_cloudformation_logical-id_webservergroup
становится tag_aws_cloudformation_logical_id_webservergroup.
Когда Anisible взаимодействует с конкретным сервером, сценарий инвентаризации EC2 снова вызывается параметром Host Host. Это смотрит на хост в кэше индекса, чтобы получить идентификатор экземпляра, а затем делает вызов API AWS, чтобы получить информацию об этом конкретном экземпляре. Затем он производит информацию об этом экземпляре, доступной в качестве переменных для ваших игровых книг. Каждая переменная префиксирована EC2_. например
ec2_dns_name ec2_id ec2_image_id ec2_instance_type ec2_ip_address ec2_tag_Name ec2_vpc_id ...
Подробнее
Чтобы увидеть полный список переменных, доступных для экземпляра, запустите скрипт сам по себе:
/etc/ansible/ec2.py --host ec2-12-1O1-14-12.compute-1.amazonaws.com
ПРИМЕЧАНИЕ. API Вызывы в EC2 могут быть медленными. Следовательно, результаты API кэшируются. Количество секунд кэша считается действительным, может быть обновлено в EC2.INI
Файл в /etc/ansable/ec2.ini
Отказ Настройка по умолчанию
... cache_max_age = 300 ...
Вы можете установить это на cache_max_age = 0
Отказ
Тестирование нашего динамического инвентаря выше
Запуск развертывания Ansible-Playbook. Использование образец
- name: Deploy Ounje Artifact hosts: all vars: - app: "e-status " - env: "staging" tasks: - name: Get Instance IDs ec2_remote_facts: aws_access_key: "moYaCoverSecretMi" aws_secret_key: "amalaShitaLoSureJuMafo" region: "us-east-1" filters: "tag:Env": "{{ env }}" register: gbebodi - name: Store ounje hosts debug: var=gbebodi - name: Store Ounje EC2 instance ID set_fact: instance_id: "{{ item.id }}" with_items: "{{ gbebodi.instances }}" - name: Store EC2 instance ID in var debug: var=instance_id
Команда выполнения:
$ ansible-playbook -i /etc/ansible/ec2.py --limit "tag_App_order2" -u ec2-user sample.yml -e env=prod
В приведенном выше примере:
Ansible-Playbook
это стандартная команда для запуска Ansible PlayBook/etc/ansable/ec2.py
Очки Anbible Inventory для использования EC2.PY для выноски AWS API для получения экземпляра EC2 метаданные--лимит "tag_app_ounje2"
Это ограничивает хост, который вы хотите направить, наставляя Ansible-PlayBook, чтобы вытащить метаданные все случаи с тегом ключаПриложение
и ценностьounje2.
. Это позволяет использовать Ansible Playbook, чтобы узнать, где запустить задачи, знают, какой экземпляр вы хотите получить доступ и ограничить действия единственным OUNJE2образец .yml
это название нашего файла PlayBook-Е
способ разбирать переменную env в PlayBook или переопределить переменную ENV по умолчанию-у
Указывает, что пользовательские обязательные должны использовать для входа в экземпляр.
выход
$ ansible-playbook -i /etc/ansible/ec2.py --limit "tag_App_ounje2" -u ec2-user sample.yml -e env=prod [DEPRECATION WARNING]: ec2_remote_facts is kept for backwards compatibility but usage is discouraged. The module documentation details page may explain more about this rationale.. This feature will be removed in a future release. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg. PLAY [Deploy Ounje Artifact] *********************************************************************************************************************************** TASK [Gathering Facts] ****************************************************************************************************************************************** Monday 23 September 2O19 O1:17:25 -O4OO (O:OO:OO.141) O:OO:OO.141 ****** ok: [1.OO.1O9.111] TASK [Get Instance IDs] ***************************************************************************************************************************************** Monday 23 September 2O19 O1:17:28 -O4OO (O:OO:O2.234) O:OO:O2.376 ****** ok: [1.OO.1O9.111] TASK [Store ounje hosts] *************************************************************************************************************************************** Monday 23 September 2O19 O1:17:29 -O4OO (O:OO:O1.481) O:OO:O3.857 ****** ok: [1.OO.1O9.111] => { "ounje": { "changed": false, "failed": false, "instances": [ { "ami_launch_index": "O", "architecture": "x86_94", "block_device_mapping": [ { "attach_time": "2O19-O6-23TO4:54:57.OOOZ", "delete_on_termination": true, "device_name": "/dev/xvda", "status": "attached", "volume_id": "vol-298hfn3f348ff4f348f" } ], "client_token": "", "ebs_optimized": false, "groups": [ { "id": "sg-Of11425adOe7f7d1a", "name": "launch-wizard-13" } ], "hypervisor": "xen", "id": "i-1O293847561OO293", "image_id": "ami-1k02nd83js84k6apO", "instance_profile": null, "interfaces": [ { "id": "eni-nf32f2fn48489r348", "mac_address": "41:9O:i7:dc:69:lO" } ], "kernel": null, "key_name": "emi-moni-profile", "launch_time": "2O19-O6-23TO4:54:56.OOOZ", "monitoring_state": "disabled", "persistent": false, "placement": { "tenancy": "default", "zone": "us-east-1c" }, "private_dns_name": "ip-1-OO-1O9-111.ec2.internal", "private_ip_address": "OO7-OO-69-42O", "public_dns_name": "ec2-1-OO-1O9-111.compute-1.amazonaws.com", "public_ip_address": "1.OO.1O9.111", "ramdisk": null, "region": "us-east-1", "requester_id": null, "root_device_type": "ebs", "source_destination_check": "true", "spot_instance_request_id": null, "state": "running", "tags": { "App": "ounje2", "Env": "prod", "Name": "Production Stack" }, "virtualization_type": "hvm", "vpc_id": "vpc-IaMhIdDeN" } ] } } TASK [Store EC2 instance ID] ************************************************************************************************************************************ Monday 23 September 2O19 O1:17:29 -O4OO (O:OO:OO.145) O:OO:O4.OO3 ****** ok: [1.OO.1O9.111] => (item={u'ramdisk': None, u'kernel': None, u'instance_profile': None, u'root_device_type': u'ebs', u'private_dns_name': u'ip-1-OO-1O9-111.ec2.internal', u'block_device_mapping': [{u'status': u'attached', u'device_name': u'/dev/xvda', u'delete_on_termination': True, u'attach_time': u'2O19-O6-23TO4:54:57.OOOZ', u'volume_id': u'vol-298hfn3f348ff4f348f'}], u'key_name': u'emi-moni-profile', u'interfaces': [{u'id': u'eni-nf32f2fn48489r348', u'mac_address': u'41:9O:i7:dc:69:lO'}], u'persistent': False, u'image_id': u'ami-1k02nd83js84k6apO', u'groups': [{u'id': u'sg-Of11425adOe7f7d1a', u'name': u'launch-wizard-13'}], u'spot_instance_request_id': None, u'requester_id': None, u'source_destination_check': u'true', u'id': u'i-1O293847561OO293', u'tags': {u'App': u'ounje2', u'Name': u'Production Stack', u'Env': u'prod'}, u'public_ip_address': u'1.OO.1O9.111', u'monitoring_state': u'disabled', u'placement': {u'tenancy': u'default', u'zone': u'us-east-1c'}, u'ami_launch_index': u'O', u'hypervisor': u'xen', u'region': u'us-east-1', u'ebs_optimized': False, u'launch_time': u'2O19-O6-23TO4:54:56.OOOZ', u'public_dns_name': u'ec2-1-OO-1O9-111.compute-1.amazonaws.com', u'state': u'running', u'architecture': u'x86_94', u'private_ip_address': u'OO7-OO-69-42O', u'vpc_id': u'vpc-IaMhIdDeN', u'client_token': u'', u'virtualization_type': u'hvm'}) TASK [Store EC2 instance ID in var] ***************************************************************************************************************************** Monday 23 June 2O19 O1:17:29 -O4OO (O:OO:OO.173) O:OO:O4.176 ****** ok: [1.OO.1O9.111] => { "instance_id": "i-1O293847561OO293" } PLAY RECAP ****************************************************************************************************************************************************** 1.OO.1O9.111 : ok=5 changed=O unreachable=O failed=O Monday 23 June 2O19 O1:17:29 -O4OO (O:OO:OO.11O) O:OO:O4.287 ****** =============================================================================== Gathering Facts ------------------------------------------------------------------------------------------------------------------------------------------ 2.23s Get Instance IDs ----------------------------------------------------------------------------------------------------------------------------------------- 1.48s Store EC2 instance ID ------------------------------------------------------------------------------------------------------------------------------------ O.17s Store ounje hosts --------------------------------------------------------------------------------------------------------------------------------------- O.15s Store EC2 instance ID in var ----------------------------------------------------------------------------------------------------------------------------- O.11s Playbook run took O days, O hours, O minutes, 4 seconds
Несодержательным для обслуживания, вы можете развернуть на свежево созданные экземпляры, развернутые Terraform, не беспокоитесь о поддержании HostFile.
Оригинал: «https://dev.to/iamtito/ansible-dynamic-inventory-31n4»