Поиск по сайту:

Как настроить Apache с помощью Ansible в Ubuntu 14.04


Введение

Apache — один из самых популярных веб-серверов, используемых в настоящее время в Интернете. Его легко установить и настроить в дистрибутивах Linux, таких как Ubuntu и Debian, поскольку он поставляется в репозиториях пакетов и включает конфигурацию по умолчанию, которая работает «из коробки».

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

Предпосылки

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

Для этого урока вам понадобятся:

  • Две капли Ubuntu 14.04: одна основная капля с Ansible и одна дополнительная капля, которая будет запускать Apache, настроенный через Ansible
  • Пользователи Sudo без полномочий root для обеих капель.
  • Ansible установлен на главном дроплете. Следуйте этому руководству (до раздела Настройка ключей SSH). Хотя этот учебник был написан для Ubuntu 12.04, он по-прежнему актуален для Ubuntu 14.04.
  • Ключи SSH для основного дроплета для авторизации входа в вторичный дроплет, что вы можете сделать, следуя этому руководству на главном дроплете.
  • Активные записи DNS или вручную настройте файл локальных хостов на локальном компьютере (используя IP-адрес вашего дополнительного дроплета), чтобы настроить и использовать виртуальные хосты, которые будут настроены.

Примечание. В этом учебном пособии используются концепции, описанные в существующем учебном пособии:

Шаг 1 — Настройка Ansible

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

Первый шаг после установки Ansible — указать Ansible, с какими хостами следует общаться. Для этого нам нужно создать файл Ansible hosts. Файл Ansible hosts содержит группы хостов, на которые мы ссылаемся при выполнении команд Ansible. По умолчанию он находится в /etc/ansible/hosts. Однако это применяется глобально в вашей системе и часто требует разрешений администратора. Вместо этого, чтобы упростить задачу, нам нужно указать Ansible использовать локальный файл hosts.

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

Создайте новый каталог (который мы будем использовать в оставшейся части этого руководства).

mkdir ansible-apache

Перейдите в новый каталог.

cd ~/ansible-apache/

Создайте новый файл с именем ansible.cfg и откройте его для редактирования.

nano ansible.cfg

В этот файл мы хотим добавить параметр конфигурации hostfile со значением hosts в группе [defaults]. Скопируйте следующее в файл ansible.cfg, затем сохраните и закройте его.

[defaults]
hostfile = hosts

Затем необходимо записать файл hosts. Для файла hosts доступно множество опций. Однако мы можем начать с чего-то очень простого.

Создайте файл hosts и откройте его для редактирования.

nano hosts

Скопируйте следующее в файл hosts.

[apache]
secondary_server_ip ansible_ssh_user=username

Это указывает группу хостов с именем apache, которая содержит один хост. Замените secondary_server_ip именем хоста или IP-адресом вторичного сервера, а имя пользователя — своим именем пользователя SSH. Теперь Ansible сможет подключиться к вашему серверу.

Примечание. Компонент ansible_ssh_user=username является необязательным, если вы используете Ansible от имени того же пользователя, что и целевой хост.

Чтобы проверить, что Ansible работает и может взаимодействовать с вашим хостом, вы можете запустить простую команду ansible. Ansible поставляется с большим количеством модулей ping. Он проверяет возможность подключения к каждому хосту, что упрощает проверку правильности файла hosts.

Базовое использование команды ansible принимает группу узлов и имя модуля: ansible -m . Чтобы запустить команду ping, введите следующую команду.

ansible apache -m ping

Вывод должен выглядеть так:

111.111.111.111 | success >> {
    "changed": false,
    "ping": "pong"
}

Еще один модуль Ansible, полезный для тестирования, — это командный модуль. Он запускает пользовательские команды на хосте и возвращает результаты. Чтобы запустить команду command с помощью echo, команды Unix, выводящей строку на терминал, введите следующую команду.

ansible apache -m command -a "/bin/echo hello sammy"

