image for post

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

Copyright © 2023

Version: 0.2.24

Настройки: