Ansible
Ansible - платформа автоматизации, построенная на императивном подходе. В отличии от Terraform с его декларативным подходом тут мы не описываем состояние которого хотим достичь, а описываем сам способ достижения этого состояния, при этом Ansible нам дает идемпотентность (простыми словами многократный запуск не будет приводить к изменению конечного состояния, например запуская 5 раз playbook (набор действий) установки nginx мы не получим 5 переустановок пакета, а получим 1 установку и 4 проврки что он уже стоит и действий не требуется).
Короче введение простыми словами я дал, ликбезить что и как с Ansible можно много и долго, но не думаю, что сделаю это лучше других так что в конце может накидаю ссылок да и сами поискать можете, перейдем к интересному моменту: несмотря на то, что Ansible написан на Python-е он не поддерживает Windows как control node, т.е. машина с которой запускается playbook должна быть *nix like. Что ж, на такие случаи в Windows 10/11 и есть WSL, его и используем для запуска Ansible под Windows (это не единственный способ, вполне комфортно можно использовать devContainer-ы).
У меня WSL 2 c Ubuntu, ubuntu config --default-user root
:
wsl
# ставим последний python, в убунте какой-то древний
add-apt-repository ppa:deadsnakes/ppa
apt-get update
apt-get install -y python3.11 libffi-dev libssl-dev
# я не шибко в теме экосистемы python-а и всяких venv-ов у них
# просто хотим python-is-python3 ¯\(°_o)/¯
ln -s /usr/bin/python3.11 /usr/bin/python
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1
# древний python из репов убунты не нужен, удалим
apt remove --purge python3-apt && apt install python3-apt
apt install python3.11-distutils
# проверяем
update-alternatives --config python3
python --version
# ставим pip
python -m ensurepip --upgrade
# Если ensurepip ругается ^^^, то:
# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
# python get-pip.py
# проверяем:
python -m pip -V
# upgrade-им pip
python -m pip install --upgrade pip
## добавим pip scripts в PATH (если wsl из под root)
echo 'PATH=$PATH:/root/.local/bin/' >> ~/.bashrc
. ~/.bashrc
# проверим есть ли venv, лучше пробовать в /tmp/ или гит репозитории, т.к. нагенерит мусора
python -m venv env
# если видим что-то типа:
# Error: Command ... returned non-zero exit status 1
# доставляем venv
apt install python3.11-venv
# ну и ставим сам ansible, если хотим менеджить еще и Windows машины то pywinrm так же необходим
python -m pip install --user ansible pywinrm
# Прекрасный linter работающий с vscode плагином от redhat
python -m pip install ansible-lint
Насчет IDE - основной мой редактор/"IDE" это vs code ну и тут много хорошего есть из плагинов, приведу свой список рекомендаций
в ansible репо (.vscode/extensions.json
):
{
"recommendations": [
"redhat.ansible",
"mattiasbaake.vscode-snippets-for-ansible"
]
}
первый офиц. плагин от redhat, довольно годный несмотря на проблемки с WSL (ниже раскажу), второй сгенеренные снипеты с документации Ansible collections.
Ну что ж, запустим code .
в WSL, это поставит vs code server, и далее мы будем работать из под виндового окна с этим
сервером под WSL, все будет работать кроме ansible-lint
, потому что плагин vs code путает пути до projectDir.
Но это легко пофиксить создав .config/ansible-lint.yml
в репо, чтобы ansible-lint правильно находил --project-dir
.
Далее можно кодить и запускать плейбуки, но писать ansible-playbook -i inventory.yaml playbook.yaml
довольно утомительно,
особенно если плейбуков много, давайте еще добавим build task на текущий файл, открытый в VS code, создаем файлик
.vscode/tasks.json
:
{
"version": "2.0.0",
"tasks": [
{
"label": "Run ansible-playbook on current file",
"command": "ansible-playbook -i inventory.yaml ${file} --diff",
"type": "shell",
"args": [],
"problemMatcher": [],
"presentation": {
"reveal": "always"
},
"group": {
"isDefault": true,
"kind": "build"
},
"options": {
"env": {
"ANSIBLE_DEBUG": "0"
}
}
}
]
}
Вот собственно мы и готовы запускать плейбуки через обычный билд таск
(ctrl+shift+b
в vscode вроде дефолт, я себе перенастроил на alt+shift+d
можете в dotfiles подсмотреть).
Если что-то не работает выставляем ANSIBLE_DEBUG
в 1 и смотрим более полный лог ошибок.
В следующих сериях может расскажу про настройку точечного обхода блокировок на роутере через Ansible или IPSec
или про inject dotnet-а в игры, пока не решил, в любом случае до встречи :-*
Docs
- Ansible Documentation - Getting started with Ansible
- Неплохая вводная статья на живом примере использования -
Exploring Ansible via Setting Up a WireGuard VPN