in devops ~ read.

Что Ansible новый нам готовит

Ansible - удобный и простой инструмент для конфигурирования серверов и развёртывания на них ПО в автоматическом режиме, который позволяет оперировать не просто каким-то набором скриптов, а предоставляет абстракции, которые упрощают понимание выполняемых действий и скрывают сложность на различных уровнях.

Например, на самом высоком уровне установка сервера приложений JBoss может выглядеть следующим образом:

# This playbook deploys a simple standalone JBoss server. 

- hosts: jboss-servers 
  remote_user: root

  roles:
    - jboss-standalone

Если спуститься ниже, то там можно увидеть уже следующее:

---
- name: Install Java 1.7 and some basic dependencies
  yum: name={{item}} state=present
  with_items:
   - unzip
   - java-1.7.0-openjdk

// ТУТ МНОГО МНОГО КОММАНД

- name: Enable JBoss to be started at boot
  service: name=jboss enabled=yes state=started 

- name: deploy iptables rules
  template: src=iptables-save dest=/etc/sysconfig/iptables
  notify: restart iptables

И оказывается, что там всё не так просто. И если конкретно в этом случае сама по себе роль полностью закончена, то в реальных проектах есть зависимости между ролями, какие-то вещи нужно делать для всех ролей, и вот тут с нарастанием сложности Ansible начинает "проседать". Разумеется нерешаемых задач нет. С помощью копипаста можно вообще сделать всё, что угодно, но поддерживать это поделие рано или поздно станет невозможно.

Чтобы облегчить жизнь, Ansible в версии V2, которую обещают выпустить в середине июля, приготовил нам следующее:

include + with

Теперь не нужно делать так:

- hosts:all 
  gather_facts:false 
  tasks: 
    - include:foo.yml some_var=a
    - include:foo.yml some_var=b
    - include:foo.yml some_var=c

Потому что можно сделать вот так:

- hosts:all 
  gather_facts:false 
  tasks: 
    - include:foo.yml some_var={{item}} 
      with_items: 
      - a 
      - b 
      - c

Преимущества начинаются когда item сам содержит несколько полей.

Блоки

Это, пожалуй, самое интересное нововведение. Блок похож на try-catch-finally в современных языках программирования и позволяет писать сценарии с возможностью отката просто и понятно.

tasks:  
    - block: 
        - command: /bin/false 
        - debug: msg="youshouldn'tseeme" 
      rescue: 
        - debug: msg="thisistherescue" 
        - command: /bin/false 
        - debug: msg="youshouldn'tseethiseither" 
      always: 
          - debug: msg="thisisthealwaysblock,itwillalwaysbeseen"

Блоки могу быть вложенными:

- block:
    - block:
        - block: 
            - command: /bin/false

Блоки могут группировать задачи:

- block: 
    - command: some command
    - command: other command
    when: some condition
    tags: some_tag

Стратегии выполнения

Ansible запускает задачи последовательно на некоторой группе хостов. Сейчас можно поиграться с настройкой количества серверов обновляемых за один раз, но в любом случае остальным серверам нужно ждать предыдущие либо горизонтально, либо вертикально. В новой версии добавлена новая стратегия free, которая обновляет каждый сервер как можно скорее, не дожидаясь остальных. Фактически, теперь задачи могут выполняться параллельно на всех серверах. Это круто. Ну а если предоставленных возможностей не хватает, вы знаете что делать - писать свой плагин.

И по мелочи

Теперь можно устанавливать значения become_ переменных в ролях и блоках, чтобы дать расширенные права на какую-то роль или набор команд:

- block:
    - command: some command
    become_user: root

Внутренности тоже были переработаны: улучшенный менеджмент переменных и улучшенное использование ООП. Это будет интересно, если вы пишите плагины.

Break them all

Playbook-и не будут затронуты и продолжат работать - это хорошо.
В реальной жизни, если используются не базовые плагины, то они могут перестать работать :).

IMHO

Анонс лично меня разочаровал. Нововведения есть, но их не так много. Разве что параллельное выполнение и блоки. В последние нельзя включить роли. Печаль.

comments powered by Disqus