Использование роли и плейбука ansible на примере установки и настройки nginx

Встраиваемые модули и плагины в ролях

Если вы пишете собственный модуль (см. ) Или подключаемый модуль (см. подключаемых модулей ), вы можете захотеть распространить его как часть роли. Например, если вы пишете модуль, который помогает настроить внутреннее программное обеспечение вашей компании, и хотите, чтобы другие люди в вашей организации использовали этот модуль, но вы не хотите рассказывать всем, как настроить путь к их библиотеке Ansible, вы можете включить модуль в вашей роли internal_config.

Чтобы добавить модуль или подключаемый модуль к роли: Наряду со структурой «задачи» и «обработчики» роли добавьте каталог с именем «библиотека», а затем включите модуль непосредственно в каталог «библиотека».

Если предположить,что у тебя это было:

roles/
    my_custom_modules/
        library/
            module1
            module2

Модуль будет использоваться в самой роли, а также в любых ролях, которые вызываются после этой роли, следующим образом:

---
- hosts: webservers
  roles:
    - my_custom_modules
    - some_other_role_using_my_custom_modules
    - yet_another_role_using_my_custom_modules

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

Используйте этот подход с осторожностью, так как сигнатуры API могут измениться в основных компонентах, и это обходное решение не гарантируется

Этот же механизм может быть использован для встраивания и распределения плагинов в роли,используя ту же самую схему.Например,для плагина-фильтра:

roles/
    my_custom_filter/
        filter_plugins
            filter1
            filter2

Эти фильтры затем можно использовать в шаблоне Jinja в любой роли, названной после my_custom_filter.

Embedding modules and plugins in roles

If you write a custom module (see ) or a plugin (see ), you might wish to distribute it as part of a role. For example, if you write a module that helps configure your company’s internal software, and you want other people in your organization to use this module, but you do not want to tell everyone how to configure their Ansible library path, you can include the module in your internal_config role.

To add a module or a plugin to a role:
Alongside the ‘tasks’ and ‘handlers’ structure of a role, add a directory named ‘library’ and then include the module directly inside the ‘library’ directory.

Assuming you had this:

roles/
    my_custom_modules/
        library/
            module1
            module2

The module will be usable in the role itself, as well as any roles that are called after this role, as follows:

---
- hosts webservers
  roles
    - my_custom_modules
    - some_other_role_using_my_custom_modules
    - yet_another_role_using_my_custom_modules

If necessary, you can also embed a module in a role to modify a module in Ansible’s core distribution. For example, you can use the development version of a particular module before it is released in production releases by copying the module and embedding the copy in a role. Use this approach with caution, as API signatures may change in core components, and this workaround is not guaranteed to work.

The same mechanism can be used to embed and distribute plugins in a role, using the same schema. For example, for a filter plugin:

roles/
    my_custom_filter/
        filter_plugins
            filter1
            filter2

Пользовательский файл инвентаря

Файл инвентаря по умолчанию обычно находится в /etc/ansible/hosts, но вы можете использовать опцию -i для указания пользовательских файлов при запуске команд и плейбуков Ansible. Это удобный способ настройки индивидуального инвентаря для каждого проекта, который можно включить в системы контроля версий, такие как Git:

Такая опция действительна и для ansible-playbook:

Динамический файл инвентаря

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

Вы можете найти ряд скриптов с открытым исходным кодом в официальном репозитории Ansible GitHub. После загрузки требуемого сценария на Ansible control machine и настройки необходимых параметров (например, учетных данных API) вы можете запустить исполняемый файл в качестве пользовательского инвентаря с любой командой Ansible, которая поддерживает эту опцию.

Следующая команда использует скрипт инвентаря my_inventory.py с командой ping для проверки подключения ко всем текущим активным серверам:

За более подробной информацией о том, как использовать динамические файлы инвентаризации, пожалуйста, обратитесь к официальной документации Ansible.

Embedding Modules and Plugins In Roles¶

This is an advanced topic that should not be relevant for most users.

If you write a custom module (see Developing Modules) or a plugin (see Developing Plugins), you may wish to distribute it as part of a role.
Generally speaking, Ansible as a project is very interested in taking high-quality modules into ansible core for inclusion, so this shouldn’t be the norm, but it’s quite easy to do.

A good example for this is if you worked at a company called AcmeWidgets, and wrote an internal module that helped configure your internal software, and you wanted other
people in your organization to easily use this module – but you didn’t want to tell everyone how to configure their Ansible library path.