Вывод должен выглядеть так:

111.111.111.111 | success | rc=0 >>
hello sammy

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

Шаг 2 — Создание Playbook

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

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

Давайте создадим базовую версию команды hello sammy, описанную выше.

Создайте файл с именем apache.yml и откройте его для редактирования.

nano apache.yml

Скопируйте следующий текст в файл, затем сохраните и закройте его.

---
- hosts: apache
  tasks:
    - name: run echo command
      command: /bin/echo hello sammy

Объявление hosts: apache находится вверху, что говорит Ansible, что мы используем группу хостов apache. Это эквивалентно его передаче с помощью команды ansible. Далее идет список задач. В этом примере у нас есть одна задача с именем run echo command. Это просто описание, предназначенное для того, чтобы пользователь понял, что делает задача. Наконец, строка command: /bin/echo hello sammy запускает модуль command с аргументами /bin/echo hello sammy.

Команда ansible-playbook используется для запуска плейбуков, и самое простое использование: ansible-playbook your-playbook.yml. Мы можем запустить только что созданный плейбук с помощью следующей команды.

ansible-playbook apache.yml

Вывод должен выглядеть следующим образом.

PLAY [apache] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [run echo command] ******************************************************
changed: [111.111.111.111]

PLAY RECAP ********************************************************************
111.111.111.111            : ok=2    changed=1    unreachable=0    failed=0

Здесь важно отметить, что плейбуки не возвращают выходные данные модуля, поэтому, в отличие от прямой команды, которую мы использовали на шаге 1, мы не можем увидеть, действительно ли был напечатан hello sammy. Это означает, что плейбуки лучше подходят для задач, где вам не нужно видеть результат. Ansible сообщит вам, если во время выполнения модуля произошла ошибка, поэтому вам обычно нужно полагаться только на это, чтобы узнать, пойдет ли что-то не так.

Шаг 3 — Установка Apache

Теперь, когда мы представили плейбуки, напишем задачу по установке веб-сервера Apache.

Обычно в Ubuntu установка Apache представляет собой простой случай установки пакета apache2 через apt-get. Чтобы сделать это через Ansible, мы используем модуль Ansible apt. Модуль apt содержит ряд опций для специализированной функциональности apt-get. Нас интересуют следующие варианты:

  • имя: имя устанавливаемого пакета, либо отдельное имя пакета, либо список пакетов.
  • состояние: принимает либо последний, отсутствует, либо присутствует. Последний гарантирует, что установлена последняя версия, присутствует просто проверяет, установлена ли она, а отсутствие удаляет ее, если она установлена.
  • update_cache: обновляет кеш (через apt-get update), если он включен, чтобы обеспечить его актуальность.

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

Теперь давайте добавим в наш плейбук apache.yml модуль apt вместо модуля command. Снова откройте файл apache.yml для редактирования.

nano apache.yml

Удалите текущий текст и скопируйте в него следующий текст.

---
- hosts: apache
  sudo: yes
  tasks:
    - name: install apache2
      apt: name=apache2 update_cache=yes state=latest

Строка apt устанавливает пакет apache2 (name=apache2) и гарантирует, что мы обновили кеш (update_cache=yes). Хотя это необязательно, включение state=latest для явного указания на то, что оно должно быть установлено, является хорошей идеей.

Если ваш Playbook не работает как root на каждом хосте, sudo потребуется для обеспечения правильных привилегий. Ansible поддерживает sudo как часть простой опции в Playbook. Его также можно применить с помощью команды ansible-playbook и на уровне каждой задачи.

Теперь запустите playbook.

ansible-playbook apache.yml --ask-sudo-pass

Флаг --ask-sudo-pass предложит вам ввести пароль sudo на вторичном дроплете. Это необходимо, поскольку для установки требуются привилегии root; другие команды, которые мы запускали до сих пор, этого не сделали.

Вывод должен выглядеть следующим образом.

