Ansible Условие when
Условие when в Ansible — это условное выражение, которое позволяет выполнять задачу только если выполнено определённое условие. Условие может быть основано на переменных, фактах, результатах предыдущих задач или других критериях.
Разделение playbook в зависимости от ОС дистрибутива, добавим ip сервера RedOs (rpm) в файл inventory, а в файл install_apache.yml фильтр по условию ОС Astra Linux
cd ~/ansible_tutorial
nano inventroy
ansible all -b -K -a "cat /etc/os-release"
ansible all -m setup -a "filter=ansible_distribution*" -b -K
nano install_apache.yml
---
- hosts: all
become: true
tasks:
- name: update repository index
apt:
update_cache: yes
when: ansible_distribution in ["Debian", "Astra Linux"]
- name: install apache2 package
apt:
name: apache2
state: latest when: ansible_distribution == "Astra Linux"
- name: add php support for apache
apt:
name: libapache2-mod-php
state: latest
when: ansible_distribution == "Astra Linux"
ansible-playbook --ask-become-pass install_apache.yml
TASK [update repository index] *********************************************************************************************************
skipping: [192.168.122.59]
ok: [192.168.122.202]
ok: [192.168.122.218]
ok: [192.168.122.152]
Добавим отдельные задачи в файл playbook установки пакетов для ОС RedOS,Centos
nano install_apache.yml
---
- hosts: all
become: true
tasks:
- name: update repository index
apt:
update_cache: yes
when: ansible_distribution in ["Debian", "Astra Linux"]
- name: install apache2 package
apt:
name: apache2
state: latest
when: ansible_distribution == "Astra Linux"
- name: add php support for apache
apt:
name: libapache2-mod-php
state: latest
when: ansible_distribution == "Astra Linux"
- name: update repository index Centos RedOS
dnf:
update_cache: yes
when: ansible_distribution in ["Centos", "RED"]
- name: install apache2 package Centos,RED
dnf:
name: httpd
state: latest
when: ansible_distribution == "RED"
- name: add php support for apache Centos,RED
dnf:
name: php
state: latest
when: ansible_distribution == "RED"
PLAY RECAP *****************************************************************************************************************************
192.168.122.152 : ok=4 changed=0 unreachable=0 failed=0 skipped=3 rescued=0 ignored=0
192.168.122.202 : ok=4 changed=0 unreachable=0 failed=0 skipped=3 rescued=0 ignored=0
192.168.122.218 : ok=4 changed=0 unreachable=0 failed=0 skipped=3 rescued=0 ignored=0
192.168.122.59 : ok=4 changed=2 unreachable=0 failed=0 skipped=3 rescued=0 ignored=0
Особенность RedOs Centos , Apache httpd сервис демон не запускается по умолчанию после установки, и доступ к порту http tcp 80 иногда блокирует firewall
systemctl status httpd
○ httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
Drop-In: /usr/lib/systemd/system/service.d
└─10-timeout-abort.conf
/usr/lib/systemd/system/httpd.service.d
└─php-fpm.conf
Active: inactive (dead)
Docs: man:httpd.service(8)
sudo systemctl start httpd
sudo firewall-cmd --add-port=80/tcp
Улучшаем плейбук playbook ansible
Объединяем установку пакетов и запуск кэша обновлений в файле install_apache.yml
nano install_apache.yml
---
- hosts: all
become: true
tasks:
- name: install apache2 and php packages upd cache for Astra Linux,Debian
apt:
name:
- apache2
- libapache2-mod-php
state: latest
update_cache: yes
when: ansible_distribution == "Astra Linux"
- name: install apache2 and php packages upd cache Centos,RED
dnf:
name:
- httpd
- php
state: latest
update_cache: yes
when: ansible_distribution in ["Centos","RED"]
ansible-playbook --ask-become-pass install_apache.yml
Оптимизация плейбука до одного действия используя переменные и универсальный менеджер пакетов package
nano install_apache.yml
---
- hosts: all
become: true
tasks:
- name: install apache and php packages upd cache
package:
name:
- "{{ apache_package }}"
- "{{ php_package }}"
state: latest
update_cache: yes
Редактируем файл инвентаризации хостов и объявляем переменные
nano inventory
192.168.122.152 apache_package=apache2 php_package=libapache2-mod-php
192.168.122.218 apache_package=apache2 php_package=libapache2-mod-php
192.168.122.202 apache_package=apache2 php_package=libapache2-mod-php
192.168.122.59 apache_package=httpd php_package=php
Нацеливаемся на конкретные узлы хосты группы
Создание групп в списке инвентаризации хостов
nano inventory
[web_servers]
192.168.122.152
192.168.122.59
[db_servers]
192.168.122.218
[file_servers]
192.168.122.202
[git_servers]
192.168.122.152
192.168.122.202
192.168.122.59
cp install_apache.yml site.yml
nano site.yml
Обновим кэш пакетов и обновим пакеты в зависимости от ОС Astra Linux, RedOS, настройка серверов, для web серверов установка apache и php
---
- hosts: all
become: true
tasks:
- name: install updates (RedOS,Centos)
dnf:
update_only: yes
update_cache: yes
when: ansible_distribution in ["Centos","RED"]
- name: install updates (Astra Linux)
apt:
upgrade: dist
update_cache: yes
when: ansible_distribution == "Astra Linux"
- hosts: web_servers
become: true
tasks:
- name: install apache2 and php packages for Astra Linux,Debian
apt:
name:
- apache2
- libapache2-mod-php
state: latest
when: ansible_distribution == "Astra Linux"
- name: install apache2 and php packages Centos,RED
dnf:
name:
- httpd
- php
state: latest
when: ansible_distribution in ["Centos","RED"]
ansible-playbook --ask-become-pass site.yml
Предварительные задачи pre_tasks — задачи которые требуется выполнить в первую очерель, добавим в site2.yml раздел ,для серверов баз данных
ansible-playbook --syntax-check site2.yml
ansible-playbook --ask-become-pass site2.yml
TASK [install mariadb package (Astra linux)] *************************************************************************************
changed: [192.168.122.218]
andrey@astra2:~$ systemctl status mariadb.service
● mariadb.service - MariaDB 10.3.39 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2026-01-15 15:08:12 MSK; 8min ago
добавим в site2.yml раздел, для файловых серверов
nano site2.yml
---
- hosts: all
become: true
tasks:
- name: install updates (RedOS,Centos)
dnf:
update_only: yes
update_cache: yes
when: ansible_distribution in ["Centos","RED"]
- name: install updates (Astra Linux)
apt:
upgrade: dist
update_cache: yes
when: ansible_distribution == "Astra Linux"
- hosts: web_servers
become: true
tasks:
- name: install apache2 and php packages for Astra Linux,Debian
apt:
name:
- apache2
- libapache2-mod-php
state: latest
when: ansible_distribution == "Astra Linux"
- name: install apache2 and php packages Centos,RED
dnf:
name:
- httpd
- php
state: latest
when: ansible_distribution in ["Centos","RED"]
- hosts: db_servers
become: true
tasks:
- name: install mariadb package (RedOS,Centos)
dnf:
name: mariadb
state: latest
when: ansible_distribution in ["Centos","RED"]
- name: install mariadb package (Astra linux)
apt:
name: mariadb-server
state: latest
when: ansible_distribution == "Astra Linux"
- hosts: file_servers
become: true
tasks:
- name: install samba package
package:
name: samba
state: latest
- hosts: git_servers
become: true
tasks:
- name: install git package
package:
name: git
state: latest
ansible-playbook --syntax-check site2.yml
ansible-playbook --ask-become-pass site2.yml
Ansible Теги
Tags Теги позволяют выполнять не весь плейбук, а только его определенные части, помеченные нужными тегами
nano site.yml
---
- hosts: all
become: true
tasks:
- name: install updates (RedOS,Centos)
tags: always
dnf:
update_only: yes
update_cache: yes
when: ansible_distribution in ["Centos","RED"]
- name: install updates (Astra Linux)
tags: always
apt:
upgrade: dist
update_cache: yes
when: ansible_distribution == "Astra Linux"
- hosts: web_servers
become: true
tasks:
- name: install apache2 and php packages for Astra Linux,Debian
tags: apache,apache2,astra,debian
apt:
name:
- apache2
- libapache2-mod-php
state: latest
when: ansible_distribution == "Astra Linux"
- name: install apache2 and php packages Centos,RED
tags: apache,centos,httpd.redos
dnf:
name:
- httpd
- php
state: latest
when: ansible_distribution in ["Centos","RED"]
- hosts: db_servers
become: true
tasks:
- name: install mariadb package (RedOS,Centos)
tags: centos,redos,db,mariadb
dnf:
name: mariadb
state: latest
when: ansible_distribution in ["Centos","RED"]
- name: install mariadb package (Astra linux)
tags: db,mariadb,debian,astra
apt:
name: mariadb-server
state: latest
when: ansible_distribution == "Astra Linux"
- hosts: file_servers
become: true
tasks:
- name: install samba package
tags: samba
package:
name: samba
state: latest
- hosts: git_servers
become: true
tasks:
- name: install git package
tags: git
package:
name: git
state: latest
Вывести доступные теги из файла playbook
ansible-playbook --list-tags site2.yml
Запуск задач из файла playbook для ОС centos используя тег tags.
тег always выполняется всегда
ansible-playbook --tags centos --ask-become-pass site2.yml
ansible-playbook --tags apache --ask-become-pass site2.yml
Запуск задач из файла playbook используя несколько тегов
ansible-playbook --tags "apache,db" --ask-become-pass site2.yml