
Ранее мы использовали Playbook для работы с серверами. Пора изучить Ansible Roles т.к. это считается более профессиональная запись Playbook. В нашем случае мы переходим в следующий каталог и создаем там роль:
cd /etc/ansible
# Создаем каталог
sudo mkdir roles
# Переходим в каталог rools
cd roles/
# Создаем роль
sudo ansible-galaxy init install_apache2
- install_apache2 was created successfully
# Переходим в созданный каталог
cd install_apache2/
# Смотрим структуру
tree
.
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
Разберем подробнее, каждый элемент (пока они пустые, шаблоны):
* многие каталоги вверху часто и не нужны, далее их будем создавать сами.
Теперь воспользуемся кодом из:
Playbook: Блоки, условия и циклы. Lesson 7
---
- name: Install Apache
hosts: all
become: yes
vars:
source_folder: ./MyWebFiles
destin_folder: /var/www/html
tasks:
- name: Check version Linux
debug: var=ansible_os_family
- block:
- name: Install Apache web Server Debian
apt: name=apache2 update_cache=yes state=latest
- name: Start Debian
service: name=apache2 state=started enabled=yes
when: ansible_os_family== "Debian"
when: ansible_os_family == "Debian"
- block:
- name: Install Apache web Server CentOS
yum: name=httpd update_cache=yes state=latest
- name: Start CentOS
service: name=httpd state=started enabled=yes
when: ansible_os_family== "CentOS"
when: ansible_os_family == "CentOS"
- name: Copy files in www CentOS&Debian
copy: src={{ source_folder }}/{{ item }} dest={{ destin_folder }} mode=0555
loop:
- "index.html"
- "ico.png"
notify:
- Restart Apache CentOS
- Restart Apache Debian
handlers:
- name: Restart Apache CentOS
service: name=httpd state=restarted
when: ansible_os_family == "CentOS"
- name: Restart Apache Debian
service: name=apache2 state=restarted
when: ansible_os_family == "Debian"
Начнем перенос в Роль:
1. Переносим файлы
sudo mv MyWebFiles/*.html roles/install_apache2/files
sudo mv MyWebFiles/*.png roles/install_apache2/files
В итоге у нас будет:
tree
...
├── files
│ └── index.html
│ └── ico.png
...
2. Переносим vars
...
vars:
source_folder: ./MyWebFiles
destin_folder: /var/www/html
...
Так как файлы мы уже перенесли, строчку "source_folder" нам больше не надо. Переносим только "destin_folder: /var/www/html" в файл "vars -> main.yml". Сам "vars:" нам ненужен.
Открываем файл:
sudo nano roles/install_apache2/vars/main.yml
Копируем данные в этот файл:
---
# vars file for install_apache2
destin_folder: /var/www/html
3. Переносим handlers
Открываем файл:
sudo nano roles/install_apache2/handlers/main.yml
Копируем данные в этот файл:
---
# handlers file for install_apache2
- name: Restart Apache CentOS
service: name=httpd state=restarted
when: ansible_os_family == "CentOS"
- name: Restart Apache Debian
service: name=apache2 state=restarted
when: ansible_os_family == "Debian"
4. Переносим tasks
Открываем файл:
sudo nano roles/install_apache2/tasks/main.yml
Копируем данные в этот файл и немного меняем (см. в коде):
---
# tasks file for install_apache2
- name: Check version Linux
debug: var=ansible_os_family
- block:
- name: Install Apache web Server Debian
apt: name=apache2 update_cache=yes state=latest
- name: Start Debian
service: name=apache2 state=started enabled=yes
when: ansible_os_family== "Debian"
when: ansible_os_family == "Debian"
- block:
- name: Install Apache web Server CentOS
yum: name=httpd update_cache=yes state=latest
- name: Start CentOS
service: name=httpd state=started enabled=yes
when: ansible_os_family== "CentOS"
when: ansible_os_family == "CentOS"
- name: Copy files in www CentOS&Debian
# ИСПРАВЛЯЕМ: src={{ source_folder }}/{{ item }} меняем на src={{ item }}
copy: src={{ item }} dest={{ destin_folder }} mode=0555
loop:
- "index.html"
- "ico.png"
notify:
- Restart Apache CentOS
- Restart Apache Debian
5. Исправляем основной Playbook
Возвращаемся к исходному файлу и убираем остатки:
---
- name: Install Apache
hosts: all
become: yes
# удаляем vars, tasks, handlers - эти заголовки тут больше не нужны!
vars:
tasks:
handlers:
в итоге получится чистый файл install_apache.yml:
---
- name: Install Apache
hosts: all
become: yes
Чтобы запустить этот файл с ролью, дополняем в него следующее:
---
- name: Install Apache
hosts: all
become: yes
roles:
- install_apache2
# можно указать несколько ролей
# - install_mc
# - install_mysql
# Если хотите запускать роль только на Linux:
# - { role: install_apache2, when: ansible_system == 'Linux' }
Запускаем наш playbook с roles:
ansible-playbook install_apache.yml
PLAY [Install Apache] ***********************
...
debi : ok=6 changed=2 unreachable=0 failed=0
Все работает. Спасибо всем!
Источник: http://linuxsql.ru