5.Ansible.роли, условия и циклы

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

Для сокра­ще­ния коли­че­ства задач в набо­рах инструк­ций (playbook) разум­но исполь­зо­вать цик­лы. Напри­мер, ино­гда тре­бу­ет­ся уста­но­вить несколь­ко паке­тов на один и тот же уда­лен­ный хост или выпол­нить несколь­ко опе­ра­ций над одним и тем же ресурсом.

Рас­смот­рим про­стой playbook, кото­рый помо­жет уста­но­вить несколь­ко паке­тов на уда­лен­ный сервер:

Что­бы зада­чи выпол­ня­лись толь­ко в опре­де­лен­ном слу­чае, мож­но (и нуж­но) ука­зы­вать усло­вия с помо­щью when:.

В усло­ви­ях в Ansible для срав­не­ния исполь­зу­ют­ся == (рав­но), != (не рав­но), > (боль­ше), <(мень­ше), >= (боль­ше рав­но), <= (мень­ше равно).

Мож­но так­же ука­зать несколь­ко усло­вий с помо­щью опе­ра­то­ров and (и) и or (или). Для про­вер­ки вхож­де­ния сим­во­ла или подстроки

в стро­ку исполь­зу­ют­ся опе­ра­то­ры in и not.

Для про­вер­ки рабо­ты неко­то­рых усло­вий в Ansible созда­дим playbook сле­ду­ю­ще­го содержания:

В архи­тек­ту­ре про­ек­та обыч­но сер­ве­ра раз­де­ля­ют­ся по сво­е­му пред­на­зна­че­нию и выпол­ня­ют опре­де­лен­ную роль - web-сервер,

сер­вер баз дан­ных, поч­то­вый сер­вер и т. д. Каж­до­му из сер­ве­ров тре­бу­ет­ся отли­ча­ю­щий­ся набор паке­тов и настро­ек для правильного

выпол­не­ния сво­ей роли. С ростом коли­че­ства сер­ве­ров будет рас­ти коли­че­ство набо­ров инструк­ций (playbook), кото­рые будут

исполь­зо­вать­ся повтор­но. Ansible поз­во­ля­ет удоб­но орга­ни­зо­вать и струк­ту­ри­ро­вать набо­ры инструк­ций в соот­вет­ствии с

роля­ми сер­ве­ров. При­мер струк­ту­ры набо­ра инструк­ций с роля­ми выгля­дит так:

Путь к ката­ло­гу с роля­ми мож­но задать с помо­щью пара­мет­ра roles_path в кон­фи­гу­ра­ци­он­ном фай­ле Ansible. При ука­за­нии ролей мож­но исполь­зо­вать тэги.

Так­же для каж­дой роли будут при­ме­нять­ся сле­ду­ю­щие правила:

  • если суще­ству­ет roles/.../tasks/main.yml, то зада­чи из это­го фай­ла будут добав­ле­ны в набор инструкций;
  • если суще­ству­ет roles/.../handlers/main.yml, то обра­бот­чи­ки из это­го фай­ла будут добав­ле­ны в набор инструкций;
  • если суще­ству­ет roles/.../vars/main.yml, то пере­мен­ные из это­го фай­ла будут добав­ле­ны в набор инструкций;
  • если суще­ству­ет roles/.../meta/main.yml, то любые роли-зави­си­мо­сти будут добав­ле­ны в спи­сок ролей;
  • зада­ча копи­ро­ва­ния может ссы­лать­ся на файл в roles/.../files без ука­за­ния абсо­лют­но­го или отно­си­тель­но­го пути;
  • скрип­то­вая зада­ча может ссы­лать­ся на скрипт в roles/.../files без ука­за­ния абсо­лют­но­го или отно­си­тель­но­го пути;
  • зада­ча шаб­ло­ни­за­ции может ссы­лать­ся на roles/.../templates без ука­за­ния абсо­лют­но­го или отно­си­тель­но­го пути;
  • импор­ти­ру­е­мые зада­чи могут ссы­лать­ся на фай­лы в roles/.../tasks без ука­за­ния абсо­лют­но­го или отно­си­тель­но­го пути.