PLAY [apache] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [install apache2] *******************************************************
changed: [111.111.111.111]

PLAY RECAP ********************************************************************
111.111.111.111            : ok=2    changed=1    unreachable=0    failed=0

Если вы посещаете имя хоста или IP-адрес вашего вторичного сервера в своем браузере, теперь вы должны получить страницу по умолчанию Apache2 Ubuntu, чтобы приветствовать вас. Это означает, что у вас есть работающая установка Apache на вашем сервере, и вы еще не подключились к ней вручную для запуска команды.

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

Например, снова запустите ту же команду playbook.

ansible-playbook apache.yml --ask-sudo-pass

Вывод должен выглядеть следующим образом. Обратите внимание на раздел changed=0.

PLAY [apache] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [install apache2] *******************************************************
ok: [111.111.111.111]

PLAY RECAP ********************************************************************
111.111.111.111            : ok=2    changed=0    unreachable=0    failed=0

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

Шаг 4 — Настройка модулей Apache

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

Давайте удостоверимся, что модуль mod_rewrite включен для Apache. Через SSH это можно легко сделать, используя a2enmod и перезапустив Apache. Однако мы также можем очень легко сделать это с помощью Ansible, используя модуль apache2_module и обработчик задач для перезапуска apache2.

Модуль apache2_module принимает два варианта:

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

Откройте apache.yml для редактирования.

nano apache.yml

Обновите файл, чтобы включить эту задачу. Теперь файл должен выглядеть так:

---
- hosts: apache
  sudo: yes
  tasks:
    - name: install apache2
      apt: name=apache2 update_cache=yes state=latest

    - name: enabled mod_rewrite
      apache2_module: name=rewrite state=present

Однако нам нужно перезапустить apache2 после включения модуля. Один из вариантов — добавить задачу для перезапуска apache2, но мы не хотим, чтобы она запускалась каждый раз, когда мы применяем нашу пьесу. Чтобы обойти это, нам нужно использовать обработчик задач. Работа обработчиков заключается в том, что задаче можно приказать уведомить обработчик, когда она изменилась, и обработчик запускается только тогда, когда задача была изменена.

Для этого нам нужно добавить параметр notify в задачу apache2_module, а затем мы можем использовать сервисный модуль для перезапуска apache2 в обработчике. .

В результате получается плейбук, который выглядит так:

---
- hosts: apache
  sudo: yes
  tasks:
    - name: install apache2
      apt: name=apache2 update_cache=yes state=latest

    - name: enabled mod_rewrite
      apache2_module: name=rewrite state=present
      notify:
        - restart apache2

  handlers:
    - name: restart apache2
      service: name=apache2 state=restarted

Теперь перезапустите playbook.

ansible-playbook apache.yml --ask-sudo-pass

Вывод должен выглядеть так:

PLAY [apache] *****************************************************************

GATHERING FACTS ***************************************************************
ok: [111.111.111.111]

TASK: [install apache2] *******************************************************
ok: [111.111.111.111]

TASK: [enabled mod_rewrite] ***************************************************
changed: [111.111.111.111]

NOTIFIED: [restart apache2] ***************************************************
changed: [111.111.111.111]

PLAY RECAP ********************************************************************
111.111.111.111            : ok=4    changed=2    unreachable=0    failed=0

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

Шаг 5 — Настройка параметров Apache

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

По умолчанию Apache прослушивает порт 80 для всего HTTP-трафика. Для примера предположим, что вместо этого мы хотим, чтобы Apache прослушивал порт 8081. В конфигурации Apache по умолчанию в Ubuntu 14.04 x64 необходимо обновить два файла:

/etc/apache2/ports.conf
    Listen 80

/etc/apache2/sites-available/000-default.conf
    <VirtualHost *:80>

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

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

Примечание. Модуль lineinfile добавит строку в конец файла, если она не соответствует существующей строке с regexp. Параметры insertbefore и insertafter могут указывать строки для добавления до или после, а не в конце, если это необходимо.

