zagretdinov-d Infra repository
Установил VirtualBox. Установил Vagrant.
Создал виртуалки, выполнил в директории ansible:
Проверил статус машин:
Подключился по ssh на appserver и запустил ping.
Добавил провижин ansible в Vagrantfile и доработал согласно задания устранив все ошибки:
Запуск vagrant provision dbserver
Проверяю работу роли:
Тестирование роли
Добавил зависимости в requirements.txt:
... molecule>=2.6 testinfra>=1.10 python-vagrant>=0.5.15
Установил зависимости используя virtualenv:
virtualenv venv source venv/bin/activate
pip install -r ansible/requirements.txt
Создал заготовку для тестов роли db:
cd ansible/roles/db
molecule init scenario --scenario-name default -r db -d vagrant
Добавил несколько тестов в db/molecule/default/tests/test_default.py:
import os
import testinfra.utils.ansible_runner
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')
def test_mongo_running_and_enabled(host): mongo = host.service("mongod") assert mongo.is_running assert mongo.is_enabled
def test_config_file(host): config_file = host.file('/etc/mongod.conf') assert config_file.contains('bindIp: 0.0.0.0') assert config_file.is_file
Описание тестовой машины, которая создается Molecule для тестов содержится в файле db/molecule/default/molecule.yml.
molecule create
Создал VM для проверки роли:
molecule create
molecule list - список инстансов
molecule login -h instance - подключение к инстансу
Molecule init генерирует плейбук для применения нашей роли. Данный плейбук можно посмотреть по пути db/molecule/default/playbook.yml.
Добавил become: true и переменные в этот плейбук:
- name: Converge
hosts: all
become: true
vars:
mongo_bind_ip: 0.0.0.0
roles:
- role: db
Применил плейбук:
molecule converge
Прогнал тесты:
molecule verify
Самостоятельное задание
Добавил тест что монга слушает порт 27017
def test_mongo_socket(host): socket = host.socket("tcp://0.0.0.0:27017") assert socket.is_listening
В плейбуке packer_app.yml перешел на использование роли app:
- name: Install Ruby && Bundler
hosts: all
become: true
roles:
- app
В роль app добавил теги:
-
include: ruby.yml tags:
- ruby
-
include: puma.yml tags:
- puma
В packer/app.json добавил тег и путь до ролей:
"provisioners": [ { "type": "ansible", "playbook_file": "ansible/playbooks/packer_app.yml", "ansible_env_vars": ["ANSIBLE_ROLES_PATH={{ pwd }}/ansible/roles"], "extra_arguments": ["--tags", "ruby"] } ]
В плейбуке packer_db.yml перешел на использование роли db:
- name: Install MongoDB
hosts: all
become: true
roles:
- db
В роль db добавил теги:
-
include: install_mongo.yml tags:
- install_mongo
-
include: config_mongo.yml tags:
- config_mongo
В packer/db.json добавил тег и путь до ролей:
"provisioners": [ { "type": "ansible", "playbook_file": "ansible/playbooks/packer_db.yml", "ansible_env_vars": ["ANSIBLE_ROLES_PATH={{ pwd }}/ansible/roles"], "extra_arguments": ["--tags", "install_mongo"] } ]
Аналогично поправил роль app, добавив туда установку зависимостей.
Добавил провижин для appserver согласно задания и запустил:
vagrant provision appserver
Потушил вируталки:
vagrant destroy -f
Запустил:
vagrant up
Проверил что приложение доступно по адресу 10.10.10.20:9292.
В процессе был установлен nginx
Дополните конфигурацию Vagrant для корректной работы проксирования приложения с помощью nginx.
Добавил в Vagrantfile в секцию extra_vars
ansible.extra_vars = {
"deploy_user" => "ubuntu",
nginx_sites: {
default: ["listen 80", "server_name 'puma'", "location / {proxy_pass http://127.0.0.1:9292;}"]
}
Добавил зависимости в requirements.txt:
...
molecule>=2.6
testinfra>=1.10
python-vagrant>=0.5.15
Установил зависимости используя virtualenv:
virtualenv venv
source venv/bin/activate
pip install -r ansible/requirements.txt
Создал заготовку для тестов роли db:
cd ansible/roles/db
molecule init scenario --scenario-name default -r db -d vagrant
Добавил несколько тестов в db/molecule/default/tests/test_default.py:
import os
import testinfra.utils.ansible_runner
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')
# check if MongoDB is enabled and running
def test_mongo_running_and_enabled(host):
mongo = host.service("mongod")
assert mongo.is_running
assert mongo.is_enabled
# check if configuration file contains the required line
def test_config_file(host):
config_file = host.file('/etc/mongod.conf')
assert config_file.contains('bindIp: 0.0.0.0')
assert config_file.is_file
Описание тестовой машины, которая создается Molecule для тестов содержится в файле db/molecule/default/molecule.yml.
molecule create
Создал VM для проверки роли:
molecule create
molecule list - список инстансов
molecule login -h instance - подключение к инстансу
Molecule init генерирует плейбук для применения нашей роли. Данный плейбук можно посмотреть по пути db/molecule/default/playbook.yml.
Добавил become: true и переменные в этот плейбук:
- name: Converge
hosts: all
become: true
vars:
mongo_bind_ip: 0.0.0.0
roles:
- role: db
Применил плейбук:
molecule converge
Прогнал тесты:
molecule verify
Добавил тест что монга слушает порт 27017
# check if MongoDB is listening on 0.0.0.0:27017
def test_mongo_socket(host):
socket = host.socket("tcp://0.0.0.0:27017")
assert socket.is_listening
В плейбуке packer_app.yml перешел на использование роли app:
- name: Install Ruby && Bundler
hosts: all
become: true
roles:
- app
В роль app добавил теги:
- include: ruby.yml
tags:
- ruby
- include: puma.yml
tags:
- puma
В packer/app.json добавил тег и путь до ролей:
"provisioners": [
{
"type": "ansible",
"playbook_file": "ansible/playbooks/packer_app.yml",
"ansible_env_vars": ["ANSIBLE_ROLES_PATH={{ pwd }}/ansible/roles"],
"extra_arguments": ["--tags", "ruby"]
}
]
В плейбуке packer_db.yml перешел на использование роли db:
- name: Install MongoDB
hosts: all
become: true
roles:
- db
В роль db добавил теги:
- include: install_mongo.yml
tags:
- install_mongo
- include: config_mongo.yml
tags:
- config_mongo
В packer/db.json добавил тег и путь до ролей:
"provisioners": [
{
"type": "ansible",
"playbook_file": "ansible/playbooks/packer_db.yml",
"ansible_env_vars": ["ANSIBLE_ROLES_PATH={{ pwd }}/ansible/roles"],
"extra_arguments": ["--tags", "install_mongo"]
}
]