Spec-Zone.ru › Ansible 2.4

Документирование вашего модуля

  • Авторские права
  • Блок ANSIBLE_METADATA
    • Версия 1.1 метаданных
      • Структура
      • Поля
    • Изменения с версии 1.0
  • Блок DOCUMENTATION
  • Блок EXAMPLES
  • Блок RETURN
  • Импорты Python
  • Параметры форматирования
  • Фрагменты документации
  • Тестирование документации

Онлайн-документация модуля генерируется из самих модулей. Поскольку документация модуля генерируется из строк документации, содержащихся в модулях, все модули, включенные в Ansible, должны содержать строку DOCUMENTATION. Эта строка должна быть допустимым документом YAML, который соответствует схеме, определенной ниже. Вам может быть проще начать написание строки DOCUMENTATION в редакторе с подсветкой синтаксиса YAML, прежде чем включить её в ваш файл Python.

Все модули должны иметь следующие разделы в указанном порядке:

  1. Авторские права
  2. ANSIBLE_METADATA
  3. DOCUMENTATION
  4. EXAMPLES
  5. RETURN
  6. Импорты Python

Примечание

Почему импорты не идут первыми?

Искушённые программисты Python могут заметить, что вопреки совету PEP 8 мы не размещаем imports вверху файла. Это потому, что разделы ANSIBLE_METADATA–RETURN не используются самим кодом модуля; они представляют собой дополнительные строки документации для файла. Импорты размещаются после этих специальных переменных по той же причине, по которой PEP 8 размещает импорты после вводных комментариев и строк документации. Это позволяет держать активные части кода вместе, а информационные части отдельно. Решение исключить E402 основано на удобочитаемости (на что направлен PEP 8). Строки документации в модуле гораздо больше похожи на строки документации уровня модуля, чем на код, и никогда не используются самим модулем. Размещение импортов ниже этой документации и ближе к коду объединяет и группирует весь связанный код согласованным образом для повышения удобочитаемости, отладки и понимания.

Предупреждение

Почему у некоторых модулей импорты находятся в конце файла?

Если вы посмотрите на некоторые существующие старые модули, вы можете найти импорты в конце файла. Не копируйте этот стиль в новые модули, так как это историческая особенность, связанная с тем, как раньше объединялись модули с библиотеками. Со временем мы переносим импорты в правильное место.

Авторские права

Начало каждого модуля должно быть примерно одинаковым. После shebang должно быть как минимум две строки, охватывающие авторские права и лицензию на код.

#!/usr/bin/python
# Copyright (c) 2017 Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

Каждый файл должен иметь строку авторских прав с исходным правообладателем. Значительные дополнения к модулю (например, переписывания) могут добавить дополнительные строки авторских прав. Код из сообщества Ansible обычно присваивается как «Copyright (c) 2017 Ansible Project», что охватывает всех авторов. Любые юридические вопросы необходимо просмотреть в истории контроля версий, поэтому исчерпывающий заголовок авторских прав не требуется.

Заявление о лицензии должно быть ТОЛЬКО одной строкой, а не полным префиксом GPL. Если вы заметите модуль с полным префиксом, вы можете заменить его на однострочное объявление.

При добавлении строки авторских прав после завершения значительной функции или переписывания добавьте новую строку выше старой, как показано ниже:

#!/usr/bin/python
# Copyright (c) 2017 [New Contributor(s)]
# Copyright (c) 2015 [Original Contributor(s)]
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

Блок ANSIBLE_METADATA

ANSIBLE_METADATA содержит информацию о модуле для использования другими инструментами. В настоящее время он информирует другие инструменты о типе основного разработчика модуля и о степени, в которой пользователи могут полагаться на неизменность поведения модуля с течением времени.

Для новых модулей следующий блок можно просто добавить в ваш модуль

ANSIBLE_METADATA = {'metadata_version': '1.1',
                    'status': ['preview'],
                    'supported_by': 'community'}

Предупреждение

  • metadata_version — это версия схемы ANSIBLE_METADATA, а не версия модуля.
  • Изменение статуса status или supported_by модуля должно производиться только членами ядра Ansible.

Примечание

Превышенная версия метаданных