Что нам нужно сделать, чтобы обновить порт с 80 на 8081, так это найти существующие строки, которые определяют порт 80, и изменить их, чтобы определить порт 8081.

Откройте файл apache.yml для редактирования.

nano apache.yml

Измените дополнительные строки, чтобы файл выглядел так:

---
- hosts: apache
  sudo: yes
  tasks:
    - name: install apache2
      apt: name=apache2 update_cache=yes state=latest

    - name: enabled mod_rewrite
      apache2_module: name=rewrite state=present
      notify:
        - restart apache2

    - name: apache2 listen on port 8081
      lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen 80" line="Listen 8081" state=present
      notify:
        - restart apache2

    - name: apache2 virtualhost on port 8081
      lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:80>" line="<VirtualHost *:8081>" state=present
      notify:
        - restart apache2

  handlers:
    - name: restart apache2
      service: name=apache2 state=restarted

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

Теперь запустите playbook.

ansible-playbook apache.yml --ask-sudo-pass

После завершения Ansible вы сможете посетить свой хост в своем браузере, и он ответит на порт 8081, а не на порт 80. В большинстве веб-браузеров этого можно легко добиться, добавив :port в конец URL-адреса: http://111.111.111.111:8081/.

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

Шаг 6 — Настройка виртуальных хостов

В Ansible есть несколько модулей, которые позволяют копировать локальный (в Ansible) файл шаблона на хосты. Двумя наиболее часто используемыми модулями для этой цели являются модуль шаблона. Модуль copy копирует файл как есть и не вносит в него изменений, в то время как более мощный модуль template копирует шаблон и применяет подстановку переменных к областям, указанным вами с помощью двойные фигурные скобки (например, {{ variable }}).

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

Создать конфигурацию виртуального хоста

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

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

<VirtualHost *:8081>
    ServerAdmin webmaster@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Создайте новый файл с именем virtualhost.conf.

nano virtualhost.conf

Вставьте следующее в virtualhost.conf. Поскольку мы используем шаблоны, хорошей идеей будет изменить указанные выше жестко закодированные значения на переменные, чтобы упростить их изменение в будущем.

<VirtualHost *:{{ http_port }}>
    ServerAdmin webmaster@{{ domain }}
    ServerName {{ domain }}
    ServerAlias www.{{ domain }}
    DocumentRoot /var/www/{{ domain }}
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Используйте переменные шаблона

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

Первый шаг — добавить в playbook раздел для переменных. Он называется vars и находится на том же уровне, что и hosts, sudo, tasks и обработчики. . Нам нужно указать обе переменные, используемые в приведенном выше шаблоне, и в процессе мы снова изменим порт на 80.

---
- hosts: apache
  sudo: yes
  vars:
    http_port: 80
    domain: example.com
  tasks:
    - name: install apache2
...

Переменные можно использовать в задачах и шаблонах, поэтому мы можем обновить наши существующие модули lineinfile, чтобы использовать указанный http_port, а не жестко заданный 8081. мы указали ранее. Переменную нужно добавить в строку, а параметр regexp нужно обновить, чтобы он не искал конкретный порт. Изменения будут выглядеть так:

lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen " line="Listen {{ http_port }}" state=present
lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:" line="<VirtualHost *:{{ http_port }}>"

Добавить модуль шаблона

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

  • dest — путь к файлу назначения для сохранения обновленного шаблона на хосте (узлах), например /etc/apache2/sites-available/{{ domain }}.conf.
  • src — исходный файл шаблона, т. е. virtualhost.conf.

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

- name: create virtual host file
  template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf

Включить виртуальный хост

Почти готово! Теперь нам нужно включить виртуальный хост в Apache. Это можно сделать двумя способами: запустив команду sudo a2ensite example.com или вручную создав символическую ссылку на файл конфигурации в /etc/apache2/sites-enabled/. Первый вариант более безопасен, так как позволяет Apache контролировать процесс. Для этого снова используется модуль command.

Использование довольно простое, как мы обнаружили выше:

- name: a2ensite {{ domain }}
  command: a2ensite {{ domain }}
  notify:
  - restart apache2

Предотвратить дополнительную работу

Наконец, модуль command должен знать, когда он должен и не должен запускаться, чтобы модуль не запускался без необходимости, если playbook запускался несколько раз. В нашем случае его нужно запускать только в том случае, если файл .conf еще не создан на хосте.

Это делается с помощью параметра creates, который позволяет указать модулю, какой файл создается во время выполнения модуля. Если файл существует, модуль не запустится. Поскольку Apache создает символическую ссылку, когда сайты включены, проверка этого решает проблему.

Изменения будут выглядеть так:

- name: a2ensite {{ domain }}
  command: a2ensite {{ domain }}
  args:
    creates: /etc/apache2/sites-enabled/{{ domain }}.conf
  notify:
  - restart apache2

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

Окончательная версия apache.yml Playbook

Теперь давайте применим эти изменения. Откройте apache.yml.

nano apache.yml

Со всеми вышеперечисленными изменениями измените плейбук apache.yml, чтобы он выглядел следующим образом.

---
- hosts: apache
  sudo: yes
  vars:
    http_port: 80
    domain: example.com
  tasks:
    - name: install apache2
      apt: name=apache2 update_cache=yes state=latest

    - name: enabled mod_rewrite
      apache2_module: name=rewrite state=present
      notify:
        - restart apache2

    - name: apache2 listen on port {{ http_port }}
      lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen " line="Listen {{ http_port }}" state=present
      notify:
        - restart apache2

    - name: apache2 virtualhost on port {{ http_port }}
      lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:" line="<VirtualHost *:{{ http_port }}>"
      notify:
        - restart apache2

    - name: create virtual host file
      template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf

    - name: a2ensite {{ domain }}
      command: a2ensite {{ domain }}
      args:
        creates: /etc/apache2/sites-enabled/{{ domain }}.conf
      notify:
        - restart apache2

  handlers:
    - name: restart apache2
      service: name=apache2 state=restarted

Сохраните и закройте файл, затем запустите playbook.

ansible-playbook apache.yml --ask-sudo-pass

Если вы сейчас посетите имя хоста или IP-адрес вашего вторичного дроплета в своем браузере, вы увидите, что он снова отвечает на порт 80, а не на порт 8081. Затем посетите домен (например, example.com), который мы указали для нового виртуального хоста. Поскольку мы еще не добавили никаких файлов, должна отображаться страница ошибки Apache 404, а не страница приветствия Apache. Если это так, ваш виртуальный хост работает правильно, и вы все еще не подключились к вторичной капле по SSH для выполнения одной команды.

Шаг 7 — Использование репозитория Git для вашего сайта

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

Каждому веб-сайту нужен контент, и хотя использование SSH и ручное клонирование репозитория Git для создания нового веб-сайта является нормальным явлением, Ansible предоставляет нам инструменты, необходимые для автоматического выполнения этой задачи. В этом примере модуль git сделает то, что требуется.

Модуль git имеет множество опций, наиболее важными для этого руководства являются:

  • dest – путь на хосте, на который будет извлечен репозиторий.
  • repo — URL репозитория, который будет клонирован. Он должен быть доступен хосту.
  • update — если задано значение no, это запрещает Ansible обновлять репозиторий, когда он уже существует.
  • accept_hostkey — указывает SSH принимать любой неизвестный ключ хоста при подключении через SSH. Это очень полезно, так как избавляет от необходимости входить в систему через SSH, чтобы принять первую попытку входа, но исключает возможность ручной проверки подписи хоста. В зависимости от вашего репозитория вам может понадобиться этот параметр.