Alongside the ‘tasks’ and ‘handlers’ structure of a role, add a directory named ‘library’. In this ‘library’ directory, then include the module directly inside of it.

Assuming you had this:

roles/
   my_custom_modules/
       library/
          module1
          module2

The module will be usable in the role itself, as well as any roles that are called after this role, as follows:

- hosts webservers
  roles
    - my_custom_modules
    - some_other_role_using_my_custom_modules
    - yet_another_role_using_my_custom_modules

This can also be used, with some limitations, to modify modules in Ansible’s core distribution, such as to use development versions of modules before they are released in production releases. This is not always advisable as API signatures may change in core components, however, and is not always guaranteed to work. It can be a handy way of carrying a patch against a core module, however, should you have good reason for this. Naturally the project prefers that contributions be directed back to github whenever possible via a pull request.

The same mechanism can be used to embed and distribute plugins in a role, using the same schema. For example, for a filter plugin:

roles/
   my_custom_filter/
       filter_plugins
          filter1
          filter2

Role Metadata¶

When Galaxy imports a role, the import process looks for metadata found in the role’s file. The following shows
the default metadata file created by the command:

galaxy_info
  role_name foo
  author your name
  description your description
  company your company (optional)

  # If the issue tracker for your role is not on github, uncomment the
  # next line and provide a value
  # issue_tracker_url: http://example.com/issue/tracker

  # Some suggested licenses:
  # - BSD (default)
  # - MIT
  # - GPLv2
  # - GPLv3
  # - Apache
  # - CC-BY
  license license (GPLv2, CC-BY, etc)

  min_ansible_version 1.2

  # If this a Container Enabled role, provide the minimum Ansible Container version.
  # min_ansible_container_version:

  # Optionally specify the branch Galaxy will use when accessing the GitHub
  # repo for this role. During role install, if no tags are available,
  # Galaxy will use this branch. During import Galaxy will access files on
  # this branch. If Travis integration is configured, only notifications for this
  # branch will be accepted. Otherwise, in all cases, the repo's default branch
  # (usually master) will be used.
  #github_branch:

  #
  # platforms is a list of platforms, and each platform has a name and a list of versions.
  #
  # platforms:
  # - name: Fedora
  #   versions:
  #   - all
  #   - 25
  # - name: SomePlatform
  #   versions:
  #   - all
  #   - 1.0
  #   - 7
  #   - 99.99

  galaxy_tags []
    # List tags for your role here, one per line. A tag is a keyword that describes
    # and categorizes the role. Users find roles by searching for tags. Be sure to
    # remove the '[]' above, if you add tags to this list.
    #
    # NOTE: A tag is limited to a single word comprised of alphanumeric characters.
    #       Maximum 20 tags per role.

dependencies []
  # List your role dependencies here, one per line. Be sure to remove the '[]' above,
  # if you add dependencies to this list.

The following provides guidance on setting some of the metadata values that may not be so obvious:

Запуск роли несколько раз в одной пьесе.

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

---
- hosts: webservers
  roles:
    - foo
    - bar
    - foo

У вас есть два варианта,чтобы заставить Ansible выполнять роль не один раз.

Передача различных параметров

Если вы передаете разные параметры в каждом определении роли, Ansible запускает роль более одного раза. Предоставление разных значений переменных — это не то же самое, что передача разных параметров роли. Для этого поведения необходимо использовать ключевое слово , поскольку и не принимают параметры роли.

Этот сценарий дважды запускает роль :

---
- hosts: webservers
  roles:
    - { role: foo, message: "first" }
    - { role: foo, message: "second" }

Этот синтаксис также дважды запускает роль ;

---
- hosts: webservers
  roles:
    - role: foo
      message: "first"
    - role: foo
      message: "second"

В этих примерах Ansible запускает дважды, потому что каждое определение роли имеет разные параметры.

Использование

Добавьте в файл для роли:

---
- hosts: webservers
  roles:
    - foo
    - foo


---
allow_duplicates: true

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

Упрощение имен модулей с помощью ключевого слова collections

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

Warning

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

Использование в ролях

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

# myrole/meta/main.yml
collections:
  - my_namespace.first_collection
  - my_namespace.second_collection
  - other_namespace.other_collection

Использование в playbooks

