
Настройте ansible на серверной машине. В качестве клиентов выберете обе машины – сервер и клиент.
sudo apt install ansible (серв+ клиент)
Скопируйте ключ на клиентские машины:
ssh-copy-id username@client_ip
sudo nano /etc/ansible/hosts
[local]
192.168.122.4 ansible_ssh_user=astra
[client]
192.168.122.5 ansible_ssh_user=baranovv-client
nano first_playbook.yml (на серваке и клиенте)
---
- hosts: all
become: true # Добавлено для повышения прав
tasks:
- name: Установить пакет curl
apt:
name: curl
sudo nano /etc/ssh/sshd_config
Port 22 AddressFamily any ListenAddress 0.0.0.0 ListenAddress :: PermitRootLogin yes PubkeyAuthentication yes PasswordAuthentication yes
(далее нужно будет поработать с правами доступа) лично у меня.
На клиенте
sudo visudo
baranovv-client ALL=(ALL) NOPASSWD: ALL
На серваке
ssh-copy-id astra@192.168.122.4
(раздал ключи ssh)
ansible-playbook first_playbook.yml --become
Вот такое должно быть
Если нет то сделайте на клиенте (и клиент должен заработать)
sudo rm -f /var/lib/dpkg/lock
sudo rm -f /var/cache/apt/archives/lock
sudo rm -f /var/lib/apt/lists/lock
sudo apt-get clean
sudo apt-get update
sudo apt-get install python-apt -y
ansible all -m ping
Клиент
Sudo nano /etc/ansible/hosts
[all]
192.168.122.4 ansible_user=astra
192.168.122.5 ansible_user=astra
(на сервере)
ssh-keyscan 192.168.122.4 >> ~/.ssh/known_hosts
ssh-keyscan 192.168.122.5 >> ~/.ssh/known_hosts
state: presentПроверьте доступность всех устройств с помощью команды ping используя запуск скрипта ansible
nano inventory.ini
[servers]
192.168.122.4
[clients]
192.168.122.5
192.168.122.6
ansible all -i inventory.ini -m ping
Используя ansible, запустите на машине клиента скрипт, выводящий объем свободной оперативной машины
1)Создайте playbook, выполняющий следующие задания: Создайте директории ServerВАШИИНИЦИАЛЫ на сервере и ClientВАШИИНИЦИАЛЫ на машине клиента соответственно. Данные директории создаются в домашней директории пользователя.
nano create_directories.yml
---
- name: Create directories on server and client
hosts: all
become: yes # Для выполнения команд с правами суперпользователя (если нужно)
tasks:
- name: Create directory on the server
when: inventory_hostname == "192.168.122.4" # Условие для выполнения на сервере
file:
path: "/home/astra/Serverbaranovv"
state: directory
mode: '0755'
- name: Create directory on the client
when: inventory_hostname in ["192.168.122.5", "192.168.122.6"] # Условие для выполнения на клиентах
file:
path: "/home/astra/Clientbaranovv"
state: directory
mode: '0755'
ansible-playbook -i inventory.ini create_directories.yml
Вайбуем (работает)
2)Создайте файлы с названием info в домашней директории. Добавьте проверку на существование файла. В случае его наличия файл повторно не создается.
nano create_info_file.yml
---
- name: Create directories and info file in home directory
hosts: all
become: yes # Для выполнения команд с правами суперпользователя (если необходимо)
tasks:
- name: Create Server baranovv directory on server
file:
path: "/home/astra/Serverbaranovv"
state: directory
mode: '0755'
- name: Create Client baranovv directory on client
file:
path: "/home/astra/Clientbaranovv"
state: directory
mode: '0755'
- name: Check if the info file exists
stat:
path: "/home/astra/info"
register: file_stat
- name: Create the info file if it does not exist
file:
path: "/home/astra/info"
state: touch # Это создаст файл, если его нет
mode: '0644'
when: file_stat.stat.exists == false
ansible-playbook -i inventory.ini create_info_file.yml
4.
3)Заполните данные файлы информацией о системе, включающей в себя имя машины, вашу фамилию, ip адрес, объем занятой оперативной памяти (в Mb), среднюю нагрузку на последние 15 минут работы (см. файл /proc/loadavg). Формат записи: astra001 | Ivanov | 192.168.122.1 | 722 | 1.58
Обновил код
nano create_info_file.yml
---
- name: Create and fill info file in home directory
hosts: all
become: yes # Для выполнения команд с правами суперпользователя (если необходимо)
tasks:
- name: Check if the info file exists
stat:
path: "/home/astra/info"
register: file_stat
- name: Create the info file if it does not exist
file:
path: "/home/astra/info"
state: touch # Это создаст файл, если его нет
mode: '0644'
when: file_stat.stat.exists == false
- name: Gather system information
command: hostname
register: hostname_info
- name: Get IP address
command: hostname -I
register: ip_info
- name: Get memory usage
command: free -m | awk 'NR==2{printf "%s", $3}'
register: memory_info
- name: Get load average
command: awk '{print $2}' /proc/loadavg
register: load_info
- name: Write system information to the info file
lineinfile:
path: "/home/astra/info"
line: "{{ hostname_info.stdout }} | Baranovv | {{ ip_info.stdout }} | {{ memory_info.stdout }} | {{ load_info.stdout }}"
state: present
ansible-playbook -i inventory.ini create_info_file.yml
Проверка cat /home/astra/info
4)Скопируйте данный файл в созданную в п. 1.1 директорию.
изменил код ---
- name: Create and fill info file in home directory
hosts: all
become: yes # Для выполнения команд с правами суперпользователя (если необходимо)
tasks:
- name: Check if the info file exists
stat:
path: "/home/astra/info"
register: file_stat
- name: Create the info file if it does not exist
file:
path: "/home/astra/info"
state: touch # Это создаст файл, если его нет
mode: '0644'
when: file_stat.stat.exists == false
- name: Gather system information
command: hostname
register: hostname_info
- name: Get IP address
command: hostname -I
register: ip_info
- name: Get memory usage
command: free -m | awk 'NR==2{printf "%s", $3}'
register: memory_info
- name: Get load average
command: awk '{print $2}' /proc/loadavg
register: load_info
- name: Write system information to the info file
lineinfile:
path: "/home/astra/info"
line: "{{ hostname_info.stdout }} | Baranovv | {{ ip_info.stdout }} | {{ memory_info.stdout }} | {{ load_info.stdout }}"
state: present
- name: Create Server and Client directories
file:
path: "/home/astra/ServerBaranovv"
state: directory
mode: '0755'
when: inventory_hostname == '192.168.122.4'
- name: Create Client directory
file:
path: "/home/astra/ClientBaranovv"
state: directory
mode: '0755'
when: inventory_hostname in ['192.168.122.5', '192.168.122.6']
- name: Copy info file to Server directory
copy:
src: "/home/astra/info"
dest: "/home/astra/ServerBaranovv/info"
when: inventory_hostname == '192.168.122.4'
- name:
ansible-playbook -i inventory.ini create_info_file.yml
cat
/home/astra/ServerBaranovv/info
5)Измените в перемещенном файле значение вашей фамилии на ваше имя.
В зависимости от значения нагрузки в файле выведите сообщение на экран. Если нагрузка больше 1: state NAME_MACHINE bad. Если меньше 1, то state NAME_MACHINE good.
Изменил код
---
- name: Create and fill info file in home directory
hosts: all
become: yes # Для выполнения команд с правами суперпользователя (если необходимо)
tasks:
- name: Check if the info file exists
stat:
path: "/home/astra/info"
register: file_stat
- name: Create the info file if it does not exist
file:
path: "/home/astra/info"
state: touch # Это создаст файл, если его нет
mode: '0644'
when: file_stat.stat.exists == false
- name: Gather system information
command: hostname
register: hostname_info
- name: Get IP address
command: hostname -I
register: ip_info
- name: Get memory usage
command: free -m | awk 'NR==2{printf "%s", $3}'
register: memory_info
- name: Get load average
command: awk '{print $2}' /proc/loadavg
register: load_info
- name: Write system information to the info file
lineinfile:
path: "/home/astra/info"
line: "{{ hostname_info.stdout }} | Baranovv | {{ ip_info.stdout }} | {{ memory_info.stdout }} | {{ load_info.stdout }}"
state: present
- name: Create Server and Client directories
file:
path: "/home/astra/ServerBaranovv"
state: directory
mode: '0755'
when: inventory_hostname == '192.168.122.4'
- name: Create Client directory
file:
path: "/home/astra/ClientBaranovv"
state: directory
mode: '0755'
when: inventory_hostname in ['192.168.122.5', '192.168.122.6']
- name: Copy info file to Server directory
copy:
src: "/home/astra/info"
dest: "/home/astra/ServerBaranovv/info"
when: inventory_hostname == '192.168.122.4'
- name: Copy info file to Client directory
copy:
src: "/home/astra/info"
dest: "/home/astra/ClientBaranovv/info"
when: inventory_hostname in ['192.168.122.5', '192.168.122.6']
- name: Replace surname with first name in the info file
replace:
path: "/home/astra/ClientBaranovv/info"
regexp: 'Baranovv'
replace: 'Ivan'
when: inventory_hostname in ['192.168.122.5', '192.168.122.6']
- name: Check load average and output state
debug:
msg: "state {{ hostname_info.stdout }} {{ 'bad' if load_info.stdout | float > 1 else 'good' }}"
ansible-playbook -i inventory.ini create_info_file.yml
Команда для проигрывания сценариев: Команда для запуска Playbook в Ansible — это ansible-playbook. Например:
bash
ansible-playbook -i inventory.ini playbook.yml
Ключ в play для указания хостов: Ключ, в котором указываются хосты для выполнения заданий (task) в Playbook, называется hosts. Например:
yaml
- name: My Play
hosts: all
Как выполнять задания с привилегиями администратора: Чтобы задания в сценарии выполнялись с привилегиями администратора, необходимо использовать ключ become: yes в Playbook. Это позволит использовать sudo для выполнения команд с повышенными правами. Например:
yaml
- name: My Play
hosts: all
become: yes # Включение повышения привилегий
Эти пункты являются основами работы с Ansible и позволяют эффективно управлять хостами в вашей инфраструктуре.