Для целей руководства существует простой репозиторий Git с одной страницей index.html, которую можно клонировать на ваш хост. Если у вас уже есть другой общедоступный репозиторий, который содержит подобное, не стесняйтесь заменить его. Имея это в виду, задача git будет выглядеть так:

- name: clone basic html template
  git: repo=https://github.com/do-community/ansible-apache-tutorial.git dest=/var/www/example.com update=no

Однако, если вы запустите Playbook сейчас, вы, вероятно, получите сообщение об ошибке. Сначала нам нужно установить пакет git, чтобы Ansible мог использовать его для клонирования репозитория. Необходимо обновить задачу apt, чтобы установить как пакет apache2, так и пакет git. Проверка документации apt говорит нам, что параметр name принимает только один пакет, так что это не поможет. Вместо этого нам нужно использовать список элементов.

Ansible предоставляет возможность указать список элементов для циклического просмотра и применить задачу к каждому из них. Они указываются с помощью параметра with_items как часть задачи, и наша задача apt будет выглядеть следующим образом:

- name: install packages
  apt: name={{ item }} update_cache=yes state=latest
  with_items:
    - apache2
    - git

Список элементов использует переменную item и будет выполнять задачу для каждого элемента в списке.

Снова откройте apache.yml.

nano apache.yml

Обновите playbook, чтобы он соответствовал следующему:

---
- hosts: apache
  sudo: yes

  vars:
    http_port: 80
    domain: example.com

  tasks:

    - name: install packages
      apt: name={{ item }} update_cache=yes state=latest
      with_items:
        - apache2
        - git

    - name: enabled mod_rewrite
      apache2_module: name=rewrite state=present
      notify:
        - restart apache2

    - name: apache2 listen on port {{ http_port }}
      lineinfile: dest=/etc/apache2/ports.conf regexp="^Listen " line="Listen {{ http_port }}" state=present
      notify:
        - restart apache2

    - name: apache2 virtualhost on port {{ http_port }}
      lineinfile: dest=/etc/apache2/sites-available/000-default.conf regexp="^<VirtualHost \*:" line="<VirtualHost *:{{ http_port }}>"
      notify:
        - restart apache2

    - name: create virtual host file
      template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf

    - name: a2ensite {{ domain }}
      command: a2ensite {{ domain }}
      args:
        creates: /etc/apache2/sites-enabled/{{ domain }}.conf
      notify:
        - restart apache2

    - name: clone basic html template
      git: repo=https://github.com/do-community/ansible-apache-tutorial.git dest=/var/www/example.com update=no

  handlers:
    - name: restart apache2
      service: name=apache2 state=restarted

Сохраните файл и запустите playbook.

ansible-playbook apache.yml --ask-sudo-pass

Он должен установить git и успешно клонировать репозиторий. Теперь вы должны увидеть что-то отличное от ошибки 404 при посещении виртуального хоста из шага 6. Не забудьте проверить, что не виртуальный хост по-прежнему возвращает страницу по умолчанию.

Таким образом, теперь у вас установлен Git, и базовая HTML-страница клонирована через Git на ваш новый виртуальный хост. По-прежнему не требуются ручные команды SSH. Если вам нужен только базовый веб-сайт HTML, и он находится в общедоступном репозитории Git, то все готово!

Заключение

Мы только что создали Ansible Playbook для автоматизации всего процесса настройки вашего хоста для запуска веб-сервера Apache с виртуальными хостами и репозиторием Git. Все это было достигнуто без необходимости входа на сервер напрямую, и самое приятное то, что вы можете запустить свой новый Playbook на большинстве серверов Ubuntu для достижения того же результата.

Примечание: если на вашем хосте уже установлен и изменен Apache, вам, скорее всего, потребуется обработать каждую модификацию, чтобы вернуть его в требуемое состояние. С положительной стороны, Ansible исправит эти модификации только в том случае, если они существуют, поэтому их безопасно иметь в основном Playbook!

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

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