PDA

Просмотр полной версии : Ansible: Революция в Управлении Инфраструктурой — От Новичка до Мастера Автоматизации


Runinterface
14.07.2017, 12:03
Доброго времени суток %username%.
Хотел рассказать о таком ПО как ansible. Ansible является отличным инструментом, для управления одного или нескольких серверов или выполнять на них определенных действий.
В примере у нас будет мой десктоп
PC1 = 192.168.1.1
И виртуальная машина, исполняющая роль "сервера".
VM1 = 192.168.1.2
Поехали:
1. Установка и первоначальная настройка:
1.1 Можно установить из репозитория вашей системы если есть:
sudo apt-get install ansible
1.2 По умолчанию ansible создает файлы конфигурации и файлы для исполнения в /etc/ansible
но вы можете разместить файлы исполнения где вам удобно.
1.3 cd /etc/ansible && ls -la
ansible.cfg - основной конфигурационный файл ansible.
hosts - файл в котором мы описываем хосты к которым мы будем подключаться (ansible ипользует ssh).
1.4 vim /etc/asnible/hosts
Там имеется закоментированное описание того как создавать хосты.
#[ ] в таких скобках указывается группа хостов.
# далее идут сами хосты ИМЯ ansible_....параметры.

Код:



[VM]
VM1 ansible_ssh_host=192.168.1.2 ansible_ssh_password=$SSHPASS ansible_sudo_pass=$SSHPASS


#Если у вас в /etc/hosts или в ~/.ssh/config не прописаны значения для VM1 то указываем их тут в файле hosts.
#$SSHPASS познакомьтесь это переменная окружения документация ansible не советует держать пароль а открытом виде в целях безопасности, но вы можете это делать.
#Заводим переменную окружения export SSHPASS=yourpassw0rd, так же можно использовать ssh ключи параметр: ansible_ssh_private_key_file=/path/to/file.
#Так как нам понадобится исполнять комманды от привелигированного пользователя, то нужно разрешить sudo без пароля на сервере, либо указать ansible_sudo_pass=$SSHPASS как это сделал я.
##Как делается sudo без пароля: vim /etc/sudoers.d/username с содержимым username ALL=(ALL:ALL) NOPASSWD:ALL

