3.Ansible: роли (roles)

Thank you for reading this post, don't forget to subscribe!

Роли отлич­но под­хо­дят для орга­ни­за­ции раз­лич­ных, но свя­зан­ных меж­ду собой задач (task), и раз­ме­ще­ния всех свя­зан­ных с эти­ми зада­ча­ми дан­ных в одном месте.

Для при­ме­ра — выпол­ним уста­нов­ку NGINX, кото­рая будет вклю­чать в себя добав­ле­ние фай­ла репо­зи­то­рия, уста­нов­ку паке­тов и уста­нов­ку фай­ла кон­фи­гу­ра­ции виртуалхоста

Роли име­ют свою струк­ту­ру ката­ло­гов, кото­рая выгля­дит так:

1 rolename
2  - files
3  - handlers
4  - meta
5  - templates
6  - tasks
7  - vars

Внут­ри каж­дой (кро­ме files и templates) дирек­то­рии — Ansible будет искать и читать фай­лы main.yml.

На сер­ве­ре с Ansible cоз­да­ём необ­хо­ди­мые каталоги:

01 $ mkdir -p ~/ansible/roles/nginx
02 $ cd ~/ansible/roles/nginx
03 $ mkdir files handlers meta templates tasks vars
04 $ tree -d -L 1
05 .
06 ├── files
07 ├── handlers
08 ├── meta
09 ├── tasks
10 ├── templates
11 └── vars

По фак­ту — не обя­за­тель­но исполь­зо­вать все дирек­то­рии, и не обя­за­тель­но все их создавать.

Назна­че­ние директорий:

  • files: содер­жит фай­лы, кото­рые будут ско­пи­ро­ва­ны на настра­и­ва­е­мые хосты; так же — может содер­жать скрип­ты, кото­рые поз­же будут запус­кать­ся на хостах;
  • handlers: обра­бот­чи­ки, кото­рые будут исполь­зо­вать­ся при выпол­не­нии задач;
  • meta: опи­са­ние зави­си­мо­стей, т.е. — ролей, кото­рые долж­ны быть обра­бо­та­ны перед запус­ком настра­и­ва­е­мой роли и мета-дан­ных, таких как автор, опи­са­ние про­дук­та и прочее;
  • templates: шаб­ло­ны фай­лов с переменными;
  • tasks: все зада­чи, кото­рые ранее были опи­са­ны в Playbook-е;
  • vars: пере­мен­ные для шаблонов.

 

Files

Тут мы раз­ме­стим файл репо­зи­то­ия NGINX — files/nginx.repo:

Handlers

Созда­ём файл handlers/main.yml и впи­сы­ва­ем в него наши обработчики:

[codesyntax lang="bash"]

[/codesyntax]

Meta

В дан­ном слу­чае зави­си­мо­стей и мета-дан­ных нет, поэто­му — либо мож­но оста­вить дирек­то­рию пустой, либо создать файл meta/main.yml с пустым опи­са­ни­ем зависимостей:

[codesyntax lang="bash"]

[/codesyntax]

Если же вы захо­ти­те доба­вить роль-зави­си­мость, напри­мер — уста­нов­ку PHP-FPM, это мож­но сде­лать так:

[codesyntax lang="bash"]

[/codesyntax]

Эта роль будет выпол­не­на перед выпол­не­ние роли nginx.

 

Template

Созда­дим шаб­лон фай­ла настро­ек для виртуалхоста.

Как и в слу­чае с кало­гом Files — тут не обя­за­тель­но созда­вать main.yml, а доста­точ­но создать фай­лы с нуж­ны­ми вам именами.

Напри­мер — созда­дим файл templates/ans2.domain.local.conf:

[codesyntax lang="bash"]

[/codesyntax]

Тут мы исполь­зу­ем три переменные:

  • {{ hostname }}
  • {{ user }}
  • {{ cgi_port }}

Variables

Теперь — зада­дим пере­мен­ные для шаб­ло­на и задач.

Кро­ме пере­мен­ных в шаб­лоне — мы исполь­зу­ем ещё одну — {{ root }} в опи­са­нии зада­чи, доба­вим и её сюда.

Созда­ём файл vars/main.yml с таким содержимым:

[codesyntax lang="bash"]

[/codesyntax]

 

Tasks

Теперь — собе­рём всё в одну задачу.

В ката­ло­ге Tasks созда­ём файл tasks/main.yml:

[codesyntax lang="bash"]

[/codesyntax]

Теперь — нам необ­хо­ди­мо ука­зать Ansible где искать опи­са­ния ролей.

Редак­ти­ру­ем файл /etc/ansible/ansible.cfg и нахо­дим блок:

Гото­во.

На хосте cent_ans_client1 проверяем: