Задание
Вам необходимо создать топологию сети, состоящую из трёх машин. Используйте любую ОС семейства Linux, одну машину используйте как сервер, остальные – как клиенты. Установите и настройте Ansible, напишите плейбук, при запуске которого на сервер в папку /etc/ansible/ITPlanet с клиентов должна собираться следующая информация: IP адреса клиентов; версия операционной системы клиентов; имена клиентов; количество свободного места на диске
Решение
Лаборатория
В качестве операционной системы я использую Debian 12. Создаем три виртуальных машины
Временно настроил NAT и скачиваем Ansible.
Если вникать, то вот так:
auto enp0s3
iface enp0s3 inet dhcp
А дальше для всех клиентов и сервера настроил, выбрал Internal Network и название сети одна и та же, задал IPv4 в /etc/network/interfaces:
auto enp0s3
iface enp0s3 inet static
address 192.168.1.10
netmask 255.255.255.0
Также для всех машин с определенными ipv4
Далее:
systemctl restart networking
После рестарта networking видим:
Клиент 1
Клиент 2
Сервер
Пинги идут
Настройка
Настроим клиентов:
useradd ansible # создали пользователя ansible
usermod -aG sudo ansible # добавили его в группу sudo
echo "ansible ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/ansible # sudo без пароля
Так и для другого клиента.
Настроим сервер: Создаем SSH ключ и отправляем клиентам публичный ключ
ssh-keygen -t rsa -b 4096
ssh-copy-id ansible@192.168.1.11
ssh-copy-id ansible@192.168.1.12
mkdir -p /etc/ansible/ITPlanet # дальше будем работать в директории /etc/ansible
Файл main.yml
- name: get info
hosts: clients
become: yes # Используем привилегии root
gather_facts: yes # Получаем базовые факты
serial: 1 # Обрабатываем по одному из-за нехватки ресурсов, но его можно отключить
tasks:
- name: ip # Получаем IP-адрес клиента
shell: hostname -I | awk '{print $1}'
register: client_ip
- name: ОС # Узнаем версию операционной системы
shell: cat /etc/os-release | grep "PRETTY_NAME" | cut -d= -f2 | tr -d \"
register: os_version
- name: hostname # Получаем имя хоста
shell: hostname
register: hostname
- name: free space # Проверяем свободное место на диске
shell: df -h / | tail -n 1 | awk '{print $4}'
register: free_space
- name: files # Сохраняем собранную информацию в файл
copy:
content: |
Hostname: {{ hostname.stdout }}
IPv4: {{ client_ip.stdout }}
ОС: {{ os_version.stdout }}
free space: {{ free_space.stdout }}
dest: "/etc/ansible/ITPlanet/{{ inventory_hostname }}_info.txt"
delegate_to: localhost
Файл hosts:
[clients]
client1 ansible_host=192.168.1.11
client2 ansible_host=192.168.1.12
[all:vars]
ansible_user=ansible
Запуск и результаты
Дальше запускаем playbook:
ansible-playbook main.yml
Итог: