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
сервис_ansible [2020/05/23 20:17]
val [Использование шаблонов]
сервис_ansible [2024/03/25 10:43] (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)]]
 +  * [[https://​nwmichl.net/​2020/​02/​24/​first-simple-ansible-playbooks/​|First simple Ansible playbooks Cisco IOS]]
 +
  
-  * [[https://​www.opennet.ru/​base/​dev/​yaml.txt.html|Знакомимся с YAML (yaml config lib perl python ruby)]] 
-  * [[https://​www.jeffgeerling.com/​blog/​yaml-best-practices-ansible-playbooks-tasks|YAML best practices for Ansible playbooks - tasks]] 
-  * [[https://​stackoverflow.com/​questions/​50788277/​why-3-dashes-hyphen-in-yaml-file|why — (3 dashes/​hyphen) in yaml file?]] 
 ===== Установка на управляющей системе ===== ===== Установка на управляющей системе =====
 +
 +==== Из репозитория дистрибутива ====
 +
 <​code>​ <​code>​
 node1# apt install ansible node1# apt install ansible
 +
 +node1# ansible --version
 </​code>​ </​code>​
  
 +==== Из репозитория производителя ====
 +
 +  * [[https://​docs.ansible.com/​ansible/​latest/​installation_guide/​intro_installation.html#​installing-ansible-on-debian|Installing Ansible on Debian]]
 ===== Установка на управляемых системах ==== ===== Установка на управляемых системах ====
  
 <​code>​ <​code>​
 nodeN# apt install python python-apt nodeN# apt install python python-apt
 +
 +debian11/​ubuntu20#​ apt install python python3-apt
 </​code>​ </​code>​
  
Line 24: Line 35:
 ===== Настройка групп управляемых систем ===== ===== Настройка групп управляемых систем =====
  
-  * Определение групп управляемых систем ​+  * [[https://​nklya.medium.com/​%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5-%D0%B8%D0%BD%D0%B2%D0%B5%D0%BD%D1%82%D0%BE%D1%80%D0%B8-%D0%B2-ansible-9ee880d540d6|Динамическое инвентори в Ansible]] ​
  
 <​code>​ <​code>​
 +debian11# mkdir /​etc/​ansible/​
 +
 node1# cat /​etc/​ansible/​hosts node1# cat /​etc/​ansible/​hosts
 </​code><​code>​ </​code><​code>​
 +[all:vars]
 +#​ansible_python_interpreter="/​usr/​bin/​python3"​
 +
 #[corp] #[corp]
-#​server.corp[1:​12].un +#​server.corp13.un 
-#server.corp13.un ansible_ssh_user=root ansible_ssh_pass=123+#​server.corp[1:​12].un ​ansible_ssh_user=root ansible_ssh_pass=strongpassword 
 +#mail.corp[1:12].un ansible_ssh_user=root ansible_ssh_pass=strongpassword 
 +#​192.168.[1:​25].10
  
 [corpX] [corpX]
Line 37: Line 55:
  
 [addnodes] [addnodes]
-192.168.16.3 +192.168.X.[3:9] ansible_ssh_user=root ansible_ssh_pass=strongpassword
-192.168.16.4+
  
 [sws] [sws]
 switch[1:3] ansible_ssh_user=root ansible_ssh_pass=cisco switch[1:3] ansible_ssh_user=root ansible_ssh_pass=cisco
 +
 +[nodes]
 +##​192.168.X.[210:​230:​10]
 +##​192.168.X.[201:​203]
 +node[1:3]
 +
 +[nodes:​vars]
 +ansible_ssh_user=vagrant
 +ansible_ssh_pass=strongpassword
 +#​ansible_sudo_pass=strongpassword
 +ansible_become=yes
 </​code>​ </​code>​
  
Line 51: Line 79:
 # cat /​etc/​ansible/​ansible.cfg # cat /​etc/​ansible/​ansible.cfg
 </​code><​code>​ </​code><​code>​
-...+[defaults] 
 +#...
 host_key_checking = False host_key_checking = False
-...+#...
 </​code>​ </​code>​
  
Line 68: Line 97:
  
 <​code>​ <​code>​
 +$ ansible-doc -l
 +$ ansible-doc ping
 +
 node1# ansible corpX -m ping node1# ansible corpX -m ping
 +node1# ansible localhost -m ping
 node1# ansible all -m ping node1# ansible all -m ping
 +node1# ansible all -m ping -i inv_file.ini
 +node1# ansible all -m ping -i node2:2222, -e "​ansible_python_interpreter=/​usr/​bin/​python3"​
  
 node1# ansible corpX -m command -a 'uname -a' node1# ansible corpX -m command -a 'uname -a'
-node1# ansible corpX -a 'uname -a' 
  
-node1# ansible corpX -m apt -a '​pkg=apache2 state=present update_cache=true'​+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 addnodes -vv -f 5 -m apt -a '​pkg=ceph,​tgt-rbd state=present update_cache=true'​ #-e '​https_proxy=http://​radio.specialist.ru:​3128/'​ -e '​http_proxy=http://​radio.specialist.ru:​3128/'​ 
 + 
 +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
  
 server# ansible sws -m ios_command -a "​commands='​show cdp nei'"​ -c local server# ansible sws -m ios_command -a "​commands='​show cdp nei'"​ -c local
 +
 +server# ansible sws -m ios_command -a "​commands='​show cdp nei'"​ -c network_cli -e "​ansible_network_os=ios"​
 </​code>​ </​code>​
  
 ===== Использование playbook ===== ===== Использование playbook =====
  
-  * [[Управление учетными записями в Linux#​Назначение пароля]] +  * [[Формат YAML]] 
-  * [[https://docs.ansible.com/ansible/2.5/modules/user_module.html|Ansible ​module user - Manage user accounts]] +  * [[https://stackoverflow.com/questions/17188147/how-to-run-ansible-without-specifying-the-inventory-but-the-host-directly|How to run Ansible ​without specifying the inventory but the host directly?]] 
-  * [[https://coderlessons.com/tutorials/raznoe/vyuchi-yaml/​uchebnik-po-yaml|Учебник по YAML]]+  * [[https://stackoverflow.com/questions/33222641/override-hosts-variable-of-ansible-playbook-from-the-command-line|Override hosts variable of Ansible playbook from the command line]] 
 + 
 +==== Пример 1 ==== 
 + 
 +  * [[Технология Docker]]
  
 <​code>​ <​code>​
 +server# cat provision_docker.yml
 +
 +  или
 +
 +λ touch provision_docker.yml
 +
 +  или
 +
 +student@node1:​~$ cat /​vagrant/​provision_docker.yml
 +</​code><​code>​
 +- hosts: "{{ variable_host | default('​all'​) }}"
 +  become: yes
 +  user: vagrant
 +  tasks:
 +    - name: Install Docker'​s prequirement
 +      apt:
 +        pkg:
 +          - apt-transport-https
 +          - ca-certificates
 +          - curl
 +          - gnupg2
 +          - software-properties-common
 +        state: present ​
 +        update_cache:​ true
 +    - name: Add Docker'​s official GPG key
 +      apt_key:
 +#        url: https://​download.docker.com/​linux/​debian/​gpg
 +#        url: https://​download.docker.com/​linux/​ubuntu/​gpg
 +        state: present
 +    - name: Add Docker'​s repository into sources list
 +      apt_repository:​
 +#        repo: deb [arch=amd64] https://​download.docker.com/​linux/​debian bullseye stable
 +#        repo: deb [arch=amd64] https://​download.docker.com/​linux/​ubuntu focal stable
 +        state: present
 +    - name: Install Docker
 +      apt: 
 +        pkg:
 +          - docker-ce
 +          - docker-ce-cli
 +          - containerd.io
 +          - docker-compose-plugin
 +        state: present ​
 +        update_cache:​ true
 +</​code>​
 +
 +  * Технология Vagrant: [[Технология Vagrant#​Provision с использованием ansible]]
 +
 +<​code>​
 +server# ansible-playbook provision_docker.yml
 +
 +server# ansible-playbook provision_docker.yml --extra-vars "​variable_host=nodes"​
 +
 +server# ansible-playbook provision_docker.yml --extra-vars "​variable_host=localhost"​
 +
 +server# ansible-playbook provision_docker.yml -i inv_file.ini
 +
 +server# ansible-playbook provision_docker.yml -e "​ansible_python_interpreter=/​usr/​bin/​python3"​ -i 192.168.X.1:​2222,​
 +</​code>​
 +==== Пример 2 ====
 +  * [[Управление учетными записями в Linux#​Назначение пароля]]
 +  * [[https://​docs.ansible.com/​ansible/​2.5/​modules/​user_module.html|Ansible module user - Manage user accounts]]<​code>​
 node1# cat addusers.yml node1# cat addusers.yml
 </​code><​code>​ </​code><​code>​
Line 95: Line 210:
         uid: 10001         uid: 10001
         shell: /bin/bash         shell: /bin/bash
-        comment: "Ivanov ​Ivan Ivanovitch,RA7,​401,​499-239-45-23"​+        comment: "Ivan Ivanovitch ​Ivanov,RA1,​401,​499-239-45-23"​
         password: $6$3Gz1ZuH3yHckA$wQNZbfU/​9G6bYx08owpn7CoFP//​2WbB4cmDDOgwDYBbwEyHxB0QQyCuMrOiPOLv3JF5RFtIv/​r/​kxoPPYFCsx1         password: $6$3Gz1ZuH3yHckA$wQNZbfU/​9G6bYx08owpn7CoFP//​2WbB4cmDDOgwDYBbwEyHxB0QQyCuMrOiPOLv3JF5RFtIv/​r/​kxoPPYFCsx1
  
Line 103: Line 218:
         uid: 10002         uid: 10002
         shell: /bin/bash         shell: /bin/bash
-        comment: "Petrov ​Petr Petrov,​RA7,​402,​499-239-45-24"+        comment: "​Petr ​Petrovitch ​Petrov,​RA7,​402,​499-323-55-53"
         password: $6$x/​AU/​p9Dgi/​ZiNF$6Xb8J4fsGuTi5IR0LaZe5pSgRX8vp54sfQGWJZZwKX.KFVpUL9m2PJNDh/​d/​l0rocueIvVjdQTzEAYPMmTm991         password: $6$x/​AU/​p9Dgi/​ZiNF$6Xb8J4fsGuTi5IR0LaZe5pSgRX8vp54sfQGWJZZwKX.KFVpUL9m2PJNDh/​d/​l0rocueIvVjdQTzEAYPMmTm991
 +
 +
 </​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>​+</​code>​ 
 + 
 +==== Пример 3 ==== 
 + 
 +  * [[https://​docs.ansible.com/​ansible/​2.3/​ios_config_module.html|ios_config - Manage Cisco IOS configuration sections]] 
 + 
 +<​code>​
 server# cat cisco_change_conf.yml server# cat cisco_change_conf.yml
 </​code><​code>​ </​code><​code>​
 - hosts: sws - hosts: sws
   connection: local   connection: local
 +  gather_facts:​ no
   tasks:   tasks:
-    - name: Change config on cisco device+    - name: configure top level configuration
       ios_config:       ios_config:
         lines:         lines:
-          - logging facility local0 +          ​- snmp-server community write RW 
-          - logging host server +         
-          - ip scp server enable+#          - ip host server 192.168.X.10 
 +#          - snmp-server host server writetrap 
 + 
 +#          - snmp-server enable traps config 
 +#          - snmp-server enable traps config-copy 
 +#          - snmp-server enable traps snmp linkdown linkup 
 +#          - ip scp server enable 
 + 
 +#          ​- logging facility local0 
 +##          - logging host server 
 +         ​- ​logging host server ​transport udp port 8514 
 + 
 +#          - ntp server server 
 +#          - clock timezone MSK 3 
 +#          - service timestamps log datetime localtime year 
 + 
 +#          - aaa new-model 
 +#          - aaa authentication login CONSOLE none 
 +#          - aaa authorization exec CONSOLE none 
 +#          - enable ​secret cisco 
 +#          - aaa authorization console 
 + 
 +#          - aaa authentication login default local 
 +#          - aaa authorization exec default local 
 +#          - username root privilege 15 secret cisco 
 + 
 +#          - radius-server host server auth-port 1812 acct-port 1813 
 +#          - radius-server key testing123 
 +#          - aaa authentication login default group radius enable 
 +#          - aaa authorization exec default group radius none 
 + 
 +#          - tacacs-server host server 
 +#          - tacacs-server key tackey123 
 +#          - aaa authentication login default group tacacs+ enable 
 +#          - aaa authorization exec default group tacacs+ none 
 +#          - aaa accounting commands 15 default start-stop group tacacs+ 
 + 
 +#          - aaa authentication dot1x default group radius 
 +##          - aaa accounting dot1x default start-stop group radius 
 + 
 + 
 +#    - name: configure line con 0 
 +#      ios_config:​ 
 +#        lines: 
 +#          - login authentication CONSOLE 
 +#          - authorization exec CONSOLE 
 +#          - privilege level 15 
 +#        parents: line con 0
 </​code><​code>​ </​code><​code>​
 server# ansible-playbook cisco_change_conf.yml server# ansible-playbook cisco_change_conf.yml
Line 127: Line 303:
  
   * [[https://​ru.wikipedia.org/​wiki/​%D0%98%D0%B4%D0%B5%D0%BC%D0%BF%D0%BE%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C|Идемпотентность]]   * [[https://​ru.wikipedia.org/​wiki/​%D0%98%D0%B4%D0%B5%D0%BC%D0%BF%D0%BE%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C|Идемпотентность]]
 +  * [[https://​cryptic-cliffs-32040.herokuapp.com/​|How can I test jinja2 templates in ansible?]]
  
 <​code>​ <​code>​
Line 138: Line 315:
 <​body>​ <​body>​
 <h1> <h1>
-{{ ansible_fqdn }}+Hello from {{ ansible_fqdn }}
 </h1> </h1>
 </​body>​ </​body>​
Line 154: Line 331:
 </​code><​code>​ </​code><​code>​
 node1# ansible-playbook inst_apache.yml node1# ansible-playbook inst_apache.yml
 +</​code><​code>​
 +# cat iax.conf.j2
 +</​code><​code>​
 +[general]
 +disallow=all
 +allow=alaw
 +
 +{% for Y in YS %}
 +[corp{{Y}}]
 +type=user
 +host=dynamic
 +secret=apassword{{Y}}
 +auth=md5
 +
 +[corp{{Y}}]
 +type=peer
 +host=server.corp{{Y}}.un
 +username=corp{{X}}
 +secret=apassword{{X}}
 +auth=md5
 +
 +{% endfor %}
 </​code><​code>​ </​code><​code>​
 # cat ast_iax_corps.yml # cat ast_iax_corps.yml
Line 168: Line 367:
 </​code>​ </​code>​
 ===== Использование handlers ===== ===== Использование handlers =====
 +
 +==== Пример 1 ====
 +
 +  * [[Сервис HTTP#​Использование домашних каталогов]]
  
 <​code>​ <​code>​
Line 189: 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 конфигурация]]
 +
 +==== Роль настроенного через ifupdown узла сети ====
  
 <​code>​ <​code>​
-# cat host.yml+# ###cd /​root/​conf/​ 
 +# ###git pull origin master 
 +# ###cd /​root/​conf/​ansible/​roles/​ 
 + 
 +# cat nodes.yml
 </​code><​code>​ </​code><​code>​
-- name: Network config for hosts+- name: Network config for nodes
   hosts: addnodes   hosts: addnodes
 +#  hosts: kubes
 +#  hosts: all
   roles:   roles:
-    - host+    - node
 </​code><​code>​ </​code><​code>​
-# cat host/​vars/​main.yml+# ansible-galaxy init node  # не обязательно 
 + 
 +# cat node/​vars/​main.yml
 </​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 host/​tasks/​main.yml+# cat node/​tasks/​main.yml
 </​code><​code>​ </​code><​code>​
 - name: Create hosts file - name: Create hosts file
Line 218: Line 461:
 - name: Create hostname file - name: Create hostname file
   template: src=hostname.j2 dest=/​etc/​hostname   template: src=hostname.j2 dest=/​etc/​hostname
 +  notify:
 +    - restart system
  
 - name: Create interfaces file - name: Create interfaces file
   template: src=interfaces.j2 dest=/​etc/​network/​interfaces   template: src=interfaces.j2 dest=/​etc/​network/​interfaces
 +  notify:
 +    - restart system
  
-- name: Restart system +- name: Set timezone to Europe/​Moscow 
-  ​commandshutdown -r +1+  ​timezone: 
 +    name: Europe/​Moscow
 </​code><​code>​ </​code><​code>​
-# cat host/​templates/​hostname.j2+# cat node/​handlers/​main.yml 
 +</​code><​code>​ 
 +- name: restart system 
 +  reboot: 
 +</​code><​code>​ 
 +debian11# mkdir node/​templates 
 + 
 +# cat node/​templates/​hostname.j2
 </​code><​code>​ </​code><​code>​
 {{ name_prefix }}{{ N }}.corp{{ X }}.un {{ name_prefix }}{{ N }}.corp{{ X }}.un
 </​code><​code>​ </​code><​code>​
-# cat host/​templates/​hosts.j2+# cat node/​templates/​hosts.j2
 </​code><​code>​ </​code><​code>​
 127.0.0.1 localhost 127.0.0.1 localhost
Line 235: Line 490:
 {{ ansible_eth0.ipv4.address }} {{ name_prefix }}{{ N }}.corp{{ X }}.un {{ name_prefix }}{{ N }} {{ ansible_eth0.ipv4.address }} {{ name_prefix }}{{ N }}.corp{{ X }}.un {{ name_prefix }}{{ N }}
 </​code><​code>​ </​code><​code>​
-# cat host/​templates/​resolv.conf.j2+# cat node/​templates/​resolv.conf.j2
 </​code><​code>​ </​code><​code>​
 search corp{{ X }}.un search corp{{ X }}.un
 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 host/​templates/​interfaces.j2+# cat node/​templates/​interfaces.j2
 </​code><​code>​ </​code><​code>​
 auto lo auto lo
Line 251: 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 host.yml+# ansible-playbook ​-f 5 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>​ 
 + 
 +==== Роль OpenVPN сервера ==== 
 +<​code>​ 
 +server:~# mkdir openvpn1 && cd openvpn1 
 + 
 +server:​~/​openvpn1#​ ansible-galaxy init openvpn1 
 + 
 +server:​~/​openvpn1#​ cd openvpn1/​files/​ 
 + 
 +server:​~/​openvpn1/​openvpn1/​files#​ 
 +</​code>​ 
 +  * В текущем каталоге выполняем и сохраняем файлы из тем [[Пакет OpenSSL#​Создание параметра DH]] и [[Пакет OpenSSL#​Создание самоподписанного сертификата]] (не указываем AltName, Common Name: server - достаточно) 
 +<​code>​ 
 +server:​~/​openvpn1/​openvpn1/​files#​ ls 
 +</​code><​code>​ 
 +dh2048.pem ​ server.crt ​ server.key 
 +</​code><​code>​ 
 +server:​~/​openvpn1/​openvpn1/​files#​ cd ../../ 
 + 
 +server:​~/​openvpn1#​ cat openvpn1/​templates/​openvpn1.conf.j2 
 +</​code><​code>​ 
 +dev tun 
 +keepalive 10 120 
 + 
 +server {{node_nets[ansible_hostname]}} 255.255.255.0 
 + 
 +push "route 192.168.{{X}}.0 255.255.255.0"​ 
 +#push "​dhcp-option DNS 192.168.{{X}}.10"​ 
 +#push "​block-outside-dns"​ 
 +#push "​dhcp-option DOMAIN corp{{X}}.un"​ 
 + 
 +dh /​etc/​openvpn/​dh2048.pem 
 +key /​etc/​ssl/​private/​server.key 
 +ca /​etc/​ssl/​certs/​server.crt 
 +cert /​etc/​ssl/​certs/​server.crt 
 + 
 +verify-client-cert none 
 +plugin /​usr/​lib/​x86_64-linux-gnu/​openvpn/​plugins/​openvpn-plugin-auth-pam.so login 
 +username-as-common-name 
 +#​duplicate-cn 
 + 
 +status /​var/​log/​openvpn1-status.log 
 + 
 +management 0.0.0.0 7505 
 +</​code><​code>​ 
 +server:​~/​openvpn1#​ cat openvpn1/​tasks/​main.yml 
 +</​code><​code>​ 
 +- name: Install OpenVPN 
 +  apt: pkg=openvpn state=present update_cache=true 
 +#  when: node_nets[ansible_hostname] is defined 
 + 
 +- name: Create openvpn1.conf file 
 +  template: src=openvpn1.conf.j2 dest=/​etc/​openvpn/​openvpn1.conf 
 +  notify: 
 +    - restart openvpn1 
 + 
 +- name: Copy file server.key 
 +  copy: 
 +    src: server.key 
 +    dest: /​etc/​ssl/​private/​server.key 
 +    mode: '​0600'​ 
 +  notify: 
 +    - restart openvpn1 
 + 
 +- name: Copy many files 
 +  copy: 
 +    src: '​{{item.0}}'​ 
 +    dest: '​{{item.1}}'​ 
 +  loop: 
 +    - [ '​dh2048.pem',​ '/​etc/​openvpn/​dh2048.pem'​ ] 
 +    - [ '​server.crt',​ '/​etc/​ssl/​certs/​server.crt'​ ] 
 +  notify: 
 +    - restart openvpn1 
 + 
 +- name: Enable service OpenVPN 
 +  service: 
 +    name: openvpn@openvpn1 
 +    enabled: yes 
 +#    state: started 
 +</​code><​code>​ 
 +server:​~/​openvpn1#​ cat openvpn1/​handlers/​main.yml 
 +</​code><​code>​ 
 +- name: restart openvpn1 
 +  service: 
 +    name: openvpn@openvpn1 
 +    state: restarted 
 +</​code><​code>​ 
 +server:​~/​openvpn1#​ cat inventory.yaml 
 +</​code><​code>​ 
 +all: 
 +  vars: 
 +    X: "{{ ansible_eth1.ipv4.address.split('​.'​)[2] }}" 
 +    ansible_python_interpreter:​ "/​usr/​bin/​python3"​ 
 +    ansible_ssh_user:​ vagrant 
 +    ansible_ssh_pass:​ strongpassword 
 +    ansible_become:​ yes 
 +    node_nets:​ 
 +      node1: 192.168.110.0 
 +      node2: 192.168.120.0 
 +      node3: 192.168.130.0 
 + 
 +prod_nodes:​ 
 +  hosts: 
 +    node1: 
 +    node2: 
 + 
 +test_nodes:​ 
 +  hosts: 
 +    node3: 
 +</​code><​code>​ 
 +server:​~/​openvpn1#​ cat openvpn1.yaml 
 +</​code><​code>​ 
 +- name: Run openvpn1 on nodes 
 +  hosts: "{{ variable_host | default('​prod_nodes'​) }}" 
 +  roles: 
 +    - role: openvpn1 
 +      when: node_nets[ansible_hostname] is defined 
 +</​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 ​   # можно через GitLab CI/CD 
 + 
 +server:​~/​openvpn1#​ ansible-playbook openvpn1.yaml -i inventory.yaml -e "​variable_host=all"​ 
 +</​code>​ 
 + 
 +  * [[Сервисы Gateway и routing#​Управление таблицей маршрутизации]] 
 + 
 +==== Фрагмент роли с условиями и отладкой ==== 
 + 
 +<​code>​ 
 +# cat conf/​ansible/​roles/​host/vars/main.yml 
 +</​code><​code>​ 
 +... 
 +octet4: "{{ ansible_eth0.ipv4.address.split('​.'​)[3] }}" 
 +... 
 +</​code><​code>​ 
 +# cat conf/​ansible/​roles/​host/​tasks/​main.yml 
 +</​code><​code>​ 
 +- name: set vars for server 
 +  set_fact: 
 +    hostname: "​mail"​ 
 +    X: "{{ octet4 | int - 100 }}" 
 +  when: octet4 | int >= 100 
 + 
 +- name: set vars for mail 
 +  set_fact: 
 +    hostname: "​server"​ 
 +    X: "{{ octet4 }}" 
 +  when: octet4 | int < 100 
 + 
 +- name: echo variables 
 +  debug: 
 +    msg: octet4 is {{ octet4 }}, X is {{ X }}, hostname is {{hostname}} 
 +     
 +#- meta: end_play 
 + 
 +... 
 +</​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]] 
 + 
 +====== Дополнительные материалы ====== 
 +<​code>​ 
 +выполнение команд на цисках через ансибл 
 + 
 +1. добавить в /​etc/​ansible/​group_vars/​all.yml строки 
 +ansible_connection:​ network_cli 
 +ansible_network_os:​ ios 
 +2. создать файл playbook формата 
 +- name: Run show commands on routers 
 +  hosts: cisco-routers 
 + 
 +  tasks: 
 + 
 +    - name: run show commands 
 +      ios_command:​ 
 +        commands: # перечисление команд 
 +          - show ip int br 
 +          - sh ip route 
 +      register: show_result
 </​code>​ </​code>​
сервис_ansible.1590254258.txt.gz · Last modified: 2020/05/23 20:17 by val