Python API
This API is intended for internal Ansible use. Ansible may make changes to this API at any time that could break backward compatibility with older versions of the API. Because of this, external use is not supported by Ansible. If you want to use Python API only for executing playbooks or modules, consider ansible-runner first.
There are several ways to use Ansible from an API perspective. You can use the Ansible Python API to control nodes, you can extend Ansible to respond to various Python events, you can write plugins, and you can plug in inventory data from external data sources. This document gives a basic overview and examples of the Ansible execution and playbook API.
If you would like to use Ansible programmatically from a language other than Python, trigger events asynchronously, or have access control and logging demands, please see the AWX project.
Because Ansible relies on forking processes, this API is not thread safe.
Python API example
This example is a simple demonstration that shows how to minimally run a couple of tasks:
#!/usr/bin/env python from __future__ import (absolute_import, division, print_function) __metaclass__ = type import json import shutil import ansible.constants as C from ansible.executor.task_queue_manager import TaskQueueManager from ansible.module_utils.common.collections import ImmutableDict from ansible.inventory.manager import InventoryManager from ansible.parsing.dataloader import DataLoader from ansible.playbook.play import Play from ansible.plugins.callback import CallbackBase from ansible.vars.manager import VariableManager from ansible import context # Create a callback plugin so we can capture the output class ResultsCollectorJSONCallback(CallbackBase): """A sample callback plugin used for performing an action as results come in. If you want to collect all results into a single object for processing at the end of the execution, look into utilizing the ``json`` callback plugin or writing your own custom callback plugin. """ def __init__(self, *args, **kwargs): super(ResultsCollectorJSONCallback, self).__init__(*args, **kwargs) self.host_ok = <> self.host_unreachable = <> self.host_failed = <> def v2_runner_on_unreachable(self, result): host = result._host self.host_unreachable[host.get_name()] = result def v2_runner_on_ok(self, result, *args, **kwargs): """Print a json representation of the result. Also, store the result in an instance attribute for retrieval later """ host = result._host self.host_ok[host.get_name()] = result print(json.dumps(host.name: result._result>, indent=4)) def v2_runner_on_failed(self, result, *args, **kwargs): host = result._host self.host_failed[host.get_name()] = result def main(): host_list = ['localhost', 'www.example.com', 'www.google.com'] # since the API is constructed for CLI it expects certain options to always be set in the context object context.CLIARGS = ImmutableDict(connection='smart', module_path=['/to/mymodules', '/usr/share/ansible'], forks=10, become=None, become_method=None, become_user=None, check=False, diff=False, verbosity=0) # required for # https://github.com/ansible/ansible/blob/devel/lib/ansible/inventory/manager.py#L204 sources = ','.join(host_list) if len(host_list) == 1: sources += ',' # initialize needed objects loader = DataLoader() # Takes care of finding and reading yaml, json and ini files passwords = dict(vault_pass='secret') # Instantiate our ResultsCollectorJSONCallback for handling results as they come in. Ansible expects this to be one of its main display outlets results_callback = ResultsCollectorJSONCallback() # create inventory, use path to host config file as source or hosts in a comma separated string inventory = InventoryManager(loader=loader, sources=sources) # variable manager takes care of merging all the different sources to give you a unified view of variables available in each context variable_manager = VariableManager(loader=loader, inventory=inventory) # instantiate task queue manager, which takes care of forking and setting up all objects to iterate over host list and tasks # IMPORTANT: This also adds library dirs paths to the module loader # IMPORTANT: and so it must be initialized before calling `Play.load()`. tqm = TaskQueueManager( inventory=inventory, variable_manager=variable_manager, loader=loader, passwords=passwords, stdout_callback=results_callback, # Use our custom callback instead of the ``default`` callback plugin, which prints to stdout ) # create data structure that represents our play, including tasks, this is basically what our YAML loader does internally. play_source = dict( name="Ansible Play", hosts=host_list, gather_facts='no', tasks=[ dict(action=dict(module='shell', args='ls'), register='shell_out'), dict(action=dict(module='debug', args=dict(msg='>'))), dict(action=dict(module='command', args=dict(cmd='/usr/bin/uptime'))), ] ) # Create play object, playbook objects use .load instead of init or new methods, # this will also automatically create the task objects from the info provided in play_source play = Play().load(play_source, variable_manager=variable_manager, loader=loader) # Actually run it try: result = tqm.run(play) # most interesting data for a play is actually sent to the callback's methods finally: # we always need to cleanup child procs and the structures we use to communicate with them tqm.cleanup() if loader: loader.cleanup_all_tmp_files() # Remove ansible tmpdir shutil.rmtree(C.DEFAULT_LOCAL_TMP, True) print("UP ***********") for host, result in results_callback.host_ok.items(): print(' >>> '.format(host, result._result['stdout'])) print("FAILED *******") for host, result in results_callback.host_failed.items(): print(' >>> '.format(host, result._result['msg'])) print("DOWN *********") for host, result in results_callback.host_unreachable.items(): print(' >>> '.format(host, result._result['msg'])) if __name__ == '__main__': main()
Ansible emits warnings and errors through the display object, which prints directly to stdout, stderr and the Ansible log.
The source code for the ansible command line tools ( lib/ansible/cli/ ) is available on GitHub.
Ansible в Python – что такое и как использовать?
В данном руководстве мы познакомимся с Ansible, а также разберем его преимущества и то, как мы можем использовать Ansible в Python.
Введение в Ansible
Ansible – это платформа с открытым исходным кодом или инструмент автоматизации, используемый для выполнения ИТ-задач, таких как развертывание приложений, управление конфигурациями, оркестровка внутри службы и подготовка.
С течением времени автоматизация становится ключевым моментом в очень сложной среде информационных технологий, которая часто требует слишком быстрого масштабирования для разработчиков и системных администраторов, чтобы они могли работать вместе, если бы им приходилось выполнять каждую функцию вручную.
Автоматизация помогает упростить сложные задачи и делает работу разработчиков более управляемой, а также позволяет разработчикам сосредоточить внимание на других действиях, которые представляют значимость для организации.
Другими словами, автоматизация повышает эффективность за счет высвобождения времени. Ansible же, как указывалось выше, является одним из быстрорастущих инструментов в эпоху автоматизации.
Что такое Ansible в Python?
- Ansible в Python – это инфраструктура на основе push-уведомлений как код(IaC) , которая предоставляет удобный для пользователя предметно-ориентированный язык, поэтому мы можем определять архитектуру в соответствии с желанием декларативным способом.
- Термин push-based означает, что Ansible использует SSH для связи между машиной, на которой выполняется Ansible, и машинами, на которых применяются конфигурации.
- Машины, работающие с Ansible, которые нам нравится настраивать, известны как управляемые узлы или хосты Ansible. С точки зрения Ansible список хостов известен как инвентарь.
- Машина, читающая файлы определений и выполняющая Ansible для передачи конфигурации на хост, называется управляющим узлом.
- Ansible написана на языке программирования Python и требует минимального обучения. Процедура настройки Ansible довольно проста и не требует дополнительных приложений, серверов или клиентских демонов.
- Ansible основана на принципе охвата взаимосвязи и архитектуры системы. Как и другие инструменты, используемые для управления конфигурацией (например, Puppet, Chef или Salt), она работает с двумя типами серверов: управляющими машинами и узлами.
- Ansible использует небольшие программы, известные как модули Ansible, для управления узлами. Эти модули представляют собой модели ресурсов выбранного состояния системы, выполняемые через SSH. Для этого нам не нужны никакие агенты и дополнительная настраиваемая инфраструктура безопасности.
- Библиотека модулей может существовать на любом оборудовании. Модули выполняют задачи по протоколу JSON поверх стандартного вывода и пишут удобный код на любом языке программирования, включая Python.
- Система использует YAML в формате плейбуков Ansible для описания работы по автоматизации. Таким образом, она удобна как для машины, так и для человека. А когда узлы не управляются Ansible, то не потребляет ресурсы, поскольку ни программы, ни демоны не работают в фоновом режиме.
Преимущества
Являясь мощным механизмом автоматизации, Ansible помогает разработчикам более эффективно развертывать программное обеспечение. Мы можем избегать агентов, настраиваемого кода или настраиваемых сценариев и в основном сосредоточиться на безопасности, легкой слышимости, просмотре и переписывании содержимого.
У Ansible есть множество преимуществ перед аналогичными платформами, используемыми для автоматизации программного обеспечения. Некоторые из этих преимуществ описаны ниже:
- Простота: Ansible обеспечивает простоту, поскольку разработчикам не требуется писать сценарии или специальный код для развертывания приложений и их обновления. Это позволяет автоматизировать язык, приближающийся к простому английскому. Разработчикам, системным администраторам и ИТ-менеджерам легко читать, управлять и ускорять свои проекты и программы.
- Полнота: Ansible также обеспечивает полноту, поскольку поставляется в сочетании с различными сложными инструментами для управления конфигурацией, развертывания приложений, оркестровки рабочего процесса и даже предоставления облачных ресурсов в единой системе. Модули помогают автоматизировать практически все прямо из коробки, и никаких дополнительных приложений не требуется.
- Безопасность: Ansible использует SSH, поэтому не развертывает уязвимые агенты на узлах и не требует демонов на корневом уровне или дополнительных портов. Ansibles предлагает среду без агентов, которая помогает повысить безопасность и может использоваться без полномочий root. Ansible имеет встроенную аутентификацию для операционной системы, поддержку LDAP, SSSD и Kerberos.
Понимание Python API для целей Ansible
Мы можем вызывать код Ansible с помощью Python, используя интерфейс прикладного программирования (API) Ansible. Ansible выпустила версию 2.0 своего API, которая обеспечивает лучшую интеграцию с различными языками программирования.
Очень важно отметить, что Ansible расширил свои возможности, чтобы поддерживать разработку с помощью Python; однако на его веб-сайте также упоминается, что он также может прекратить поддержку инфраструктуры API по своему усмотрению (создавая или даже исправляя ошибку в текущей версии API).
Разработчикам доступны различные методы использования Ansible с точки зрения интерфейса прикладного программирования (API). Мы можем использовать Ansible API для языка программирования Python, который позволяет нам управлять узлами. Мы можем расширить Ansible, чтобы реагировать на различные события в Python, писать плагины и данные инвентаризации плагинов из внешних источников данных.
Примечание. Этот API предназначен для внутреннего использования Ansible. Ansible может в любой момент внести изменения в этот API, которые могут нарушить обратную совместимость со старыми версиями API. По этой причине Ansible не поддерживает Python API для внешнего использования. Если мы хотим использовать Python API только для выполнения модулей или плейбуков, в первую очередь мы рассмотрим ansible-runner.