Ansible. Как перезапускать машины в кластере по одной

200 views
Skip to first unread message

Александр Акулов

unread,
Mar 16, 2015, 9:34:59 AM3/16/15
to devo...@googlegroups.com
Всем привет!
У меня есть ansible и кластер Кассандры, в рецепте прописано перезапускать сервис при изменении конфига.
Но такой простой алгоритм приведёт к остановке всего класстера, что недопустимо. Я хочу перезапустить сервис на одной машине, подождать когда зажгётся порт и перезапустить на следующей. Как подождать порт я знаю, но как перезапускать сервисы по очереди?


Alexander Zhuravlev

unread,
Mar 16, 2015, 9:59:50 AM3/16/15
to devo...@googlegroups.com

Александр Акулов

unread,
Mar 16, 2015, 10:39:54 AM3/16/15
to devo...@googlegroups.com
Тогда у меня весь плайбук будет выполняться последовательно, а мне нужно только одну службу перезапустить последовательно.


понедельник, 16 марта 2015 г., 18:59:50 UTC+5 пользователь Alexander Zhuravlev написал:

Alexander Zhuravlev

unread,
Mar 16, 2015, 11:45:23 AM3/16/15
to devo...@googlegroups.com
On Mon, Mar 16, 2015 at 07:39:54AM -0700, Александр Акулов wrote:
> Тогда у меня весь плайбук будет выполняться последовательно, а мне нужно
> только одну службу перезапустить последовательно.

Судя по докам ansible serial выставляется на весь playbook.
Очевидно, вам можно в основном playbook не выставлять serial
(чтобы он выполнился быстро), а ту часть, что необходимо делать на каждой
машине последовательно, вынести в отдельный playbook и выставить serial: 1.

>
>
> понедельник, 16 марта 2015 г., 18:59:50 UTC+5 пользователь Alexander
> Zhuravlev написал:
> >
> > On Mon, Mar 16, 2015 at 06:34:59AM -0700, Александр Акулов wrote:
> > > Всем привет!
> > > У меня есть ansible и кластер Кассандры, в рецепте прописано
> > перезапускать
> > > сервис при изменении конфига.
> > > Но такой простой алгоритм приведёт к остановке всего класстера, что
> > > недопустимо. Я хочу перезапустить сервис на одной машине, подождать
> > когда
> > > зажгётся порт и перезапустить на следующей. Как подождать порт я знаю,
> > но
> > > как перезапускать сервисы по очереди?
> >
> > Указать serial: 1?
> >
> >
> > https://support.ansible.com/hc/en-us/articles/201957797-Address-only-a-few-hosts-at-a-time
> >
>
> --
> Вы получили это сообщение, поскольку подписаны на группу devopsru.
>
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес devopsru+u...@googlegroups.com.
> Настройки подписки и доставки писем: https://groups.google.com/d/optout.

--
Alexander Zhuravlev

Timur Batyrshin

unread,
Mar 17, 2015, 1:21:48 AM3/17/15
to devo...@googlegroups.com
Разбить на два плейбука?
Один будет менять конфиги и создавать локальный флаг restart_cassandra (через delegate_to: localhost),
другой при наличии флага делать rolling restart.

понедельник, 16 марта 2015 г., 17:39:54 UTC+3 пользователь Александр Акулов написал:

Александр Акулов

unread,
Mar 17, 2015, 4:42:25 AM3/17/15
to devo...@googlegroups.com
Что-то я плохо врубаюсь как это сделать, можно примерчик нарисовать?
Не использовал delegate_to.

вторник, 17 марта 2015 г., 10:21:48 UTC+5 пользователь Timur Batyrshin написал:

Timur Batyrshin

unread,
Mar 17, 2015, 6:59:25 AM3/17/15
to devo...@googlegroups.com
С год уже ansible не пользовался, поэтому могу где соврать.

Примерно так.

Таск с хандлером в первом плейбуке:
tasks:
- name: create cassandra config
  template:
    ......
    ......
  notify:
    - restart flag

handlers:
- name: restart flag
  shell: "touch /var/run/cassandra_rolling_restart"
  delegate_to: 127.0.0.1

По-моему, 127.0.0.1 должен присутствовать в inventory, чтобы это сработало + где-то нужно указать параметр типа local, чтобы он по SSH на локалхост не долбился.


Во втором плейбуке уже делаем rolling restart как нам нужно и дергаем его уже только при наличии флага, типа:

[ -f /var/run/cassandra_rolling_restart ] && ansible rolling_restart.yml && rm -f /var/run/cassandra_rolling_restart


вторник, 17 марта 2015 г., 11:42:25 UTC+3 пользователь Александр Акулов написал:

Александр Акулов

unread,
Mar 18, 2015, 11:20:24 AM3/18/15
to devo...@googlegroups.com
Сделал следующим образом. Может кому пригодится
В хэдлере инициирую переменную если конфиг изменился:
- name: restart cassandra
  set_fact: cassandra_restart=True

Плейбук выглядит так:
- hosts: cassandra
  sudo: yes
  roles:
    - tools-net
    - cassandra

- hosts: cassandra
  gather_facts: False
  serial: 1
  tasks:
  - name: CASSANDRA RESTART
    service: name=cassandra state=restarted
    when: cassandra_restart is defined

  - name: WAIT CASSANDRA PORT
    wait_for: host={{ ansible_default_ipv4.address }} port={{ cassandra_rpc_port }}



понедельник, 16 марта 2015 г., 18:34:59 UTC+5 пользователь Александр Акулов написал:
Reply all
Reply to author
Forward
0 new messages