Playbooks#

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

Структура playbook#

Каждый playbook может состоять из одного или нескольких сценариев playbook (plays). Сценарий playbook - это основной элемент структуры playbook, который определяет, какие задачи будут выполняться на каких хостах; может содержать информацию о целевых хостах, переменных, задачах и других параметрах.

Основные элементы структуры playbooks и их сценариев:

  • Имя playbook (опционально) - playbook может начинаться с поля name, которое описывает его назначение. Пример поля для playbook установки и настройки веб-сервера:

    - name: Install and configure web server
    
  • Хосты - поле hosts определяет, на каких хостах будут выполняться задачи. Это может быть конкретный хост, группа хостов из inventory или специальное значение all для всех доступных хостов.

    hosts: webservers
    
  • Пользователь (опционально) - поле remote_user указывает, под каким пользователем будут выполняться задачи на удаленных хостах. Если не заполнено, будет использоваться пользователь, запустивший Ansible Core.

    remote_user: ansible_user
    
  • Переменные (опционально) - playbook может содержать переменные, используемые в задачах. Переменные могут быть определены в playbook или загружены из внешних файлов.

    vars:
      http_port: 80
    
  • Задачи - основная часть playbook представляет собой список задач, которые будут выполняться на указанных хостах. Каждая задача должна содержать имя (опционально) и модуль с его параметрами.

    tasks:
      - name: Install httpd package
        yum:
          name: httpd
          state: present
    
  • Обработчики (опционально) — специальные задачи, которые выполняются только в случае вызова других задач. Обычно используются для перезапуска служб после внесения изменений.

    handlers:
      - name: Restart httpd
        service:
          name: httpd
          state: restarted
    
  • Роли (опционально) - заполнение данного поля позволяет организовать playbooks в более структурированном виде, разделяя и группируя задачи, переменные и файлы. Роли могут быть использованы для повторного использования кода.

    roles:
      - webserver
    

Примеры playbooks#

  • Playbook, который устанавливает и настраивает веб-сервер Apache на удаленных хостах (включая установку пакета, запуск службы и создание файла index.html с приветственным сообщением):

    - name: Install and configure web server
    hosts: webservers
    remote_user: ansible_user
    vars:
        http_port: 80
    
    tasks:
        - name: Install httpd package
        yum:
            name: httpd
            state: present
    
        - name: Start httpd service
        service:
            name: httpd
            state: started
            enabled: true
    
        - name: Create index file
        copy:
            content: "<h1>Hello, World!</h1>"
            dest: <path_to_file_on_remote_host>
    
    handlers:
        - name: Restart httpd
        service:
            name: httpd
            state: restarted
    
  • Playbook, который устанавливает MySQL, запускает службу, создает базу данных и пользователя со всеми привилегиями, а также задает для него пароль:

    - name: Install and configure MySQL
    hosts: databases
    remote_user: ansible_user
    vars:
        db_name: my_database
        db_user: db_user
        db_password: <secure_password>
    
    tasks:
        - name: Install MySQL package
        yum:
            name: mysql-server
            state: present
    
        - name: Start MySQL service
        service:
            name: mysqld
            state: started
            enabled: true
    
        - name: Create database
        mysql_db:
            name: "{{ db_name }}"
            state: present
    
        - name: Create user
        mysql_user:
            name: "{{ db_user }}"
            password: "{{ db_password }}"
            priv: "{{ db_name }}.*:ALL"
            state: present
    
  • Playbook, который обновляет все пакеты на удаленных хостах до последних версий:

    - name: System Update
    hosts: all
    remote_user: ansible_user
    tasks:
        - name: Update all packages
        yum:
            name: '*'
            state: latest
    
  • Playbook, который устанавливает Docker со всеми зависимостями, запускает его и добавляет пользователя ansible_user в группу docker:

    - name: Install and configure Docker
      hosts: all
      remote_user: ansible_user
      tasks:
        - name: Install dependencies
          yum:
            name:
              - yum-utils
              - device-mapper-persistent-data
              - lvm2
            state: present
    
        - name: Add Docker repository
          command: >
            yum-config-manager --add-repo <URL>
    
        - name: Install Docker
          yum:
            name: docker-ce
            state: present
    
        - name: Start Docker service
          service:
            name: docker
            state: started
            enabled: true
    
        - name: Add user to Docker group
          user:
            name: "{{ ansible_user }}"
            groups: docker
            append: yes
    
  • Playbook, который настраивает SSH-доступ для удаленных хостов, добавляя публичный ключ пользователя (это позволит ему подключаться к серверам по SSH без необходимости вводить пароль):

    - name: Configure SSH access
      hosts: all
      remote_user: ansible_user
      tasks:
        - name: Add public key to authorized_keys
          authorized_key:
            user: ansible_user
            state: present
            key: "{{ lookup('file', '<path_to_public_key>.pub') }}"