Документирование вашего модуля
- Авторские права
- Блок ANSIBLE_METADATA
- Блок DOCUMENTATION
- Блок EXAMPLES
- Блок RETURN
- Импорты Python
- Параметры форматирования
- Фрагменты документации
- Тестирование документации
Онлайн-документация модуля генерируется из самих модулей. Поскольку документация модуля генерируется из строк документации, содержащихся в модулях, все модули, включенные в Ansible, должны содержать строку DOCUMENTATION. Эта строка должна быть допустимым документом YAML, который соответствует схеме, определенной ниже. Вам может быть проще начать написание строки DOCUMENTATION в редакторе с подсветкой синтаксиса YAML, прежде чем включить её в ваш файл Python.
Все модули должны иметь следующие разделы в указанном порядке:
- Авторские права
- ANSIBLE_METADATA
- DOCUMENTATION
- EXAMPLES
- RETURN
- Импорты 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: |
Это поле записывает, кто поддерживает модуль. Значение по умолчанию —
Дополнительную информацию о значении уровней поддержки см. в Поддержка модулей. | ||||||||||
| status: |
Это поле записывает информацию о модуле, которая важна для конечного пользователя. Это список строк. Значение по умолчанию — список из одного элемента [“preview”]. Следующие строки являются допустимыми статусами и имеют следующие значения:
| ||||||||||
Изменения с версии 1.0
| metadata_version: | |
|---|---|
|
Версия обновлена с 1.0 до 1.1 | |
| supported_by: |
Все существенные изменения были в потенциальных значениях поля supported_by
|
Блок 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 ... '''
Следующие поля могут быть использованы и являются обязательными, если не указано иное:
| модуль: |
Название модуля. Оно должно совпадать с именем файла без | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| краткое_описание: | |||||||||||||||||||
| |||||||||||||||||||
| описание: |
| ||||||||||||||||||
| дата_добавления_версии: |
Версия Ansible, когда модуль был добавлен. Это | ||||||||||||||||||
| автор: |
Имя автора модуля в формате | ||||||||||||||||||
| устаревший: |
Если этот модуль устарел, укажите, когда это произошло и что использовать вместо него, например, | ||||||||||||||||||
| опции: |
По одному аргументу на модуль:
| ||||||||||||||||||
| требования: |
Список требований и минимальных версий (применимо) | ||||||||||||||||||
| примечания: |
Подробная информация, которая не подходит ни в одну из вышеперечисленных секций; например, если | ||||||||||||||||||
Примечание
- Все вышеперечисленные поля написаны строчными буквами.
- Если у модуля нет опций (например, это
_factsмодуль), можно использоватьoptions: {}.
Блок ПРИМЕРЫ
Раздел ПРИМЕРЫ требуется для всех новых модулей.
Примеры должны демонстрировать реальное использование и быть написаны в формате YAML с несколькими строками.
Убедитесь, что примеры синхронизированы с опциями во время проверки PR и любых последующих рефакторингов кода.
В соответствии с лучшими практиками для playbook, должен быть указан name:.
EXAMPLES строка внутри модуля так:
EXAMPLES = '''
- name: Ensure foo is installed
modulename:
name: foo
state: present
'''
Если модуль возвращает факты, которые часто нужны, пример того, как их использовать, может быть полезен.
Блок ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
Раздел ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ документирует, что возвращает модуль, и он требуется для всех новых модулей.
Для каждого возвращаемого значения укажите description, в каких обстоятельствах возвращается это значение returned, type значения и sample. Например, из модуля copy:
Следующие поля могут быть использованы и являются обязательными, если не указано иное.
| имя_возвращаемого_значения: |
Имя возвращаемого поля.
|
|---|
Для сложных вложенных возвратов тип может быть указан как 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