Ссылки
https://docs.ansible.com/ - документация https://docs.ansible.com/ansible/latest/reference_appendices/config.html - параметры конфига https://jinja.palletsprojects.com/en/3.0.x/ - язык jinga, используется в шаблонах ansible https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html - пример с тегами https://galaxy.ansible.com/ - роли https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html - роли https://ansible-for-network-engineers.readthedocs.io/ru/latest/ - для сетевых инженеров https://github.com/natenka/Ansible-for-network-engineers - для сетевых инженеров https://molecule.readthedocs.io/en/latest/ - молекула, автоматизация проверок playbook https://habr.com/ru/post/437216/ - молекула, автоматизация проверок playbook https://github.com/ansible/awx - автоматизация ansible, планировщик https://github.com/ansible/awx/blob/devel/INSTALL.md - автоматизация ansible, планировщик
ansible.cfg
[defaults] host_key_checking = False ### не проверять ключи pipelining = True deprecation_warnings = False retry_files_enabled = False # не будут создаваться файлы при не удачном подключение inventory = ./hosts.txt ### файл с описанием хостов roles_path = ./roles ### каталог ролей forks = 10 ### количество одновременных выполнений timeout = 10 log_path = ./ansible.log ### файл с логами interpreter_python = python3 #ansible_user = vagrant # пользователь по умолчанию #auto_silent=auto #transport = ssh #allow_world_readable_tmpfiles = true # Решает баг с py mysql [diff] always = True # context = 3
hosts.txt
#Применить локально localhost ansible_connection=local [all_servers:vars] #переменные для группы all_servers ansible_user = root ansible_connection=ssh [all_servers] #группа all_servers 192.168.1.31 [CentOS7:vars] #переменные для группы CentOS7 ansible_python_interpreter=/usr/bin/python2 ansible_user = root ansible_connection=ssh #ansible_user=vagrant #ansible_ssh_pass=vagrant [CentOS7] №группа CentOS7 192.168.1.244 superserver [prod_servers:vars] #переменные для группы prod_servers ansible_user=USERNAME1 ansible_ssh_private_key_file=/home/USERNAME1/.ssh/nameSSHKey1.pem [prod_servers] #групп prod_servers linux1 ansible_host=192.168.1.14 linux2 ansible_host=192.168.1.15 #Пример с группировкой хостов [staging_DB] 192.168.0.10 192.168.0.11 [staging_WEB] 192.168.0.20 192.168.0.21 [staging_APP] 192.168.0.30 192.168.0.31 #Все хосты выше (staging_DB, staging_WEB, staging_APP) сгруппировали в одну группу staging_ALL [staging_ALL:children] staging_DB staging_WEB staging_APP #Хосты из группы (staging_APP, prod_APP) сгруппировали в группу APP_ALL [APP_ALL:children] staging_APP prod_APP [APP_ALL:vars] #для группы APP_ALL задали переменную message=Hello [staging_servers] # Также переменные можно задавать для хоста linuXXX ansible_host=192.168.1.16 ansible_user=USERNAME7 ansible_ssh_private_key_file=/home/USERNAME7/.ssh/id_rsa
test.yaml
test.yaml
---
- name: My TEST Playbook
hosts: all
become: yes
tasks:
- name: Ping test
ping:
...
Пример обновления пакетов :
---
- hosts: all
become: yes
tasks:
- name: Cheack and Print Linux Version
debug: var=ansible_os_family
- name: Debian update apt-get repo and cache
apt: update_cache=yes force_apt_get=yes cache_valid_time=3600
when: ansible_os_family == "Debian"
- name: Debian upgrade all apt packages
apt: upgrade=dist force_apt_get=yes
when: ansible_os_family == "Debian"
- name: CentOS upgrade all packages
yum:
name: '*'
state: latest
when: ansible_os_family == "RedHat"
...
Пример создание пользователя, создания файлов и условия(when), debug
# when - выполнить если
---
- hosts: all
become: yes
gather_facts: false
vars:
source_file_group_sudo: ./FILE_SUDO
destin_file_group_sudo: /etc/sudoers.d/FILE_SUDO
user_name: USERNAME
user_key_pub: USERKEY.pub
user_password: USER_HESH_PASSWORD
user_groups_debian: sudo,ADD_GROUP
user_groups_centos: wheel,ADD_GROUP
add_group: ADD_NEW_GROUP
tasks:
- name: Add a group called
group:
name: "{{ add_group }}"
state: present
- name: Cheack and Print Linux Version
debug: var=ansible_os_family
- name: Copy file zxc to Servers
copy: src={{ source_file_group_sudo }} dest={{ destin_file_group_sudo }} mode=0555
- name: Add user to remote hosts
user: name={{ user_name }} groups={{ user_groups_debian }} shell=/bin/bash password={{ user_password }}
when: ansible_os_family == "Debian"
- name: Add user to remote hosts
user: name={{ user_name }} groups={{ user_groups_centos }} shell=/bin/bash password={{ user_password }}
when: ansible_os_family == "RedHat"
- name: Add SSH keys to remote hosts
authorized_key: user={{ user_name }} key="{{ lookup('file', "{{ user_key_pub }}") }}"
...
Пример файла FILE_SUDO
#--# zxc administrators %zxc ALL=(ALL) NOPASSWD: ALL
Пример установки apache2, использование handlers и notify
# говорит что сделать
# где сделать
---
- name: Install Apache and Upload my Web Page
hosts: all
become: yes
vars:
source_file: ./website/index.html
destin_file: /var/www/html
tasks:
- name: Install Apache Web Server
yum: name=apache2 state=present
- name: Copy index html to Servers
copy: src={{ source_file }} dest={{ destin_file }} mode=0555
notify: Restart Apache
- name: Start Apache and Enable it on every boot
service: name=apache2 state=started enabled=yes
handlers:
- name: Restart Apache
service: name=apache2 state=restarted
...
Loop, списки и циклы
# Существует несколько видов записи
# Пример первый:
#tasks/main.yaml
- name: install packages
yum:
name: {{ item }}
state: present
loop:
- htop
- bind-utils
- mtr
# Пример второй
#vars/main.yaml
packages:
- htop
- bind-utils
- mtr
# tasks/main.yml
name: install packages
yum:
name: {{ item }}
state: present
loop: {{ packages }}
# Пример третий
# tasks file for install_pkg
- name: Install a list of packages
apt:
pkg:
- libreoffice
- git
- wget
- curl
# Пример с пакетам для вуишфт
- name: Install a list of packages
apt:
pkg:
- qemu-kvm
- libvirt-daemon-system
- ovmf
- virtinst
- openvswitch-switch
- tcpdump
- git
- dnsutils
- mtr
- iotop
- virt-top
- logwatch
- postfix
- python3-minimal
- python3-pip
- python3-setuptools
- python3-libvirt
- python3-lxml
- smartmontools
state: latest
update_cache: True
when: ansible_os_family == "Debian"
TAG
Пример в таске:
- name: Install ntp
ansible.builtin.yum:
name: ntp
state: present
tags: ntp
Пример использования:
ansible-playbook --tags ntp name_playbook.yaml - будут выполнены из плейбука таски с тагом (ntp)
ansible-playbook --skip-tags ntp name_playbook.yaml - таски с тагом (ntp) будут проигнорированы , все остальные задачи будут выполнены
Роли \ roles
# Roles - это структурированные palybook, с возможностью версионности.
# В ansible.cfg должна быть запись (roles_path = ./roles) - каталог ролей
# cd roles
# ansible-galaxy init adduser_groups - создали роль
# структура роли
.
├── defaults # дефолтные переменные var
│ └── main.yml # Сюда сыпем наши переменные
├── handlers # обработчики (для notify)
│ └── main.yml
├── meta # мета данные
│ └── main.yml
├── README.md # описание ( например как создать paybook запуска)
├── tasks # задачи \ таски
│ └── main.yml # - include role.yaml
├── template # шаблоны (файлы j2, jinja)
│ └── main.yml
├── files # сюда складываем все статические файлы
│
├── tests # данные для тестов (используется очень редко)
│ ├── inventory
│ └── test.yml
└── vars # переменные с более высоким приоритетом
└── main.yml
Пример playbook для запуска роли:
---
- hosts: all
become: yes
gather_facts: false
roles:
- adduser_groups
...
Include и Import
!!! Отличие import от include заключается в следующем !!! Include читает из файлов значения, ansible подставляет значения при выполнении (дошел до строчки с include тогда и подставил) !!! Import читает и подставляет значения, ansible подставляет сразу все значения !!! рекомендуют использовать include !!! Также можно сократить запись