Работа с динамичным инвентарём
- Пример: Сценарий внешнего инвентаризации Cobbler
- Пример: Сценарий внешнего инвентаризации AWS EC2
- Пример: Сценарий внешнего инвентаризации OpenStack
- Другие сценарии инвентаризации
- Использование каталогов инвентаризации и нескольких источников инвентаризации
- Статические группы динамических групп
Часто пользователи системы управления конфигурацией хотят хранить инвентарь в другой программной системе. Ansible предоставляет простую текстовую систему, как описано в Работа с инвентарём, но что делать, если вы хотите использовать что-то другое?
Частые примеры включают извлечение инвентаризации из облачного провайдера, LDAP, Cobbler или дорогостоящего корпоративного ПО CMDB.
Ansible легко поддерживает все эти варианты с помощью внешней системы инвентаризации. Каталог contrib/inventory содержит некоторые из них — включая варианты для EC2/Eucalyptus, Rackspace Cloud и OpenStack, примеры которых будут подробно описаны ниже.
Ansible Tower также предоставляет базу данных для хранения результатов инвентаризации, которая доступна через веб-интерфейс и REST. Tower синхронизируется со всеми динамическими источниками инвентаризации Ansible, которые вы можете использовать, а также включает графический редактор инвентаризации. Наличие базы данных всех ваших хостов облегчает сопоставление истории событий и позволяет увидеть, какие из них имели сбои при последних запусках плейбуков.
Для получения информации о написании собственного динамического источника инвентаризации, см. Разработка динамических источников инвентаризации.
Пример: Сценарий внешнего инвентаризации Cobbler
Ожидается, что многие пользователи Ansible с достаточным количеством физического оборудования также являются пользователями Cobbler. (Примечание: Cobbler первоначально был написан Майклом ДеХааном и теперь возглавляется Джеймсом Каммаратой, который также работает в Ansible, Inc).
Хотя Cobbler в основном используется для запуска установок ОС и управления DHCP и DNS, он имеет общий слой, который позволяет ему представлять данные для нескольких систем управления конфигурацией (даже одновременно), и некоторые администраторы называют его «лёгкой CMDB».
Для привязки инвентаризации Ansible к Cobbler (необязательно), скопируйте этот сценарий в /etc/ansible и chmod +x файл. cobblerd теперь должен работать при использовании Ansible, и вам понадобится использовать параметр командной строки Ansible -i (например, -i /etc/ansible/cobbler.py). Этот конкретный сценарий будет взаимодействовать с Cobbler с помощью API XMLRPC Cobbler.
Также необходимо добавить файл cobbler.ini в /etc/ansible, чтобы Ansible знал, где находится сервер Cobbler, и можно было использовать некоторые улучшения кэша. Например:
[cobbler] # Set Cobbler's hostname or IP address host = http://127.0.0.1/cobbler_api # API calls to Cobbler can be slow. For this reason, we cache the results of an API # call. Set this to the path you want cache files to be written to. Two files # will be written to this directory: # - ansible-cobbler.cache # - ansible-cobbler.index cache_path = /tmp # The number of seconds a cache file is considered valid. After this many # seconds, a new API call will be made, and the cache file will be updated. cache_max_age = 900
Сначала протестируйте сценарий, запустив /etc/ansible/cobbler.py непосредственно. Вы должны увидеть вывод некоторых данных JSON, но в нём может пока ничего не быть.
Давайте рассмотрим, что это делает. В Cobbler предположим сценарий, похожий на следующий:
cobbler profile add --name=webserver --distro=CentOS6-x86_64 cobbler profile edit --name=webserver --mgmt-classes="webserver" --ksmeta="a=2 b=3" cobbler system edit --name=foo --dns-name="foo.example.com" --mgmt-classes="atlanta" --ksmeta="c=4" cobbler system edit --name=bar --dns-name="bar.example.com" --mgmt-classes="atlanta" --ksmeta="c=5"
В приведённом примере система «foo.example.com» будет напрямую доступна для ansible, а также будет доступна при использовании имён групп «webserver» или «atlanta». Так как Ansible использует SSH, мы попытаемся связаться с системой foo по адресу «foo.example.com», только никогда просто «foo». Аналогично, если вы попробуете «ansible foo», система не будет найдена… но «ansible ‘foo*’» найдёт, поскольку имя DNS системы начинается с «foo».
Сценарий предоставляет не только информацию о хостах и группах. Кроме того, в качестве бонуса, при выполнении модуля «setup» (что происходит автоматически при использовании плейбуков), переменные «a», «b» и «c» будут автоматически заполнены в шаблонах:
# file: /srv/motd.j2
Welcome, I am templated with a value of a={{ a }}, b={{ b }}, and c={{ c }}
Что можно выполнить так:
ansible webserver -m setup ansible webserver -m template -a "src=/tmp/motd.j2 dest=/etc/motd"
Примечание
Имя «webserver» взято из Cobbler, как и переменные для файла конфигурации. Вы по-прежнему можете передавать свои собственные переменные, как обычно, в Ansible, но переменные из внешнего сценария инвентаризации будут переопределять любые переменные с тем же именем.
Итак, с помощью приведённого выше шаблона (motd.j2) в результате данные будут записаны в /etc/motd для системы «foo»:
Welcome, I am templated with a value of a=2, b=3, and c=4
И на системе «bar» (bar.example.com):
Welcome, I am templated with a value of a=2, b=3, and c=5
И теоретически, хотя нет особой причины для этого, это также работает:
ansible webserver -m shell -a "echo {{ a }}"
Другими словами, вы также можете использовать эти переменные в аргументах/действиях.
Пример: Сценарий внешнего инвентаризации AWS EC2
Если вы используете Amazon Web Services EC2, хранение файла инвентаризации может быть не лучшим вариантом, так как хосты могут появляться и исчезать со временем, управляться внешними приложениями, или вы даже используете автоматическое масштабирование AWS. По этой причине вы можете использовать сценарий внешней инвентаризации EC2.
Вы можете использовать этот сценарий двумя способами. Самый простой — использовать параметр командной строки Ansible -i и указать путь к сценарию после его маркировки как исполняемого:
ansible -i ec2.py -u ubuntu us-east-1d -m ping
Второй вариант — скопировать сценарий в /etc/ansible/hosts и chmod +x его. Вам также нужно скопировать файл ec2.ini в /etc/ansible/ec2.ini. Тогда вы можете запустить ansible как обычно.
Для успешного выполнения API-запроса к AWS вам необходимо настроить Boto (Python-интерфейс к AWS). Доступны различные методы, но самый простой — просто экспортировать две переменные среды:
export AWS_ACCESS_KEY_ID='AK123' export AWS_SECRET_ACCESS_KEY='abc123'
Вы можете протестировать сценарий самостоятельно, чтобы убедиться, что ваша конфигурация правильная:
cd contrib/inventory ./ec2.py --list
Через несколько мгновений вы должны увидеть весь ваш инвентарь EC2 по всем регионам в формате JSON.
Если вы используете профили Boto для управления несколькими учётными записями AWS, вы можете передать --profile PROFILE имя сценарию ec2.py. Пример профиля:
[profile dev] aws_access_key_id = <dev access key> aws_secret_access_key = <dev secret key> [profile prod] aws_access_key_id = <prod access key> aws_secret_access_key = <prod secret key>
Затем вы можете запустить ec2.py --profile prod для получения инвентаризации для учётной записи prod, хотя этот вариант не поддерживается ansible-playbook. Вы также можете использовать переменную AWS_PROFILE — например: AWS_PROFILE=prod ansible-playbook -i ec2.py myplaybook.yml
Поскольку каждый регион требует своего API-запроса, если вы используете только небольшой набор регионов, вы можете отредактировать файл ec2.ini и закомментировать регионы, которые не используете.
В файле ec2.ini есть другие параметры конфигурации, включая управление кэшем и переменные назначения. По умолчанию файл ec2.ini настроен для всех облачных служб Amazon, но вы можете закомментировать любые функции, которые не применимы. Например, если у вас нет RDS или elasticache, вы можете установить их в False
[ec2] ... # To exclude RDS instances from the inventory, uncomment and set to False. rds = False # To exclude ElastiCache instances from the inventory, uncomment and set to False. elasticache = False ...
В основе своей файлы инвентаризации представляют собой просто сопоставление имени с адресом назначения. Настройки ec2.ini по умолчанию настроены для запуска Ansible извне EC2 (например, с вашего ноутбука) — и это не самый эффективный способ управления EC2.
Если вы запускаете Ansible внутри EC2, внутренние имена DNS и IP-адреса могут быть более осмысленными, чем публичные имена DNS. В этом случае вы можете изменить destination_variable в ec2.ini на частное имя DNS экземпляра. Это особенно важно при запуске Ansible внутри частной подсети в VPC, где единственный способ доступа к экземпляру — через его частный IP-адрес. Для экземпляров VPC vpc_destination_variable в ec2.ini предоставляет способ использовать переменную boto.ec2.instance, которая наиболее подходит для вашего случая.
Внешняя инвентаризация EC2 предоставляет сопоставления экземпляров из нескольких групп:
- Глобальная
- Все экземпляры находятся в группе
ec2. - ID экземпляра
- Это группы по одному, так как ID экземпляров уникальны. Например,
i-00112233i-a1b1c1d1 - Регион
- Группа всех экземпляров в регионе AWS. Например,
us-east-1us-west-2 - Зона доступности
- Группа всех экземпляров в зоне доступности. Например,
us-east-1aus-east-1b - Группа безопасности
- Экземпляры принадлежат одной или нескольким группам безопасности. Для каждой группы безопасности создаётся группа, все символы, кроме букв и цифр, преобразуются в нижнее подчеркивание (_). Каждая группа имеет префикс
security_group_. В настоящее время дефисы (-) также преобразуются в нижнее подчеркивание (_). Вы можете изменить это, используя параметр replace_dash_in_groups в ec2.ini (это менялось на протяжении нескольких версий, поэтому проверьте ec2.ini для подробностей). Например,security_group_defaultsecurity_group_webserverssecurity_group_Pete_s_Fancy_Group - Теги
- Каждый экземпляр может иметь различные пары «ключ-значение», называемые тегами. Наиболее распространённый ключ тега — «Имя», хотя возможны любые значения. Каждая пара «ключ-значение» является собственной группой экземпляров, в которой специальные символы преобразуются в нижнее подчеркивание, в формате
tag_KEY_VALUEНапример,tag_Name_Webможно использовать как естьtag_Name_redis-master-001становитсяtag_Name_redis_master_001tag_aws_cloudformation_logical-id_WebServerGroupстановитсяtag_aws_cloudformation_logical_id_WebServerGroup
Когда Ansible взаимодействует с определенным сервером, скрипт инвентаризации EC2 вызывается снова с параметром --host HOST. Этот скрипт ищет HOST в кэше индексов, чтобы получить идентификатор экземпляра, а затем выполняет вызов API к AWS, чтобы получить информацию об этом конкретном экземпляре. Затем информация об этом экземпляре становится доступной в виде переменных для ваших playbook'ов. Каждая переменная имеет префикс ec2_. Вот некоторые из доступных переменных:
- ec2_architecture
- ec2_description
- ec2_dns_name
- ec2_id
- ec2_image_id
- ec2_instance_type
- ec2_ip_address
- ec2_kernel
- ec2_key_name
- ec2_launch_time
- ec2_monitored
- ec2_ownerId
- ec2_placement
- ec2_platform
- ec2_previous_state
- ec2_private_dns_name
- ec2_private_ip_address
- ec2_public_dns_name
- ec2_ramdisk
- ec2_region
- ec2_root_device_name
- ec2_root_device_type
- ec2_security_group_ids
- ec2_security_group_names
- ec2_spot_instance_request_id
- ec2_state
- ec2_state_code
- ec2_state_reason
- ec2_status
- ec2_subnet_id
- ec2_tag_Name
- ec2_tenancy
- ec2_virtualization_type
- ec2_vpc_id
Как ec2_security_group_ids, так и ec2_security_group_names представляют собой списки, разделенные запятыми, всех групп безопасности. Каждый тег EC2 — это переменная в формате ec2_tag_KEY.
Чтобы увидеть полный список переменных, доступных для экземпляра, запустите скрипт самостоятельно:
cd contrib/inventory ./ec2.py --host ec2-12-12-12-12.compute-1.amazonaws.com
Обратите внимание, что скрипт инвентаризации AWS кэширует результаты, чтобы избежать повторных вызовов API, и эта настройка кэша настраивается в ec2.ini. Чтобы явно очистить кэш, можно запустить скрипт ec2.py с параметром --refresh-cache.
./ec2.py --refresh-cache
Пример: Скрипт внешней инвентаризации OpenStack
Если вы используете облако на базе OpenStack, вместо ручного управления собственным файлом инвентаризации, вы можете использовать динамическую инвентаризацию openstack.py для извлечения информации о ваших вычислительных экземплярах непосредственно из OpenStack.
Вы можете загрузить последнюю версию скрипта инвентаризации OpenStack здесь
Вы можете использовать скрипт инвентаризации явно (передав аргумент -i openstack.py в Ansible) или неявно (разместив скрипт по адресу /etc/ansible/hosts).
Явное использование скрипта инвентаризации
Загрузите последнюю версию скрипта динамической инвентаризации OpenStack и сделайте его исполняемым:
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/openstack.py chmod +x openstack.py
Загрузите файл OpenStack RC:
source openstack.rc
Примечание
Файл OpenStack RC содержит переменные среды, необходимые для клиентских инструментов для подключения к поставщику облачных услуг, такие как URL авторизации, имя пользователя, пароль и имя региона. Для получения дополнительной информации о загрузке, создании или загрузке файла OpenStack RC, пожалуйста, обратитесь к Настройка переменных среды с помощью файла OpenStack RC.
Вы можете подтвердить, что файл был успешно загружен, выполнив простую команду, такую как nova list, и убедившись, что она не возвращает ошибок.
Примечание
Для выполнения команды nova list необходимы клиентские инструменты командной строки OpenStack. Для получения дополнительной информации о том, как их установить, обратитесь к Установка клиентских инструментов командной строки OpenStack.
Вы можете протестировать скрипт динамической инвентаризации OpenStack вручную, чтобы убедиться, что он работает как ожидается:
./openstack.py --list
Через несколько мгновений вы увидите вывод в формате JSON с информацией о ваших вычислительных экземплярах.
После подтверждения корректной работы скрипта динамической инвентаризации вы можете указать Ansible использовать скрипт openstack.py в качестве файла инвентаризации, как показано ниже:
ansible -i openstack.py all -m ping
Неявное использование скрипта инвентаризации
Загрузите последнюю версию скрипта динамической инвентаризации OpenStack, сделайте его исполняемым и скопируйте его в /etc/ansible/hosts:
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/openstack.py chmod +x openstack.py sudo cp openstack.py /etc/ansible/hosts
Загрузите файл конфигурации образца, измените его в соответствии с вашими потребностями и скопируйте его в /etc/ansible/openstack.yml:
wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/openstack.yml vi openstack.yml sudo cp openstack.yml /etc/ansible/
Вы можете протестировать скрипт динамической инвентаризации OpenStack вручную, чтобы убедиться, что он работает как ожидается:
/etc/ansible/hosts --list
Через несколько мгновений вы увидите вывод в формате JSON с информацией о ваших вычислительных экземплярах.
Обновление кэша
Обратите внимание, что скрипт динамической инвентаризации OpenStack кэширует результаты, чтобы избежать повторных вызовов API. Чтобы явно очистить кэш, вы можете запустить скрипт openstack.py (или hosts) с параметром --refresh:
./openstack.py --refresh --list
Другие скрипты инвентаризации
В дополнение к Cobbler и EC2, скрипты инвентаризации также доступны для:
BSD Jails DigitalOcean Google Compute Engine Linode OpenShift OpenStack Nova Ovirt SpaceWalk Vagrant (not to be confused with the provisioner in vagrant, which is preferred) Zabbix
Разделы о том, как использовать их более подробно, будут добавлены со временем, но посмотрев в директорию «contrib/inventory» в репозитории Ansible, вы легко поймете, как их использовать. Процесс для скрипта инвентаризации AWS аналогичен.
Если вы разработали интересный скрипт инвентаризации, который может быть универсальным, отправьте запрос на добавление — мы, вероятно, с радостью включим его в проект.
Использование каталогов инвентаризации и нескольких источников инвентаризации
Если Ansible указанному пути -i — это каталог (или так настроено в ansible.cfg), Ansible может использовать несколько источников инвентаризации одновременно. При этом можно смешивать динамические и статически управляемые источники инвентаризации в одном запуске ansible. Гибридное облако — мгновенно!
В каталоге инвентаризации исполняемые файлы будут рассматриваться как динамические источники инвентаризации, а большинство других файлов — как статические. Файлы, которые заканчиваются любым из следующих расширений, будут игнорироваться:
~, .orig, .bak, .ini, .cfg, .retry, .pyc, .pyo
Вы можете заменить этот список своим собственным, настроив список inventory_ignore_extensions в ansible.cfg или установив переменную среды ANSIBLE_INVENTORY_IGNORE. Значение в обоих случаях должно быть списком шаблонов, разделенным запятыми, как показано выше.
Любые group_vars и host_vars подкаталоги в каталоге инвентаризации будут интерпретированы как ожидается, делая каталоги инвентаризации мощным способом организации различных наборов конфигураций.
Статические группы динамических групп
При определении групп групп в статическом файле инвентаризации дочерние группы также должны быть определены в статическом файле инвентаризации, в противном случае ansible вернет ошибку. Если вы хотите определить статическую группу динамических дочерних групп, определите динамические группы как пустые в статическом файле инвентаризации. Например:
[tag_Name_staging_foo] [tag_Name_staging_bar] [staging:children] tag_Name_staging_foo tag_Name_staging_bar
См. также
- Работа с инвентаризацией
- Все о статических файлах инвентаризации
- Список рассылки
- Вопросы? Помощь? Идеи? Зайдите на список на Google Groups
- irc.freenode.net
- #ansible IRC чат-канал
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.5/user_guide/intro_dynamic_inventory.html