This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
сервис_ansible [2022/08/15 17:09] val [Роль OpenVPN сервера] |
сервис_ansible [2023/11/12 13:20] (current) val [Настройка групп управляемых систем] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Сервис Ansible ====== | ====== Сервис Ansible ====== | ||
+ | |||
+ | * Управление инфраструктурой на примере [[https://ru.wikipedia.org/wiki/Ansible|Аnsible - wikipedia]] | ||
* [[https://habrahabr.ru/company/express42/blog/254959/|Ansible — давайте попробуем]] | * [[https://habrahabr.ru/company/express42/blog/254959/|Ansible — давайте попробуем]] | ||
- | * [[https://habrahabr.ru/post/195048/|Ansible]] | ||
* [[https://habrahabr.ru/post/305400/|Пособие по Ansible]] | * [[https://habrahabr.ru/post/305400/|Пособие по Ansible]] | ||
+ | * [[https://habr.com/ru/post/508762/|Основы Ansible, без которых ваши плейбуки — комок слипшихся макарон]] | ||
* [[https://www.cisco.com/c/dam/m/ru_ru/training-events/2019/cisco-connect/pdf/introduction_automation_with_ansible_idrey.pdf|Введение в автоматизацию с помощью Ansible (Cisco)]] | * [[https://www.cisco.com/c/dam/m/ru_ru/training-events/2019/cisco-connect/pdf/introduction_automation_with_ansible_idrey.pdf|Введение в автоматизацию с помощью Ansible (Cisco)]] | ||
Line 66: | Line 68: | ||
ansible_ssh_user=vagrant | ansible_ssh_user=vagrant | ||
ansible_ssh_pass=strongpassword | ansible_ssh_pass=strongpassword | ||
+ | #ansible_sudo_pass=strongpassword | ||
ansible_become=yes | ansible_become=yes | ||
</code> | </code> | ||
Line 77: | Line 80: | ||
</code><code> | </code><code> | ||
[defaults] | [defaults] | ||
- | ... | + | #... |
host_key_checking = False | host_key_checking = False | ||
- | ... | + | #... |
</code> | </code> | ||
Line 104: | Line 107: | ||
node1# ansible corpX -m command -a 'uname -a' | node1# ansible corpX -m command -a 'uname -a' | ||
- | node1# ansible corpX -a 'uname -a' | + | # ansible kubes -a 'sed -i"" -e "/swap/s/^/#/" /etc/fstab' |
+ | # ansible kubes -a 'swapoff -a' | ||
node1# ansible corpX -f 2 -m apt -a 'pkg=apache2 state=present update_cache=true' | node1# ansible corpX -f 2 -m apt -a 'pkg=apache2 state=present update_cache=true' | ||
node1# ansible addnodes -vv -f 5 -m apt -a 'pkg=ceph,tgt-rbd state=present update_cache=true' | node1# ansible addnodes -vv -f 5 -m apt -a 'pkg=ceph,tgt-rbd state=present update_cache=true' | ||
+ | |||
+ | server# ansible nodes -f 3 -m apt -a 'pkg=openvpn state=present update_cache=true' | ||
+ | server# ansible nodes -f 3 -m apt -a 'pkg=docker.io state=present update_cache=true' | ||
+ | |||
ubuntu20# apt install python3-paramiko | ubuntu20# apt install python3-paramiko | ||
Line 124: | Line 133: | ||
==== Пример 1 ==== | ==== Пример 1 ==== | ||
+ | |||
+ | * [[Технология Docker]] | ||
+ | |||
<code> | <code> | ||
- | # cat provision_docker.yml | + | server# cat provision_docker.yml |
+ | |||
+ | или | ||
+ | |||
+ | λ touch provision_docker.yml | ||
или | или | ||
- | λ npp provision_docker.yml & | + | student@node1:~$ cat /vagrant/provision_docker.yml |
</code><code> | </code><code> | ||
- hosts: "{{ variable_host | default('all') }}" | - hosts: "{{ variable_host | default('all') }}" | ||
Line 164: | Line 180: | ||
state: present | state: present | ||
update_cache: true | update_cache: true | ||
- | </code><code> | + | </code> |
- | gate# ansible-playbook provision_docker.yml | + | |
+ | * Технология Vagrant: [[Технология Vagrant#Provision с использованием ansible]] | ||
+ | |||
+ | <code> | ||
+ | server# ansible-playbook provision_docker.yml | ||
- | gate# ansible-playbook provision_docker.yml -i inv_file.ini | + | server# ansible-playbook provision_docker.yml --extra-vars "variable_host=nodes" |
- | gate# ansible-playbook provision_docker.yml -e "ansible_python_interpreter=/usr/bin/python3" -i 192.168.X.1:2222, | + | server# ansible-playbook provision_docker.yml --extra-vars "variable_host=localhost" |
- | gate# ansible-playbook provision_docker.yml --extra-vars "variable_host=corp" | + | server# ansible-playbook provision_docker.yml -i inv_file.ini |
- | gate# ansible-playbook provision_docker.yml --extra-vars "variable_host=localhost" | + | server# ansible-playbook provision_docker.yml -e "ansible_python_interpreter=/usr/bin/python3" -i 192.168.X.1:2222, |
</code> | </code> | ||
==== Пример 2 ==== | ==== Пример 2 ==== | ||
Line 200: | Line 220: | ||
</code><code> | </code><code> | ||
+ | node1# ansible-playbook addusers.yml --syntax-check | ||
+ | |||
+ | node1# apt install ansible-lint | ||
+ | node1# ansible-lint addusers.yml | ||
+ | |||
node1# ansible-playbook addusers.yml | node1# ansible-playbook addusers.yml | ||
</code> | </code> | ||
Line 212: | Line 237: | ||
- hosts: sws | - hosts: sws | ||
connection: local | connection: local | ||
+ | gather_facts: no | ||
tasks: | tasks: | ||
- name: configure top level configuration | - name: configure top level configuration | ||
ios_config: | ios_config: | ||
lines: | lines: | ||
- | - ip host server 192.168.X.10 | ||
- | |||
- | - snmp-server host server writetrap | ||
- snmp-server community write RW | - snmp-server community write RW | ||
+ | | ||
+ | # - ip host server 192.168.X.10 | ||
+ | # - snmp-server host server writetrap | ||
# - snmp-server enable traps config | # - snmp-server enable traps config | ||
Line 239: | Line 265: | ||
# - enable secret cisco | # - enable secret cisco | ||
# - aaa authorization console | # - aaa authorization console | ||
+ | |||
# - aaa authentication login default local | # - aaa authentication login default local | ||
# - aaa authorization exec default local | # - aaa authorization exec default local | ||
Line 337: | Line 364: | ||
</code> | </code> | ||
===== Использование handlers ===== | ===== Использование handlers ===== | ||
+ | |||
+ | ==== Пример 1 ==== | ||
* [[Сервис HTTP#Использование домашних каталогов]] | * [[Сервис HTTP#Использование домашних каталогов]] | ||
Line 360: | Line 389: | ||
</code> | </code> | ||
+ | ==== Пример 2 ==== | ||
+ | |||
+ | <code> | ||
+ | server# cat za.conf | ||
+ | </code><code> | ||
+ | ListenIP=0.0.0.0 | ||
+ | StartAgents=0 | ||
+ | ServerActive=server | ||
+ | UserParameter=listinstalledsoft,ls /usr/share/applications | awk -F '.desktop' ' { print $1}' - | ||
+ | </code><code> | ||
+ | node1# cat za.yml | ||
+ | </code><code> | ||
+ | - hosts: lin_ws | ||
+ | tasks: | ||
+ | - name: Install zabbix agent | ||
+ | apt: pkg=zabbix-agent state=present update_cache=true | ||
+ | |||
+ | - name: Create conf file | ||
+ | copy: src=za.conf dest=/etc/zabbix/zabbix_agentd.conf.d/za.conf | ||
+ | notify: | ||
+ | - restart za | ||
+ | |||
+ | handlers: | ||
+ | - name: restart za | ||
+ | service: name=zabbix-agent state=restarted | ||
+ | </code><code> | ||
+ | server# ansible-playbook za.yml | ||
+ | </code> | ||
===== Использование ролей ===== | ===== Использование ролей ===== | ||
* [[https://rtfm.co.ua/ansible-roli-roles-primer/|Ansible: роли (roles) – пример]] | * [[https://rtfm.co.ua/ansible-roli-roles-primer/|Ansible: роли (roles) – пример]] | ||
+ | * [[https://andreyex.ru/linux/ansible-roli-v-ansible/|Ansible. Роли в Ansible]] | ||
* [[Настройка стендов слушателей#Ansible конфигурация]] | * [[Настройка стендов слушателей#Ansible конфигурация]] | ||
Line 368: | Line 426: | ||
<code> | <code> | ||
+ | # ###cd conf/ansible/roles/ | ||
+ | |||
# cat nodes.yml | # cat nodes.yml | ||
</code><code> | </code><code> | ||
- name: Network config for nodes | - name: Network config for nodes | ||
hosts: addnodes | hosts: addnodes | ||
+ | # hosts: kubes | ||
roles: | roles: | ||
- node | - node | ||
Line 380: | Line 441: | ||
</code><code> | </code><code> | ||
name_prefix: node | name_prefix: node | ||
+ | #name_prefix: kube | ||
X: "{{ ansible_eth0.ipv4.address.split('.')[2] }}" | X: "{{ ansible_eth0.ipv4.address.split('.')[2] }}" | ||
- | N: "{{ ansible_eth0.ipv4.address.split('.')[3] }}" | + | N: "{{ ansible_eth0.ipv4.address.split('.')[3][-1] }}" |
</code><code> | </code><code> | ||
# cat node/tasks/main.yml | # cat node/tasks/main.yml | ||
Line 427: | Line 489: | ||
nameserver 192.168.{{ X }}.1 | nameserver 192.168.{{ X }}.1 | ||
nameserver 192.168.{{ X }}.2 | nameserver 192.168.{{ X }}.2 | ||
+ | #nameserver 192.168.{{ X }}.10 | ||
</code><code> | </code><code> | ||
# cat node/templates/interfaces.j2 | # cat node/templates/interfaces.j2 | ||
Line 438: | Line 501: | ||
netmask 255.255.255.0 | netmask 255.255.255.0 | ||
gateway 192.168.{{ X }}.254 | gateway 192.168.{{ X }}.254 | ||
+ | # gateway 192.168.{{ X }}.1 | ||
</code><code> | </code><code> | ||
# ansible-playbook -f 5 nodes.yml | # ansible-playbook -f 5 nodes.yml | ||
Line 456: | Line 520: | ||
server:~/openvpn1/openvpn1/files# | server:~/openvpn1/openvpn1/files# | ||
</code> | </code> | ||
- | * В текущем каталоге выполняем и сохраняем файлы из тем [[Пакет OpenSSL#Создание параметра DH]] и [[Пакет OpenSSL#Создание самоподписанного сертификата]] (не указываем AltName и Common Name) | + | * В текущем каталоге выполняем и сохраняем файлы из тем [[Пакет OpenSSL#Создание параметра DH]] и [[Пакет OpenSSL#Создание самоподписанного сертификата]] (не указываем AltName, Common Name: server - достаточно) |
<code> | <code> | ||
server:~/openvpn1/openvpn1/files# ls | server:~/openvpn1/openvpn1/files# ls | ||
Line 462: | Line 526: | ||
dh2048.pem server.crt server.key | dh2048.pem server.crt server.key | ||
</code><code> | </code><code> | ||
- | server:~/openvpn1/openvpn1/files# cd - | + | server:~/openvpn1/openvpn1/files# cd ../../ |
server:~/openvpn1# cat openvpn1/templates/openvpn1.conf.j2 | server:~/openvpn1# cat openvpn1/templates/openvpn1.conf.j2 | ||
Line 471: | Line 535: | ||
server {{node_nets[ansible_hostname]}} 255.255.255.0 | server {{node_nets[ansible_hostname]}} 255.255.255.0 | ||
- | push "route 192.168.X.0 255.255.255.0" | + | push "route 192.168.{{X}}.0 255.255.255.0" |
- | status /var/log/openvpn1-status.log | + | #push "dhcp-option DNS 192.168.{{X}}.10" |
+ | #push "block-outside-dns" | ||
+ | #push "dhcp-option DOMAIN corp{{X}}.un" | ||
dh /etc/openvpn/dh2048.pem | dh /etc/openvpn/dh2048.pem | ||
key /etc/ssl/private/server.key | key /etc/ssl/private/server.key | ||
ca /etc/ssl/certs/server.crt | ca /etc/ssl/certs/server.crt | ||
cert /etc/ssl/certs/server.crt | cert /etc/ssl/certs/server.crt | ||
- | plugin /usr/lib/x86_64-linux-gnu/openvpn/plugins/openvpn-plugin-auth-pam.so login | + | |
verify-client-cert none | verify-client-cert none | ||
+ | plugin /usr/lib/x86_64-linux-gnu/openvpn/plugins/openvpn-plugin-auth-pam.so login | ||
username-as-common-name | username-as-common-name | ||
+ | #duplicate-cn | ||
+ | |||
+ | status /var/log/openvpn1-status.log | ||
management 0.0.0.0 7505 | management 0.0.0.0 7505 | ||
Line 516: | Line 587: | ||
name: openvpn@openvpn1 | name: openvpn@openvpn1 | ||
enabled: yes | enabled: yes | ||
- | state: started | + | # state: started |
</code><code> | </code><code> | ||
server:~/openvpn1# cat openvpn1/handlers/main.yml | server:~/openvpn1# cat openvpn1/handlers/main.yml | ||
Line 529: | Line 600: | ||
all: | all: | ||
vars: | vars: | ||
+ | X: "{{ ansible_eth1.ipv4.address.split('.')[2] }}" | ||
ansible_python_interpreter: "/usr/bin/python3" | ansible_python_interpreter: "/usr/bin/python3" | ||
ansible_ssh_user: vagrant | ansible_ssh_user: vagrant | ||
Line 555: | Line 627: | ||
when: node_nets[ansible_hostname] is defined | when: node_nets[ansible_hostname] is defined | ||
</code><code> | </code><code> | ||
+ | server:~# wget https://val.bmstu.ru/unix/conf.git/conf/ansible/roles/openvpn1.tgz && tar -xvzf openvpn1.tgz && cd openvpn1 | ||
+ | |||
server:~/openvpn1# ansible-playbook openvpn1.yaml -i inventory.yaml -e "variable_host=test_nodes" | server:~/openvpn1# ansible-playbook openvpn1.yaml -i inventory.yaml -e "variable_host=test_nodes" | ||
- | server:~/openvpn1# ansible-playbook openvpn1.yaml -i inventory.yaml | + | server:~/openvpn1# ansible-playbook openvpn1.yaml -i inventory.yaml # можно через GitLab CI/CD |
server:~/openvpn1# ansible-playbook openvpn1.yaml -i inventory.yaml -e "variable_host=all" | server:~/openvpn1# ansible-playbook openvpn1.yaml -i inventory.yaml -e "variable_host=all" | ||
</code> | </code> | ||
+ | |||
+ | * [[Сервисы Gateway и routing#Управление таблицей маршрутизации]] | ||
==== Фрагмент роли с условиями и отладкой ==== | ==== Фрагмент роли с условиями и отладкой ==== | ||
Line 588: | Line 664: | ||
debug: | debug: | ||
msg: octet4 is {{ octet4 }}, X is {{ X }}, hostname is {{hostname}} | msg: octet4 is {{ octet4 }}, X is {{ X }}, hostname is {{hostname}} | ||
+ | | ||
+ | #- meta: end_play | ||
+ | |||
... | ... | ||
</code> | </code> | ||
+ | |||
+ | ==== ansible-pull ==== | ||
+ | |||
+ | * [[https://medium.com/splunkuserdeveloperadministrator/using-ansible-pull-in-ansible-projects-ac04466643e8|Using Ansible Pull In Ansible Projects]] | ||
+ | * [[Инсталяция системы в конфигурации Desktop]] | ||
+ | * [[Переменные окружения]] | ||
+ | |||
+ | === Вариант 1 === | ||
+ | |||
+ | <code> | ||
+ | client1:~/ansible-pull-gpo# cat thunderbird/tasks/main.yml | ||
+ | </code><code> | ||
+ | - name: Install Thunderbird | ||
+ | apt: pkg=thunderbird state=present update_cache=true | ||
+ | </code><code> | ||
+ | client1:~/ansible-pull-gpo# cat proxy/files/etc/environment | ||
+ | </code><code> | ||
+ | #http_proxy=http://gate.corpX.un:3128 | ||
+ | https_proxy=http://gate.corpX.un:3128 | ||
+ | no_proxy=localhost,127.0.0.1,isp.un,corpX.un | ||
+ | </code><code> | ||
+ | client1:~/ansible-pull-gpo# cat proxy/tasks/main.yml | ||
+ | </code><code> | ||
+ | - name: Copy file environment | ||
+ | copy: | ||
+ | src: etc/environment | ||
+ | dest: /etc/environment | ||
+ | </code><code> | ||
+ | client1:~/ansible-pull-gpo# cat local.yml | ||
+ | </code><code> | ||
+ | - hosts: localhost | ||
+ | roles: | ||
+ | - role: proxy | ||
+ | - role: thunderbird | ||
+ | </code> | ||
+ | |||
+ | * [[Инструмент GitLab]] (Создать публичный проект без readme и скопировать подсказки) | ||
+ | |||
+ | <code> | ||
+ | client3:~# ansible-pull -U http://gate.corp13.un/user1/ansible-pull-gpo.git | ||
+ | </code><code> | ||
+ | client1:~/ansible-pull-gpo# cat start.sh | ||
+ | </code><code> | ||
+ | #!/bin/bash | ||
+ | |||
+ | apt update | ||
+ | apt install -y git ansible | ||
+ | |||
+ | echo -e "0 */2 * * * \ | ||
+ | /usr/bin/ansible-pull -s 120 -U http://gate.corp13.un/user1/ansible-pull-gpo.git -C $BR 2>&1 | /usr/bin/logger -t ansible-pull\n\ | ||
+ | @reboot sleep 1m; /usr/bin/ansible-pull -U http://gate.corp13.un/user1/ansible-pull-gpo.git -C $BR 2>&1 | /usr/bin/logger -t ansible-pull" | crontab - | ||
+ | </code> | ||
+ | |||
+ | * Инструмент GitLab [[Инструмент GitLab#Подключение через API]] | ||
+ | |||
+ | === Вариант 2 === | ||
+ | |||
+ | * [[Средства программирования shell#Использование диалоговых окон]] | ||
+ | |||
+ | <code> | ||
+ | $ cat ansible-pull-gpo\local.yml | ||
+ | </code><code> | ||
+ | - hosts: localhost | ||
+ | tasks: | ||
+ | |||
+ | - name: Set timezone to Europe/Moscow | ||
+ | timezone: | ||
+ | name: Europe/Moscow | ||
+ | |||
+ | - name: Russian Interface | ||
+ | shell: | | ||
+ | echo 'ru_RU.UTF-8 UTF-8' > /etc/locale.gen | ||
+ | locale-gen | ||
+ | echo LANG=ru_RU.UTF-8 > /etc/default/locale | ||
+ | when: CONF_RUS_INT is defined | ||
+ | |||
+ | - name: Install Firefox in Debian | ||
+ | apt: pkg=firefox-esr state=present update_cache=true | ||
+ | # debug: msg="Install Firefox in Debian" | ||
+ | when: ansible_distribution == 'Debian' | ||
+ | |||
+ | - name: Install Firefox in Ubuntu | ||
+ | apt: pkg=firefox state=present update_cache=true | ||
+ | # debug: msg="Install Firefox in Ubuntu" | ||
+ | when: ansible_distribution == 'Ubuntu' | ||
+ | |||
+ | - name: Install Thunderbird | ||
+ | apt: pkg=thunderbird state=present update_cache=true | ||
+ | when: PROG_THBIRD is defined | ||
+ | |||
+ | roles: | ||
+ | - role: zabbix_agent | ||
+ | when: ROLE_ZAB_AG is defined | ||
+ | |||
+ | - role: openvpn1_client | ||
+ | when: ROLE_OVPN1_CL is defined | ||
+ | </code><code> | ||
+ | client1:~# cat /usr/local/etc/gpo_options.yml | ||
+ | </code><code> | ||
+ | CONF_RUS_INT: | ||
+ | PROG_THBIRD: | ||
+ | ROLE_ZAB_AG: | ||
+ | </code><code> | ||
+ | client1:~# /usr/bin/ansible-pull -U http://server.corp13.un/student/ansible-pull-gpo.git -C test -e @/usr/local/etc/gpo_options.yml | ||
+ | </code> | ||
+ | |||
+ | * [[Планирование выполнения заданий в Linux#Сервис cron]] | ||
====== Дополнительные материалы ====== | ====== Дополнительные материалы ====== |