В playbook вы можете управлять коллекциями, в которых Ansible ищет модули и плагины действий для выполнения. Однако любые роли, которые вы вызываете в своей книге, определяют свой собственный порядок поиска в коллекциях; они не наследуют настройки вызывающей книги. Это верно, даже если роль не определяет собственное ключевое слово .

- hosts: all
  collections:
    - my_namespace.my_collection

  tasks:
    - import_role:
        name: role1

    - mymodule:
        option1: value

    - debug:
        msg: '{{ lookup("my_namespace.my_collection.lookup1", "param1")| my_namespace.my_collection.filter1 }}'

В ключевых слов просто создает упорядоченный «путь поиска» для не-пространство имен плагинов и роль ссылок. Он не устанавливает контент или иным образом не изменяет поведение Ansible при загрузке плагинов или ролей

Обратите внимание, что FQCN по-прежнему требуется для плагинов, не связанных с действием или модулей (например, для поиска, фильтров, тестов)

Role Duplication and Execution¶

Ansible will only allow a role to execute once, even if defined multiple times, if the parameters defined on the role are not different for each definition. For example:

---
- hosts webservers
  roles
  - foo
  - foo

Given the above, the role will only be run once.

To make roles run more than once, there are two options:

  1. Pass different parameters in each role definition.
  2. Add to the file for the role.

Example 1 — passing different parameters:

---
- hosts webservers
  roles
  - { role foo, message "first" }
  - { role foo, message "second" }

In this example, because each role definition has different parameters, will run twice.

Example 2 — using :

# playbook.yml
---
- hosts webservers
  roles
  - foo
  - foo

# roles/foo/meta/main.yml
---
allow_duplicates true

Using Roles¶

The classic (original) way to use roles is via the option for a given play:

---
- hosts webservers
  roles
     - common
     - webservers

This designates the following behaviors, for each role ‘x’:

  • If roles/x/tasks/main.yml exists, tasks listed therein will be added to the play.
  • If roles/x/handlers/main.yml exists, handlers listed therein will be added to the play.
  • If roles/x/vars/main.yml exists, variables listed therein will be added to the play.
  • If roles/x/defaults/main.yml exists, variables listed therein will be added to the play.
  • If roles/x/meta/main.yml exists, any role dependencies listed therein will be added to the list of roles (1.3 and later).
  • Any copy, script, template or include tasks (in the role) can reference files in roles/x/{files,templates,tasks}/ (dir depends on task) without having to path them relatively or absolutely.

When used in this manner, the order of execution for your playbook is as follows:

  • Any defined in the play.
  • Any handlers triggered so far will be run.
  • Each role listed in will execute in turn. Any role dependencies defined in the roles will be run first, subject to tag filtering and conditionals.
  • Any defined in the play.
  • Any handlers triggered so far will be run.
  • Any defined in the play.
  • Any handlers triggered so far will be run.

Note

See below for more information regarding role dependencies.

Note

If using tags with tasks (described later as a means of only running part of a playbook), be sure to also tag your pre_tasks, post_tasks, and role dependencies and pass those along as well, especially if the pre/post tasks and role dependencies are used for monitoring outage window control or load balancing.

As of Ansible 2.4, you can now use roles inline with any other tasks using or :

---

- hosts webservers
  tasks
  - debug
      msg "beforewerunourrole"
  - import_role
      name example
  - include_role
      name example
  - debug
      msg "afterweranourrole"

When roles are defined in the classic manner, they are treated as static imports and processed during playbook parsing.

Note

The option was introduced in Ansible 2.3. The usage has changed slightly as of Ansible 2.4 to match the include (dynamic) vs. import (static) usage. See for more details.

The name used for the role can be a simple name (see below), or it can be a fully qualified path:

---

- hosts webservers
  roles
    - { role '/path/to/my/roles/common' }

Roles can accept parameters:

---

- hosts webservers
  roles
    - common
    - { role foo_app_instance, dir '/opt/a', app_port 5000 }
    - { role foo_app_instance, dir '/opt/b', app_port 5001 }

Or, using the newer syntax:

---

- hosts webservers
  tasks
  - include_role
       name foo_app_instance
    vars
      dir '/opt/a'
      app_port 5000
  ...

You can conditionally execute a role. This is not generally recommended with the classic syntax, but is common when using or :

---

- hosts webservers
  tasks
  - include_role
      name some_role
    when "ansible_os_family=='RedHat'"

Finally, you may wish to assign tags to the roles you specify. You can do so inline:

---

- hosts webservers
  roles
    - { role foo, tags "bar", "baz" }

