![Хакатон MaxPatrol VM, часть 1: Linux стенд и Ansible](https://avleonov.ru/wp-content/uploads/2024/06/photo_1059@03-06-2024_19-41-46.jpg)
Хакатон MaxPatrol VM, часть 1: Linux стенд и Ansible. Как и обещал, делюсь впечатлениями от хакатона. Первым заданием у меня была автоматизации установки софта из TAR-архива на Debian 12 с помощью Ansible. Раньше я с Ansible толком не работал, поэтому появился повод немного разобраться.
Ansible - система управления конфигурациями, написанная на Python. Главное отличие Ansible от аналогов - не нужна установка агента или клиента на управляемые хосты. Обычно используется для управления Linux-хостами, но Windows также поддерживается. Взаимодействие происходит по модели push: сам Ansible запускается на "центральном" управляющем хосте, ходит на управляемые хосты и что-то делает. На управляемом хосте должен быть установлен Python версии 2.4 и выше, соединение выполняется по SSH или WinRM.
Управляющим хостом для Ansible будет мой десктоп на Ubuntu 23.10, а управляемым хостом будет виртуалка в VirtualBox.
Я завёл виртуалку в VirtualBox с Debian 12, добавил интерфейс Host-only adapter, чтобы можно было подключаться к ней по SSH. Я проверил, что подключение работает с помощью:
$ ssh vmuser@192.168.56.104
Для работы Ansible должна быть настроена аутентификация по ключам. Я сгенерировал ключ с помощью:
$ ssh-keygen -t ed25519 -C "alexander@avleonov.com"
Затем я закинул его на target-host:
$ ssh-copy-id vmuser@192.168.56.104
После этого команда уже не требовала пароль.
На десктоп с Ubuntu 23.10 я поставил Ansible при помощи утилиты pipx
$ sudo apt-get install pipx
$ pipx install --include-deps ansible
Обновлять можно с помощью:
$ pipx upgrade --include-injected ansible
Проверить версию ansible можно с помощью:
$ ansible --version
ansible [core 2.16.7]
...
Далее описываю управляемый хост (виртуалку) в yaml файле:
$ cat hosts.yaml
myhosts:
hosts:
debian12:
ansible_host: 192.168.56.104
Валидирую файл hosts.yaml:
$ ansible-inventory -i hosts.yaml --list
{
"_meta": {
"hostvars": {
"debian12": {
"ansible_host": "192.168.56.104"
}
}
},
"all": {
"children": [
"ungrouped",
"myhosts"
]
},
"myhosts": {
"hosts": [
"debian12"
]
}
}
Проверяю соединение:
$ ansible myhosts -m ping -i hosts.yaml -u vmuser
debian12 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
Всё работает, связь есть. Теперь можно попробовать выполнить какие-то команды на хосте с помощью Ansible. Делаю тестовый плейбук для вывода hostname и версии дистрибутива:
- name: Print Hostname and OS Version
hosts: all
tasks:
- name: Get Hostname
command: hostname
register: hostname_output
- name: Get OS Version
ansible.builtin.shell: lsb_release -a | grep "Description:" | awk -F"\t" '{print $2}'
register: os_version_output
- name: Display Outputs
debug:
msg: "Hostname is {{ hostname_output.stdout }} and OS Version is {{ os_version_output.stdout }}"
Запускаю его:
$ ansible-playbook -i hosts.yaml -u 'vmuser' playbook.yaml
...
TASK [Display Outputs] *********************************************************
ok: [debian12] => {
"msg": "Hostname is debian and OS Version is Debian GNU/Linux 12 (bookworm)"
}
Работает! В следующей части рассмотрим как описать в плейбуке установку софта из TAR-архива.