User Tools

Site Tools


сервис_ansible

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
сервис_ansible [2022/09/22 11:02]
val [Пример 1]
сервис_ansible [2024/03/25 06:40]
val [Роль настроенного через ifupdown узла сети]
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' 
  
 +kube1# ansible kubes -a 'sed -i""​ -e "/​swap/​s/​^/#/"​ /​etc/​fstab'​
 +kube1# ansible kubes -a '​swapoff -a'
 +  ИЛИ
 +(venv1) server# ansible all -a 'sed -i""​ -e "/​swap/​s/​^/#/"​ /​etc/​fstab'​ -i /​root/​kubespray/​inventory/​mycluster/​hosts.yaml #​--limit=kube4
 +(venv1) server# ansible all -a '​swapoff -a' -i /​root/​kubespray/​inventory/​mycluster/​hosts.yaml #​--limit=kube4
  
 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'​
Line 112: Line 119:
  
 server# ansible nodes -f 3 -m apt -a '​pkg=openvpn 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=absent ​update_cache=true'​+server# ansible nodes -f 3 -m apt -a '​pkg=docker.io state=present ​update_cache=true'​
  
  
Line 138: Line 145:
  
 λ touch provision_docker.yml λ touch 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 212: Line 223:
  
 </​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 224: Line 240:
 - 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 251: Line 268:
 #          - 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 349: Line 367:
 </​code>​ </​code>​
 ===== Использование handlers ===== ===== Использование handlers =====
 +
 +==== Пример 1 ====
  
   * [[Сервис HTTP#​Использование домашних каталогов]]   * [[Сервис HTTP#​Использование домашних каталогов]]
Line 372: Line 392:
 </​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 380: Line 429:
  
 <​code>​ <​code>​
 +# ###cd /root/conf/
 +# ###git pull origin master
 +# ###cd /​root/​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
 +#  hosts: all
   roles:   roles:
     - node     - node
Line 392: Line 447:
 </​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 439: Line 495:
 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 450: Line 507:
         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 455: Line 513:
   ИЛИ   ИЛИ
  
-# ansible-playbook -f 5 conf/​ansible/​roles/​nodes.yml+# ansible-playbook -f 5 /root/conf/​ansible/​roles/​nodes.yml 
 + 
 +  ИЛИ 
 + 
 +(venv1) server# ansible-playbook -f 5 /​root/​conf/​ansible/​roles/​nodes.yml -i /​root/​kubespray/​inventory/​mycluster/​hosts.yaml #​--limit=kube4
 </​code>​ </​code>​
  
Line 474: Line 536:
 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 483: Line 545:
 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"​ 
-#push "​dhcp-option DNS 192.168.X.10"​+#push "​dhcp-option DNS 192.168.{{X}}.10"
 #push "​block-outside-dns"​ #push "​block-outside-dns"​
 +#push "​dhcp-option DOMAIN corp{{X}}.un"​
  
 dh /​etc/​openvpn/​dh2048.pem dh /​etc/​openvpn/​dh2048.pem
Line 534: Line 597:
     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 547: Line 610:
 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 573: Line 637:
       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 606: Line 674:
   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><​code>​
 +client1:​~/​ansible-pull-gpo#​ ansible-playbook local.yml
 +</​code>​
 +
 +  * [[Инструмент GitLab]] (Создать публичный проект без readme и скопировать подсказки)
 +
 +<​code>​
 +client3:~# ###​ansible-pull -U http://​gate.corpX.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.corpX.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.corpX.un/​user1/​ansible-pull-gpo.git -C $BR 2>&1 | /​usr/​bin/​logger -t ansible-pull"​ | crontab -
 +
 +init 6
 +</​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]]
  
 ====== Дополнительные материалы ====== ====== Дополнительные материалы ======
сервис_ansible.txt · Last modified: 2024/04/22 16:45 by val