Как настроить 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
. Чтобы запустить команду 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.