You are here

Ansible: изучаем и создаем Роли (Roles). Lesson 8

Linux: 

Ansible: изучаем и создаем Роли (Roles). Lesson 8

Ранее мы использовали Playbook для работы с серверами. Пора изучить Ansible Roles т.к. это считается более профессиональная запись Playbook. В нашем случае мы переходим в следующий каталог и создаем там роль:

  1. cd /etc/ansible
  2. # Создаем каталог
  3. sudo mkdir roles
  4. # Переходим в каталог rools
  5. cd roles/
  6. # Создаем роль
  7. sudo ansible-galaxy init install_apache2
  8. - install_apache2 was created successfully
  9. # Переходим в созданный каталог
  10. cd install_apache2/
  11. # Смотрим структуру
  12. tree
  13. .
  14. ├── defaults
  15. │   └── main.yml
  16. ├── files
  17. ├── handlers
  18. │   └── main.yml
  19. ├── meta
  20. │   └── main.yml
  21. ├── README.md
  22. ├── tasks
  23. │   └── main.yml
  24. ├── templates
  25. ├── tests
  26. │   ├── inventory
  27. │   └── test.yml
  28. └── vars
  29. └── main.yml
  30.  
  31. 8 directories, 8 files

Разберем подробнее, каждый элемент (пока они пустые, шаблоны):

  • defaults - размещение defaults переменных для вашей роли
  • files - файлы которые копируем
  • handlers - разместить главный лист handlers
  • meta - ...
  • README.md - файл с инструкцией
  • tasks - разместить главный лист tasks
  • templates - файлы копированные и генерированные
  • tests - ...
  • vars - размещение других переменных для вашей роли

* многие каталоги вверху часто и не нужны, далее их будем создавать сами.

Теперь воспользуемся кодом из:
Playbook: Блоки, условия и циклы. Lesson 7

  1. ---
  2. - name: Install Apache
  3. hosts: all
  4. become: yes
  5.  
  6. vars:
  7. source_folder: ./MyWebFiles
  8. destin_folder: /var/www/html
  9.  
  10. tasks:
  11. - name: Check version Linux
  12. debug: var=ansible_os_family
  13.  
  14. - block:
  15.  
  16. - name: Install Apache web Server Debian
  17. apt: name=apache2 update_cache=yes state=latest
  18.  
  19. - name: Start Debian
  20. service: name=apache2 state=started enabled=yes
  21. when: ansible_os_family== "Debian"
  22.  
  23. when: ansible_os_family == "Debian"
  24.  
  25. - block:
  26.  
  27. - name: Install Apache web Server CentOS
  28. yum: name=httpd update_cache=yes state=latest
  29.  
  30. - name: Start CentOS
  31. service: name=httpd state=started enabled=yes
  32. when: ansible_os_family== "CentOS"
  33.  
  34. when: ansible_os_family == "CentOS"
  35.  
  36. - name: Copy files in www CentOS&Debian
  37. copy: src={{ source_folder }}/{{ item }} dest={{ destin_folder }} mode=0555
  38. loop:
  39. - "index.html"
  40. - "ico.png"
  41. notify:
  42. - Restart Apache CentOS
  43. - Restart Apache Debian
  44.  
  45. handlers:
  46. - name: Restart Apache CentOS
  47. service: name=httpd state=restarted
  48. when: ansible_os_family == "CentOS"
  49.  
  50. - name: Restart Apache Debian
  51. service: name=apache2 state=restarted
  52. when: ansible_os_family == "Debian"

Начнем перенос в Роль:

1. Переносим файлы

sudo mv MyWebFiles/*.html roles/install_apache2/files
sudo mv MyWebFiles/*.png roles/install_apache2/files

В итоге у нас будет:

  1. tree
  2. ...
  3. ├── files
  4. │   └── index.html
  5. │   └── ico.png
  6. ...

2. Переносим vars

  1. ...
  2. vars:
  3. source_folder: ./MyWebFiles
  4. destin_folder: /var/www/html
  5. ...

Так как файлы мы уже перенесли, строчку "source_folder" нам больше не надо. Переносим только "destin_folder: /var/www/html" в файл "vars -> main.yml". Сам "vars:" нам ненужен.

Открываем файл:

  1. sudo nano roles/install_apache2/vars/main.yml

Копируем данные в этот файл:

  1. ---
  2. # vars file for install_apache2
  3. destin_folder: /var/www/html

3. Переносим handlers
Открываем файл:

  1. sudo nano roles/install_apache2/handlers/main.yml

Копируем данные в этот файл:

  1. ---
  2. # handlers file for install_apache2
  3. - name: Restart Apache CentOS
  4. service: name=httpd state=restarted
  5. when: ansible_os_family == "CentOS"
  6.  
  7. - name: Restart Apache Debian
  8. service: name=apache2 state=restarted
  9. when: ansible_os_family == "Debian"

4. Переносим tasks
Открываем файл:

  1. sudo nano roles/install_apache2/tasks/main.yml

Копируем данные в этот файл и немного меняем (см. в коде):

  1. ---
  2. # tasks file for install_apache2
  3.  
  4. - name: Check version Linux
  5. debug: var=ansible_os_family
  6.  
  7. - block:
  8.  
  9. - name: Install Apache web Server Debian
  10. apt: name=apache2 update_cache=yes state=latest
  11.  
  12. - name: Start Debian
  13. service: name=apache2 state=started enabled=yes
  14. when: ansible_os_family== "Debian"
  15.  
  16. when: ansible_os_family == "Debian"
  17.  
  18. - block:
  19.  
  20. - name: Install Apache web Server CentOS
  21. yum: name=httpd update_cache=yes state=latest
  22.  
  23. - name: Start CentOS
  24. service: name=httpd state=started enabled=yes
  25. when: ansible_os_family== "CentOS"
  26.  
  27. when: ansible_os_family == "CentOS"
  28.  
  29. - name: Copy files in www CentOS&Debian
  30. # ИСПРАВЛЯЕМ: src={{ source_folder }}/{{ item }} меняем на src={{ item }}
  31. copy: src={{ item }} dest={{ destin_folder }} mode=0555
  32. loop:
  33. - "index.html"
  34. - "ico.png"
  35. notify:
  36. - Restart Apache CentOS
  37. - Restart Apache Debian

5. Исправляем основной Playbook
Возвращаемся к исходному файлу и убираем остатки:

  1. ---
  2. - name: Install Apache
  3. hosts: all
  4. become: yes
  5.  
  6. # удаляем vars, tasks, handlers - эти заголовки тут больше не нужны!
  7. vars:
  8.  
  9. tasks:
  10.  
  11. handlers:

в итоге получится чистый файл install_apache.yml:

  1. ---
  2. - name: Install Apache
  3. hosts: all
  4. become: yes

Чтобы запустить этот файл с ролью, дополняем в него следующее:

  1. ---
  2. - name: Install Apache
  3. hosts: all
  4. become: yes
  5.  
  6. roles:
  7. - install_apache2
  8. # можно указать несколько ролей
  9. # - install_mc
  10. # - install_mysql
  11.  
  12. # Если хотите запускать роль только на Linux:
  13. # - { role: install_apache2, when: ansible_system == 'Linux' }

Запускаем наш playbook с roles:

  1. ansible-playbook install_apache.yml
  2. PLAY [Install Apache] ***********************
  3. ...
  4. debi : ok=6 changed=2 unreachable=0 failed=0

Все работает. Спасибо всем!

Источник: http://linuxsql.ru