Во время разработки Ansible-2.3 модули имели начальную версию метаданных. Эта версия была незначительно изменена после выпуска для устранения некоторых неточностей. Иногда вы можете увидеть запросы на включение изменений для модулей, в которых блок ANSIBLE_METADATA не совсем правильный из-за этого. Метаданные модуля должны быть исправлены перед внесением их в репозиторий.

Версия 1.1 метаданных

Структура

ANSIBLE_METADATA = {
    'metadata_version': '1.1',
    'supported_by': 'community',
    'status': ['preview', 'deprecated']
}

Поля

metadata_version:

Строка в формате «X.Y». X и Y — целые числа, которые определяют версию формата метаданных. Модули, поставляемые с Ansible, привязаны к выпуску Ansible, поэтому мы будем поставлять только одну версию метаданных. Мы будем увеличивать Y, если мы добавим поля или допустимые значения в существующее поле. Мы будем увеличивать X, если удалим поля или значения, или изменим тип или значение поля. Текущая версия metadata_version — «1.1»

supported_by:

Это поле записывает, кто поддерживает модуль. Значение по умолчанию — community. Допустимые значения:

  • core
  • network
  • certified
  • community
  • curated (Устаревшее. Модули в этой категории, вероятно, должны быть core или certified вместо этого)

Дополнительную информацию о значении уровней поддержки см. в Поддержка модулей.

status:

Это поле записывает информацию о модуле, которая важна для конечного пользователя. Это список строк. Значение по умолчанию — список из одного элемента [“preview”]. Следующие строки являются допустимыми статусами и имеют следующие значения:

stableinterface:
Это означает, что параметры модуля стабильны. Будут предприняты все усилия, чтобы не удалять параметры и не изменять их значение. Это не оценка качества кода модуля.
preview: Этот модуль — предварительный просмотр. Это означает, что он может быть нестабильным, параметры могут измениться или он может потребовать библиотек или веб-служб, которые сами могут быть подвержены несовместимым изменениям.
deprecated: Этот модуль устарел и больше не будет доступен в будущих выпусках.
removed: Этот модуль отсутствует в выпуске. Сохраняется заглушка, чтобы можно было сгенерировать документацию. Документация помогает пользователям перейти от удаленного модуля к новым модулям.

Изменения с версии 1.0

metadata_version:

Версия обновлена с 1.0 до 1.1

supported_by:

Все существенные изменения были в потенциальных значениях поля supported_by

  • Добавлено значение certified
  • Устарел значение curated, модули, поставляемые с Ansible, будут использовать вместо него certified. Третьим лицам рекомендуется не использовать это значение, так как оно не имеет смысла в самом Ansible.
  • Добавлено значение network

Блок DOCUMENTATION

Пример строки документации см. в репозитории по адресу examples/DOCUMENTATION.yml.

Включите его в свой файл модуля так:

#!/usr/bin/python
# Copyright (c) 2017 [REPLACE THIS]
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

DOCUMENTATION = '''
---
module: modulename
short_description: This is a sentence describing the module
# ... snip ...
'''

Следующие поля могут быть использованы и являются обязательными, если не указано иное:

модуль:

Название модуля. Оно должно совпадать с именем файла без .py расширения.

краткое_описание:
  • Краткое описание, отображаемое на странице всех модулей и ansible-doc -l.
  • Поскольку краткое описание отображается ansible-doc -l без группировки по категориям, оно должно быть достаточно подробным, чтобы объяснить его назначение без контекста директории, в которой оно находится.
  • В отличие от description: это поле не должно заканчиваться точкой.
описание:
  • Подробное описание (обычно из двух и более предложений).
  • Должно быть написано полными предложениями, т. е. с заглавными буквами и точками.
  • Не должно упоминать имя модуля.
дата_добавления_версии:

Версия Ansible, когда модуль был добавлен. Это string, а не число с плавающей запятой, т. е. version_added: "2.1"

автор:

Имя автора модуля в формате First Last (@GitHubID). Используйте список на несколько строк, если авторов больше одного.

устаревший:

Если этот модуль устарел, укажите, когда это произошло и что использовать вместо него, например, Deprecated in 2.3. Use M(whatmoduletouseinstead) instead. Убедитесь, что CHANGELOG.md обновлено для отражения этого.

опции:

По одному аргументу на модуль:

имя_опции:
  • Декларативная операция (не CRUD) – это делает удобным для пользователя не беспокоиться о текущем состоянии, а только о конечном состоянии, например, online:, а не is_online:.
  • Имя опции должно соответствовать остальной части модуля, а также другим модулям в той же категории.
описание:
  • Подробное объяснение того, что делает эта опция. Оно должно быть написано полными предложениями.
  • Не следует перечислять значения опций (для этого предназначено поле choices:, хотя оно должно объяснять what, какие значения они имеют, если это не очевидно).
  • Если необязательный параметр иногда требуется, это нужно отразить в документации, например, «Требуется, когда I(state=present).»
  • Взаимоисключающие опции должны быть задокументированы как последнее предложение для каждой опции.
обязательный:

Требуется только если значение истинно, в противном случае предполагается ложь.

значение_по_умолчанию:
  • Если required ложно/отсутствует, default может быть указано (предполагается «null», если отсутствует).
  • Убедитесь, что параметр по умолчанию в документации соответствует параметру по умолчанию в коде.
  • Значение по умолчанию не должно быть указано в описании.
  • Если опция имеет булево значение, можно использовать любое из булевых значений, распознаваемых Ansible: (например, true/false или yes/no). Выберите то, которое лучше читается в контексте опции.
значения:

Список значений опции. Должен отсутствовать, если пустой.

тип:

Если аргумент type='bool', это поле должно быть установлено в type: bool, и choices не должно быть указано.

псевдонимы:

Список псевдонимов имени опции; обычно не нужен.

дата_добавления_версии:

Требуется только если эта опция была расширена после первоначального выпуска Ansible, т. е. она больше, чем поле version_added верхнего уровня. Это строка, а не число с плавающей запятой, т. е. version_added: "2.3".

подопции:

Если эта опция принимает словарь, вы можете определить его здесь. См. azure_rm_securitygroup, os_ironic_node для примеров.

требования:

Список требований и минимальных версий (применимо)

примечания:

Подробная информация, которая не подходит ни в одну из вышеперечисленных секций; например, если check_mode не поддерживается, или ссылка на внешнюю документацию.

Примечание

  • Все вышеперечисленные поля написаны строчными буквами.
  • Если у модуля нет опций (например, это _facts модуль), можно использовать options: {}.

Блок ПРИМЕРЫ

Раздел ПРИМЕРЫ требуется для всех новых модулей.

Примеры должны демонстрировать реальное использование и быть написаны в формате YAML с несколькими строками.

Убедитесь, что примеры синхронизированы с опциями во время проверки PR и любых последующих рефакторингов кода.

В соответствии с лучшими практиками для playbook, должен быть указан name:.

EXAMPLES строка внутри модуля так:

EXAMPLES = '''
- name: Ensure foo is installed
  modulename:
    name: foo
    state: present
'''

Если модуль возвращает факты, которые часто нужны, пример того, как их использовать, может быть полезен.

Блок ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

Раздел ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ документирует, что возвращает модуль, и он требуется для всех новых модулей.

Для каждого возвращаемого значения укажите description, в каких обстоятельствах возвращается это значение returned, type значения и sample. Например, из модуля copy:

Следующие поля могут быть использованы и являются обязательными, если не указано иное.

имя_возвращаемого_значения:

Имя возвращаемого поля.

описание:

Подробное описание того, что представляет это значение.

возвращается:

Когда возвращается это значение, например, always, при success, always

тип:

Тип данных

пример:

Один или несколько примеров.

дата_добавления_версии:

Требуется только если это возвращаемое значение было расширено после первоначального выпуска Ansible, т. е. оно больше, чем поле version_added верхнего уровня. Это строка, а не число с плавающей запятой, т. е. version_added: "2.3".

содержит:

Необязательно, если вы установили type: complex, вы можете детализировать словарь здесь, повторив вышеперечисленные элементы.

имя_возвращаемого_значения:

Одно на возврат