Or, again, using the newer syntax:

---

- hosts webservers
  tasks
  - import_role
      name foo
    tags
    - bar
    - baz

Скачать коллекции

Чтобы загрузить коллекцию и ее зависимости для автономной установки, запустите . Это загружает указанные коллекции и их зависимости в указанную папку и создает файл , который можно использовать для установки этих коллекций на хосте без доступа к серверу Galaxy. По умолчанию все коллекции загружаются в папку .

Как и в случае с командой , коллекции создаются на основе . Даже если коллекция для загрузки была указана с помощью URL-адреса или пути к архиву, коллекция будет повторно загружена с настроенного сервера Galaxy.

Коллекции могут быть указаны как одна или несколько коллекций или с файлом , как при .

Скачать одну коллекцию и ее зависимости:

ansible-galaxy collection download my_namespace.my_collection

Загрузить одну коллекцию в определенной версии:

ansible-galaxy collection download my_namespace.my_collection:1..

Чтобы загрузить несколько коллекций, укажите несколько коллекций в качестве аргументов командной строки, как показано выше, или используйте файл требований в формате, задокументированном в разделе .

ansible-galaxy collection download -r requirements.yml

Вы также можете скачать каталог исходной коллекции. Коллекция построена с использованием обязательного файла .

ansible-galaxy collection download /path/to/collection

ansible-galaxy collection download git+file:///path/to/collection/.git

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

ns/
├── collection1/
│   ├── galaxy.yml
│   └── plugins/
└── collection2/
    ├── galaxy.yml
    └── plugins/
ansible-galaxy collection install /path/to/ns

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

ansible-galaxy collection download my_namespace.my_collection -p ~/offline-collections

После того, как вы загрузили коллекции, папка будет содержать указанные коллекции, их зависимости и файл . Вы можете использовать эту папку как есть при для установки коллекций на хосте без доступа к серверу Galaxy или Automation Hub.


cd ~/offline-collections
ansible-galaxy collection install -r requirements.yml

Понимание ролей Ansible

Роль Ansible – это набор файлов, задач, шаблонов, переменных и обработчиков, которые вместе служат определенной цели, например, для настройки службы. Роли позволяют легко повторно использовать код и делиться решениями Ansible с другими пользователями, что делает работу с большими средами более управляемой.

Типичная роль Ansible следует определенной структуре каталогов, которая обычно состоит из следующих каталогов:

  1. defaults: содержит переменные по умолчанию для роли, которые должны быть легко перезаписаны.
  2. vars: содержит стандартные переменные для роли, которые не должны быть перезаписаны в вашей книге.
  3. tasks: содержит набор задач, которые должна выполнять роль.
  4. handlers: содержит набор обработчиков, которые будут использоваться в роли.
  5. templates: содержит шаблоны Jinja2, которые будут использоваться в роли.
  6. files: содержит статические файлы, необходимые из ролевых задач.
  7. tests: может содержать дополнительный файл инвентаря, а также playbook test.yml, который можно использовать для тестирования роли.
  8. meta: содержит метаданные роли, такие как информация об авторе, лицензия, зависимости и т. д.

Имейте в виду, что у роли могут быть все вышеупомянутые каталоги или только их часть. Фактически, вы можете определить пустую роль, у которой нет каталогов, но это бесполезно!

Хранение и расположение ролей

По умолчанию Ansible будет искать роли в двух местах:

  1. В каталоге role (тот же уровень каталога, что и ваш файл playbook).
  2. В каталоге /etc/ansible/roles.

Однако вы можете сохранить свои роли в другом месте; если вы решите это сделать, вы должны указать и установить параметр конфигурации roles_path в файле конфигурации Ansible ( ansible.cfg ).

Использование ролей Ansible в Playbooks

Есть два разных способа, которыми вы можете импортировать роли в пьесе Ansible :

  1. Использование ключевого слова roles для статического импорта ролей.
  2. Использование модуля include_role для динамического импорта ролей.

Например, чтобы статически импортировать роли в playbook, вы можете использовать ключевое слово роли в заголовке playbook следующим образом:

--- 
- name: Including roles statically
  hosts: all 
  roles: 
    - role1 
    - role2

Динамически импортировать роли; вы можете использовать модуль include_role следующим образом:

---
- name: Including roles dynamically
  hosts: all
  tasks:
    - name: import dbserver role
      include_role:
        name: db_role
      when: inventory_hostname in groups
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: