Продолжаем сетап системы мониторинга.
Предыдущие части:
Для NGINX роль я писал руками, далее — используем Ansible Galaxy.
Основная идея использования Galaxy — иметь постоянно обновлённые роли во время сетапа серверов.
Т.е., вместо того, что бы просто сделать git clone роли к себе в репозиторий и через полгода узнать, что она уже не работает — можно выполнять импорт ролей прямо во время провижена из Jenkins-а.
Сначала выполним локально, на примере unattended-upgrades, потом — добавим импорт списка ролей через requirements.yml. и в конце — добавим их установку в Jenkins-файл.
Содержание
Импорт роли
roles_path
По умолчанию — роли будут импортироваться в каталог /etc/ansible/roles.
Переопределить путь можно с помощью переменной ANSIBLE_ROLES_PATH:
[simterm]
$ mkdir ~/.ansible/roles $ export ANSIBLE_ROLES_PATH=/home/setevoy/.ansible/roles
[/simterm]
Другой вариант — использовать опцию --roles-path для ansible-galaxy.
Импортируем роль:
[simterm]
$ ansible-galaxy install jnv.unattended-upgrades - downloading role 'unattended-upgrades', owned by jnv - downloading role from https://github.com/jnv/ansible-role-unattended-upgrades/archive/v1.3.0.tar.gz - extracting jnv.unattended-upgrades to /home/setevoy/.ansible/roles/jnv.unattended-upgrades - jnv.unattended-upgrades (v1.3.0) was installed successfully
[/simterm]
Проверяем:
[simterm]
$ ls -l ~/.ansible/roles/jnv.unattended-upgrades/ total 76 -rw-rw-r-- 1 setevoy setevoy 62 Jul 24 2016 ansible.cfg drwxr-xr-x 2 setevoy setevoy 4096 Sep 25 11:49 defaults drwxr-xr-x 2 setevoy setevoy 4096 Sep 25 11:49 files drwxr-xr-x 2 setevoy setevoy 4096 Sep 25 11:49 handlers ...
[/simterm]
Или используем --roles-path, что бы загрузить роль в каталог проекта:
[simterm]
$ ansible-galaxy install jnv.unattended-upgrades --roles-path /home/setevoy/Work/BER.jm/azure-infrastructure/monitoring/ansible/monitoring/roles - downloading role 'unattended-upgrades', owned by jnv - downloading role from https://github.com/jnv/ansible-role-unattended-upgrades/archive/v1.3.0.tar.gz - extracting jnv.unattended-upgrades to /home/setevoy/Work/BER.jm/azure-infrastructure/monitoring/ansible/monitoring/roles/jnv.unattended-upgrades - jnv.unattended-upgrades (v1.3.0) was installed successfully
[/simterm]
Теперь эту роль можно добавить в provision.yml:
- hosts: all
become:
true
roles:
- nginx
- jnv.unattended-upgrades
И выполняем --check:
[simterm]
$ ansible-playbook --inventory-file=hosts --check --limit=dev --private-key ../../.ssh/monitoring provision.yml PLAY [all] **** TASK [Gathering Facts] **** ok: [dev.monitor.domain.ms] TASK [nginx : Install Nginx] **** ok: [dev.monitor.domain.ms] TASK [nginx : Replace NGINX config] **** ok: [dev.monitor.domain.ms] TASK [nginx : Add NGINX virtualhost config] **** ok: [dev.monitor.domain.ms] TASK [jnv.unattended-upgrades : add distribution-specific variables] **** ok: [dev.monitor.domain.ms] TASK [jnv.unattended-upgrades : add Debian Wheezy workaround] **** skipping: [dev.monitor.domain.ms] TASK [jnv.unattended-upgrades : install unattended-upgrades] **** ok: [dev.monitor.domain.ms] TASK [jnv.unattended-upgrades : install update-notifier-common] **** skipping: [dev.monitor.domain.ms] TASK [jnv.unattended-upgrades : create APT auto-upgrades configuration] **** changed: [dev.monitor.domain.ms] TASK [jnv.unattended-upgrades : create unattended-upgrades configuration] **** changed: [dev.monitor.domain.ms] PLAY RECAP **** dev.monitor.domain.ms : ok=8 changed=2 unreachable=0 failed=0
[/simterm]
Хорошо — всё работает.
requirements.yml
Далее, что бы хранить список всех нужных ролей и устанавливать их одной командой — в корне репозитория создаём файл requirements.yml.
Пока он будет содержать только одну роль, потом сюда же добавим Docker, Docker-Compose etc:
- src: jnv.unattended-upgrades name: unattended-upgrades
С помощью name — указываем под каким именем импортировать роль.
Удаляем уже импортированную роль:
[simterm]
$ rm -rf roles/jnv.unattended-upgrades/
[/simterm]
Обновляем имя в provision.yml: и добавляем переменные для настройки unattended-upgrades:
- hosts: all
become:
true
roles:
- role: nginx
- role: unattended-upgrades
unattended_mail: [email protected]
unattended_automatic_reboot: true
unattended_automatic_reboot_time: 03:00
Меняем ANSIBLE_ROLES_PATH на каталог проекта:
[simterm]
$ export ANSIBLE_ROLES_PATH=/home/setevoy/Work/BER.Jm/azure-infrastructure/monitoring/ansible/monitoring/roles/
[/simterm]
Вызываем ansible-galaxy, через --role-file (-r) указываем файл со списком ролей:
[simterm]
$ ansible-galaxy install -r requirements.yml - downloading role 'unattended-upgrades', owned by jnv - downloading role from https://github.com/jnv/ansible-role-unattended-upgrades/archive/v1.3.0.tar.gz - extracting unattended-upgrades to /home/setevoy/Work/BER.jm/azure-infrastructure/monitoring/ansible/monitoring/roles/unattended-upgrades - unattended-upgrades (v1.3.0) was installed successfully
[/simterm]
Проверяем роли:
[simterm]
$ ls -l roles/ total 8 drwxr-xr-x 6 setevoy setevoy 4096 Sep 20 17:31 nginx drwxr-xr-x 9 setevoy setevoy 4096 Sep 25 12:16 unattended-upgrades
[/simterm]
Всё готово.
Jenkins
Последним шагом — надо добавить вызов установки ролей в Jenkins.
Для этого добавим ещё одну функцию в файл monitoring-ansible.groovy:
#!/usr/bin/env groovy
def ansibleRolesInstall() {
docker.image('williamyeh/ansible:master-ubuntu16.04').inside('-v /var/run/docker.sock:/var/run/docker.sock') {
git branch: "${BRANCH}", credentialsId: 'github', url: "${INFRA_URL}"
stage('Roles install') {
sh "ansible-galaxy install --roles-path ${WORKDIR}/roles --role-file ${WORKDIR}/requirements.yml"
}
}
}
...
И её вызов во втором скрипте — monitoring-ansible-provision.groovy (до вызова provision.ansibleVmProvisionValidate() и provision.ansibleVmProvisionApply()):
#!/usr/bin/env groovy
node {
// 'dev' or 'production'
ENV="${ENV}"
TAG = "${env.BUILD_TAG}"
// Ansible playbooks repo URL
INFRA_URL = "${INFRA_URL}"
// Jenkins build script repo URL
BUILD_REPO_URL = "${BUILD_REPO_URL}"
// expor variable to path to Ansible dir in Infra repo
WORKDIR='monitoring/ansible/monitoring'
// clone $BUILD_REPO_URL to dedicated directory ./buildscripts/
dir('buildscripts') {
git branch: 'master', credentialsId: 'github', url: "${BUILD_REPO_URL}"
}
def provision = load 'buildscripts/monitoring/monitoring-ansible.groovy'
provision.ansibleRolesInstall()
provision.ansibleVmProvisionValidate("${ENV}")
provision.ansibleVmProvisionApply("${ENV}")
}
Коммитим и пушим изменения в обоих репозиториях (кроме каталога roles — можно его вообще в .gitignore добавить, правда там собственная роль nginx).
Репозиторий Jenkins-файлов:
[simterm]
$ git add -A && git commit -m "Roles install funct()" && git push
[/simterm]
Ansbile репозиторий:
[simterm]
$ git add provision.yml requirements.yml && git commit -m "unattended-upgrades added" && git push
[/simterm]
Запускаем билд, и — он фейлится:
…
[monitoring-azure-VM-DEV-provisioning@2] Running shell script
+ ansible-galaxy install —roles-path roles —role-file monitoring/ansible/monitoring/requirements.yml
[WARNING]: — unattended-upgrades was NOT installed successfully: Failed to get
data from the API server (https://galaxy.ansible.com/api/): <urlopen error
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>
ERROR! — you can use —ignore-errors to skip failed roles and finish processing the list.
…
Как вариант решения — добавляем --ignore-certs:
...
stage('Roles install') {
sh "ansible-galaxy install --ignore-certs --roles-path ${WORKDIR}/roles --role-file ${WORKDIR}/requirements.yml"
}
...
Запускаем ещё раз — всё ОК.
Импорт ролей:
И установка unattended-upgrades на Dev:
Проверяем настройки на сервере:
[simterm]
root@monitoring-dev-vm:~# cat /etc/apt/apt.conf.d/50unattended-upgrades | grep Reboot Unattended-Upgrade::Automatic-Reboot "true"; Unattended-Upgrade::Automatic-Reboot-Time "03:00";
[/simterm]
Готово.