описание: Подробное описание того, что представляет это значение.
возвращается: Когда возвращается это значение, например, always, при success, always
тип: Тип данных
пример: Один или несколько примеров.
дата_добавления_версии: Требуется только если это возвращаемое значение было расширено после первоначального выпуска Ansible, т. е. оно больше, чем поле version_added верхнего уровня. Это строка, а не число с плавающей запятой, т. е. version_added: "2.3".

Для сложных вложенных возвратов тип может быть указан как type: complex.

Пример:

RETURN = '''
dest:
    description: destination file/path
    returned: success
    type: string
    sample: /path/to/file.txt
src:
    description: source file used for the copy on the target machine
    returned: changed
    type: string
    sample: /home/httpd/.ansible/tmp/ansible-tmp-1423796390.97-147729857856000/source
md5sum:
    description: md5 checksum of the file after running copy
    returned: when supported
    type: string
    sample: 2a5aeecc61dc98c4d780b14b330e3282
...

Примечание

Если ваш модуль ничего не возвращает (кроме стандартных значений), можно использовать RETURN = ''' # '''.

Импорты Python

Начиная с версии Ansible 2.2, все новые модули должны использовать импорты в виде:

from module_utils.basic import AnsibleModule

Предупреждение

Использование «подстановочных» импортов, таких как from module_utils.basic import *, больше не допускается.

Параметры форматирования

Эти функции форматирования предназначены для U() для URL-адресов, I() для имён опций, C() для файлов и значений опций и M() для имён модулей. Имена модулей должны быть указаны как M(module) для создания ссылки на онлайн-документацию по этому модулю.

Пример использования:

Or if not set the environment variable C(ACME_PASSWORD) will be used.
...
Required if I(state=present)
...
Mutually exclusive with I(project_src) and I(files).
...
See also M(win_copy) or M(win_template).
...
See U(https://www.ansible.com/tower) for an overview.

Примечание

Если вы хотите обратиться к набору модулей, используйте C(..), например Refer to the C(win_*) modules.

Фрагменты документации

Некоторые категории модулей имеют общую документацию, например, подробности об параметрах аутентификации или параметрах режима файла. Вместо дублирования этой информации, её можно использовать в docs_fragments.

Эти общие фрагменты похожи на стандартный блок документации, используемый в модуле, но содержатся в ModuleDocFragment классе.

Все существующие docs_fragments находятся в lib/ansible/utils/module_docs_fragments/.

Для включения просто добавьте extends_documentation_fragment: FRAGMENT_NAME в ваш модуль.

Примеры можно найти, выполнив поиск по extends_documentation_fragment в дереве исходного кода Ansible.

Тестирование документации

Поместите ваш завершённый модульный файл в директорию lib/ansible/modules/$CATEGORY/ и затем выполните команду: make webdocs. Новый файл ‘modules.html’ будет создан в директории docs/docsite/_build/html/$MODULENAME_module.html.

Для ускорения процесса сборки, вы можете ограничить создание документации только указанными модулями или вообще без модулей. Для этого выполните команду: MODULES=$MODULENAME make webdocs. Переменная среды MODULES принимает список имён модулей, разделённых запятыми. Чтобы пропустить создание документации для всех модулей, укажите несуществующее имя модуля, например: MODULES=none make webdocs.

Вы также можете создать отдельную страницу всего сайта документации. Из ansible/docs/docsite выполните make htmlsingle rst=[relative path to the .rst file], например: make htmlsingle rst=dev_guide/developing_modules_documenting.rst

Для тестирования вашей документации относительно вашего argument_spec вы можете использовать validate-modules. Обратите внимание, что этот вариант в настоящее время не включён в Shippable из-за времени, необходимого для его выполнения.

# If you don't already, ensure you are using your local checkout
source hacking/env-setup
./test/sanity/validate-modules/validate-modules --arg-spec --warnings  lib/ansible/modules/your/modules/

Подсказка

Если у вас возникли проблемы с синтаксисом вашего YAML, вы можете проверить его на сайте YAML Lint.

Для получения дополнительной информации о тестировании, включая добавление модульных и интеграционных тестов, см. Тестирование Ansible.

© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.4/dev_guide/developing_modules_documenting.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API