2. Playbook и как это работает:
Playbook`s пишется в формате .yml с соответствующему убогости синтаксиса YAML.
Напишем простенький "плейбук" vim test.yml (в YAML запрещена табуляция, только пробелы)

Код:



- hosts: VM1
tasks:
- name: LISTDIR
command: ls -la


2.1 Стартуем:
ansible-playbook test.yml

3. Заключение:
Возможности Ansible безграничны, он имеет огромное количество модулей для выполнения каких то определенных задач, но никто не отменял обычный shell. Всего что есть в Ansible не расскажешь и не покажешь, настолько много всего. Я взял этот инструмент на вооружение, и избавился от рутины добавлений пользователей на сервере, теперь задачи которые занимали 10 минут, могут занимать до минуты и выполнены они будет одно-двумя командами. Особенно подойдет тем у кого есть пул серверов, более 10.
По мимо чего то простого как в моем примере, так же можно реализовать что-то по сложнее:
Автоматизация процесса деплоев.
Автоматизация процесса разворачивания окружений, притом любых.
И т.д....
За дополнительной информацией если вам таковая интересна можете посетить официальную документацию:
http://docs.ansible.com/ansible/intro.html
Playbook: http://docs.ansible.com/ansible/playbooks.html
Modules: http://docs.ansible.com/ansible/modules.html
YAML: http://docs.ansible.com/ansible/YAMLSyntax.html

Всем спасибо.
Добро пожаловать в мир, где вы сделали все, что бы ничего не делать.

Вованчик123
21.05.2025, 23:59
Код:



---------------------------------------ISP-----------------------------------------------------
root@isp:~# cat /etc/network/interfaces
source /etc/network/interfaces.d/*
auto ens18
iface ens18 inet dhcp
post-up iptables -t nat -I POSTROUTING -o ens18 -j MASQUERADE
post-down iptables -t nat -F
auto ens19
iface ens19 inet static
address 172.16.4.1/28
auto ens20
iface ens20 inet static
address 172.16.5.1/28
systemctl restart networking
apt install iptables
hostnamectl set-hostname isp.au-team.irpo
timedatectl set-timezone Europe/Moscow
nano /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
reboot
---------------------------------------HQ-RTR-----------------------------------------------------
root@hq-rtr:~# cat /etc/network/interfaces
source /etc/network/interfaces.d/*
auto ens18
iface ens18 inet static
address 172.16.4.2/28
gateway 172.16.4.1
post-up iptables -t nat -I POSTROUTING -o ens18 -j MASQUERADE
post-down iptables -t nat -F
#auto ens19
#iface ens19 inet manual
auto ens19.100
iface ens19.100 inet static
address 192.168.100.1/29
vlan-raw-device ens19
auto ens19.200
iface ens19.200 inet static
address 192.168.200.1/29
vlan-raw-device ens19
auto ens19.999
iface ens19.999 inet static
address 192.168.99.1/30
vlan-raw-device ens19
auto gre1
iface gre1 inet static
address 192.168.255.1
netmask 255.255.255.252
pre-up ip tunnel add gre1 mode gre remote 172.16.5.2 local 172.16.4.2 ttl 64 dev ens18
up ip link set gre1 up
post-down ip tunnel del gre1
post-up /bin/systemctl restart frr
systemctl restart networking
apt install iptables sudo frr dnsmasq
hostnamectl set-hostname hq-rtr.au-team.irpo
timedatectl set-timezone Europe/Moscow
nano /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
reboot
useradd -m -s /bin/bash net_admin
echo net_admin:P@$$word | chpasswd (echo 'net_admin:P@$$word' | chpasswd)
nano /etc/sudoers
net_admin ALL=(ALL) NOPASSWD: ALL
nano /etc/frr/daemons
ospfd=yes
systemctl restart frr.service
vtysh
conf t
interface gre1
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 P@ssw0rd
ip ospf network point-to-point
exit
router ospf
passive-interface default
no passive-interface gre1
network 192.168.100.0/29 area 0
network 192.168.200.0/29 area 0
network 192.168.99.0/30 area 0
network 192.168.255.0/30 area 0
area 0 authentication message-digest
exit
do wr
exit
nano /etc/dnsmasq.conf
domain=au-team.irpo
interface=ens19.200
dhcp-range=192.168.200.2,192.168.200.6,24h
dhcp-option=1,255.255.255.248
dhcp-option=3,192.168.200.1
dhcp-option=6,192.168.100.2
dhcp-host=bc:24:11:84:40:b2,192.168.200.6
systemctl restart dnsmasq
nano /etc/systemd/resolved.conf
DNS=192.168.100.2 8.8.8.8
systemctl restart systemd-resolved
systemctl enable frr dnsmasq
---------------------------------------BR-RTR-----------------------------------------------------
root@br-rtr:~# cat /etc/network/interfaces
source /etc/network/interfaces.d/*
auto ens18
iface ens18 inet static
address 172.16.5.2/28
gateway 172.16.5.1
post-up iptables -t nat -I POSTROUTING -o ens18 -j MASQUERADE
post-down iptables -t nat -F
auto ens19
iface ens19 inet static
address 192.168.3.1/29
auto gre1
iface gre1 inet static
address 192.168.255.2
netmask 255.255.255.252
pre-up ip tunnel add gre1 mode gre remote 172.16.4.2 local 172.16.5.2 ttl 64 dev ens18
up ip link set gre1 up
post-down ip tunnel del gre1
post-up /bin/systemctl restart frr
systemctl restart networking
apt install iptables sudo frr
hostnamectl set-hostname br-rtr.au-team.irpo
timedatectl set-timezone Europe/Moscow
nano /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
reboot
useradd -m -s /bin/bash net_admin
echo net_admin:P@$$word | chpasswd
nano /etc/sudoers
net_admin ALL=(ALL) NOPASSWD: ALL
nano /etc/frr/daemons
ospfd=yes
systemctl restart frr.service
vtysh
conf t
interface gre1
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 P@ssw0rd
ip ospf network point-to-point
exit
router ospf
passive-interface default
no passive-interface gre1
network 192.168.3.0/29 area 0
network 192.168.255.0/30 area 0
area 0 authentication message-digest
exit
do wr
exit
nano /etc/systemd/resolved.conf
DNS=192.168.100.2 8.8.8.8
systemctl restart systemd-resolved
systemctl enable frr
---------------------------------------HQ_SRV-----------------------------------------------------
root@hq-srv:~# cat /etc/network/interfaces
source /etc/network/interfaces.d/*
auto ens18
iface ens18 inet static
address 192.168.100.2/29
gateway 192.168.100.1
systemctl restart networking
apt install sudo ssh bind9
hostnamectl set-hostname hq-srv.au-team.irpo
timedatectl set-timezone Europe/Moscow
reboot
useradd -u 1010 -m -s /bin/bash sshuser
echo sshuser:P@ssw0rd | chpasswd
nano /etc/sudoers
sshuser ALL=(ALL) NOPASSWD: ALL
cat /etc/ssh/banner.txt
Authorized access only
EOF
cat /etc/ssh/sshd_config.d/demo.conf
Port 2024
AllowUsers sshuser
MaxAuthTries 2
Banner /etc/ssh/banner.txt
EOF
systemctl restart sshd.service
cat /etc/bind/named.conf.options
options {
directory "/var/cache/bind";
allow-recursion { any; };
forwarders { 8.8.8.8; };
dnssec-validation auto;
listen-on { 127.0.0.1; 192.168.100.2; };
};
EOF
cat /etc/bind/named.conf.local
zone "au-team.irpo" {
type master;
file "/etc/bind/db.au-team.irpo";
};
zone "168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.168.192";
};
EOF
nano /etc/bind/db.au-team.irpo
$TTL 1d
$ORIGIN au-team.irpo.
@ IN SOA ns admin (
2025010100 ; Serial
1h ; Refresh
1m ; Retry
1d ; Expire
1d ; TTL
)
@ IN NS ns
ns IN A 192.168.100.2
hq-srv IN CNAME ns
hq-rtr IN A 192.168.100.1
hq-rtr IN A 192.168.200.1
hq-rtr IN A 192.168.99.1
br-rtr IN A 192.168.3.1
hq-cli IN A 192.168.200.6
br-srv IN A 192.168.3.2
moodle IN CNAME hq-rtr
wiki IN CNAME hq-rtr
nano /etc/bind/db.168.192
$TTL 2d
$ORIGIN 168.192.in-addr.arpa.
@ IN SOA ns.au-team.irpo admin.au-team.irpo. (
2025020820 ; Serial
1d ; Refresh
1h ; Retry
1d ; Expire
1d ) ; Negative Cache TTL
;
@ IN NS ns.au-team.irpo.
6.200 IN PTR hq-cli.au-team.irpo.
2.100 IN PTR hq-srv.au-team.irpo.
1.100 IN PTR hq-rtr.au-team.irpo.
1.200 IN PTR hq-rtr.au-team.irpo.
1.99 IN PTR hq-rtr.au-team.irpo.
named-checkconf
named-checkzone au-team.irpo /etc/bind/db.au-team.irpo
named-checkzone 168.192.in-addr.arpa /etc/bind/db.168.192
systemctl restart bind9 (named)
nano /etc/systemd/resolved.conf
DNS=192.168.100.2 8.8.8.8
systemctl restart systemd-resolved
systemctl enable ssh named
---------------------------------------BR-SRV-----------------------------------------------------
root@br-srv:~# cat /etc/network/interfaces
source /etc/network/interfaces.d/*
auto ens18
iface ens18 inet static
address 192.168.3.2/29
gateway 192.168.3.1
systemctl restart networking
apt install sudo ssh
hostnamectl set-hostname br-srv.au-team.irpo
timedatectl set-timezone Europe/Moscow
reboot
useradd -u 1010 -m -s /bin/bash sshuser
echo sshuser:P@ssw0rd | chpasswd
nano /etc/sudoers
sshuser ALL=(ALL) NOPASSWD: ALL
cat /etc/ssh/banner.txt
Authorized access only
EOF
cat /etc/ssh/sshd_config.d/demo.conf
Port 2024
AllowUsers sshuser
MaxAuthTries 2
Banner /etc/ssh/banner.txt
EOF
systemctl restart sshd.service (ssh)
nano /etc/systemd/resolved.conf
DNS=192.168.100.2 8.8.8.8
systemctl restart systemd-resolved
systemctl enable ssh
---------------------------------------HQ-CLI-----------------------------------------------------
root@br-srv:~# cat /etc/network/interfaces
source /etc/network/interfaces.d/*
auto ens18
iface ens18 inet dhcp
systemctl restart networking
hostnamectl set-hostname hq-cli.au-team.irpo
timedatectl set-timezone Europe/Moscow
reboot
nano /etc/systemd/resolved.conf
DNS=192.168.100.2 8.8.8.8
systemctl restart systemd-resolved
-----------------------------------------Файловое хранилище----------------------------------------
Убедиться, что диски есть и посмотреть их имена:
lsblk
Создать raid:
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
Посмотреть информацию о raid:
root@hq-srv:~# mdadm --detail /dev/md0
/dev/md0:
...
Raid Level : raid5
Raid Devices : 3
UUID : 9eee4466:2a562fe4:f0a4cea5:ab814e87
...
Сохранить конфигурацию в файл:
root@hq-srv:~# mdadm --detail --scan | tee /etc/mdadm/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=hq-srv.au-team.irpo:0 UUID=9eee4466:2a562fe4:f0a4cea5:ab814e87
root@hq-srv:~# cat /etc/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=hq-srv.au-team.irpo:0 UUID=9eee4466:2a562fe4:f0a4cea5:ab814e87
cp /etc/mdadm/mdadm.conf /etc/mdadm.conf
update-initramfs -u
Создание файловой системы:
mkfs.ext4 /dev/md0
Поиск UUID для fstab:
root@hq-srv:~# blkid
...
/dev/md0: UUID="fcbd9e71-1d2b-4c67-b2bb-36a53add0b91" BLOCK_SIZE="4096" TYPE="ext4"
...
echo "UUID=fcbd9e71-1d2b-4c67-b2bb-36a53add0b91 /raid ext4 defaults 0 0" >> /etc/fstab
root@hq-srv:~# mount -a
mount: /raid: mount point does not exist.
root@hq-srv:~# mkdir /raid
root@hq-srv:~# mount -a
root@hq-srv:~# ls /raid/
lost+found
root@hq-srv:~# df -h /raid/
Filesystem Size Used Avail Use% Mounted on
/dev/md0 2.0G 24K 1.9G 1% /raid
Удалить raid (не по заданию, а на всякий случай):
mdadm --stop /dev/md0
mdadm --zero-superblock /dev/md0
update-initramfs -u
# удалить из fstab
Настройте сервер сетевой файловой системы(nfs), в качестве папки общего доступа выберите /raid5/nfs, доступ для чтения и записи для всей сети в сторону HQ-CLI.
HQ-SRV
mkdir /raid/nfs
echo "/raid/nfs 192.168.200.0/29(rw,sync,crossmnt,fsid=0,no_subtree_check,wdelay ,all_squash)" >> /etc/exports
systemctl restart nfs-server.service
На HQ-CLI настройте автомонтирование в папку /mnt/nfs.
HQ-CLI
mkdir /mnt/nfs
echo "192.168.100.2:/nfs /mnt/nfs nfs4 defaults 0 0" >> /etc/fstab
mount -a
-----------------------------------------CHRONY----------------------------------------
!)HQ-RTR
apt install chrony
systemctl enable chrony
nano /etc/chrony/chrony.conf
- pool 2.debian....
local stratum 5
allow 0/0
systemctl restart chronyd
!) На всех кроме ISP
apt install chrony
systemctl enable chrony
nano /etc/chrony/chrony.conf
Находим и меняем pool на pool hq-rtr iburst
systemctl restart chrony
chronyc tracking
-----------------------------------------ANSIBLE----------------------------------------
apt install python3-pip sshpass
pip install ansible-core
# или
python3 -m pip install ansible-core
ansible --version
nano /etc/ansible/hosts
hq-srv.au-team.irpo ansible_port=2024 ansible_user=sshuser ansible_password=P@ssw0rd
hq-cli.au-team.irpo ansible_user=user ansible_password=user
hq-rtr.au-team.irpo ansible_user=user ansible_password=user
br-rtr.au-team.irpo ansible_user=user ansible_password=user
nano /etc/ansible/ansible.cfg
[defaults]
interpreter_python = auto_silent
host_key_checking = False
ansible all -m ping
Доп:
открыть 22 порт на роутерах и на кли
на роутерах:
echo 'net_admin:P@$$word' | chpasswd
-----------------------------------------DockerMediaWiki----------------------------------------
apt-get install -y docker-engine docker-compose
systemctl enable --now docker
usermod root -aG docker
cd /home/user
nano wiki.yml
services:
wiki:
image: mediawiki
restart: always
ports:
- 8080:80
links:
- database
container_name: wiki
volumes:
- images:/var/www/html/images
# - ./LocalSettings.php:/var/www/html/LocalSettings.php
database:
image: mariadb
container_name: mariadb
restart: always
environment:
MYSQL_DATABASE: mediawiki
MYSQL_USER: wiki
MYSQL_PASSWORD: WikiP@ssw0rd
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
TZ: Europe/Moscow
volumes:
- db:/var/lib/mysql
volumes:
images:
db:
docker compose -f wiki.yml up -d
На HQ-CLI
Настроить и
scp -P 2024 /home/user/Загрузки/LocalSettings.php sshuser@10.2.2.1:/home/sshuser
nano wiki.yml
раскомментировать строку
docker compose -f wiki.yml up -d
-----------------------------------------ПРОБРОС-----------------------------------------------------------
BR-RTR
iptables -t nat -A PREROUTING -p tcp -i ens18 --dport 80 -j DNAT --to-destination 192.168.3.2:8080
iptables-save > /etc/sysconfig/iptables
systemctl restart iptables
BR-SRV
iptables -t nat -A PREROUTING -p tcp -i ens18 --dport 2024 -j DNAT --to-destination 192.168.100.2:2024
iptables -t nat -A PREROUTING -p tcp -i ens18 --dport 2024 -j DNAT --to-destination 192.168.3.2:2024
iptables-save > /etc/sysconfig/iptables
systemctl restart iptables