Рубрики
Uncategorized

Несмысленный динамический инвентарь

Статический инвентарь не будет служить потребностям при отслеживании и развертывании к нескольким источникам с хостами … Помечено с помощью Anbible, DevOps.

Статический инвентарь не будет служить потребностям при отслеживании и развертывании к нескольким источникам с хостами, вращающимися вверх и отключение в ответ на бизнес-требования. Решением такой сменной инфраструктуры будет несеменным динамическим запасом. Для этого вам понадобится файл 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

В приведенном выше примере:

  1. Ansible-Playbook это стандартная команда для запуска Ansible PlayBook
  2. /etc/ansable/ec2.py Очки Anbible Inventory для использования EC2.PY для выноски AWS API для получения экземпляра EC2 метаданные
  3. --лимит "tag_app_ounje2" Это ограничивает хост, который вы хотите направить, наставляя Ansible-PlayBook, чтобы вытащить метаданные все случаи с тегом ключа Приложение и ценность ounje2. . Это позволяет использовать Ansible Playbook, чтобы узнать, где запустить задачи, знают, какой экземпляр вы хотите получить доступ и ограничить действия единственным OUNJE2
  4. образец .yml это название нашего файла PlayBook
  5. способ разбирать переменную env в PlayBook или переопределить переменную ENV по умолчанию
  6. Указывает, что пользовательские обязательные должны использовать для входа в экземпляр.

выход

$ 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»