Решено: Взаимосвязанные задачи на разных хостах в ansible

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модератор: SLEDopit

Ответить
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Bizdelnick »

Недавно начал осваивать ansible. Подскажите, кто с ним знаком, как лучше провернуть следующую вещь.
Имеется задача, для которой нужно одновременно изменить конфигурацию двух машин, но изменения должны быть разные. Конкретно, на одной машине работает сервер openvpn, на другой поднимается клиент. Надо сгенерить ключ с сертификатом и раскидать их вместе с конфигами по соответствующим хостам. В будущем клиенты будут добавляться, и хотелось бы этот процесс максимально упростить.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Stauffenberg »

В файле host создаете группу clients (cначала в группе один хост) и пишете правила для клинских систем. Потом добавляете в host адреса/hostnames и ansible подхватывает все системы из списка clients.

Упрощенный configure_clients.yml

Код: Выделить всё

- name: clients
 hosts: clients

tasks:
 - command: scp что-то куда-то
 - command: restart openvpn client

Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Bizdelnick »

Stauffenberg писал(а):
11.01.2017 01:59

Код: Выделить всё

  - command: scp что-то куда-то

Так мне не надо «что-то куда-то», мне надо что надо куда надо. ☺
Такой костыль не будет работать просто-напросто потому что у юзера на клиенте нет ssh-доступа насервер, как и у юзера на сервере нет ssh-доступа на клиент. Конфиги надо деплоить централизованно, для чего ansible вроде как и предназначен.
К тому же я не знаю, как прописать это «куда-то». Допустим, есть хосты server и clients. Как в плейбуке для clients указать адрес server?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Stauffenberg »

SSH конфигурация на столько само собой разумеющийся шаг перед использованием ansible, что я не счел нужным об этом писать. Приношу свои извинения :)
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Bizdelnick »

Stauffenberg писал(а):
11.01.2017 13:46
SSH конфигурация на столько само собой разумеющийся шаг перед использованием ansible

Правильно, я настраиваю доступ со своей машины ко всем конфигурируемым хостам. Что, мне ещё и доступ между ними во всех возможных комбинациях надо настраивать? Это помимо того, что муторно, ещё и небезопасно: компроментация любого хоста приведёт к компроментации всех остальных.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Bizdelnick »

То, что мне было нужно, — это делегирование задач.

Bizdelnick писал(а):
11.01.2017 13:59
компроментация любого хоста приведёт к компроментации всех остальных.
Впрочем, в свете последних новостей такой ерундой париться смысла нет.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Bizdelnick »

Вкратце та часть решения, для которой потребовалось делегирование, выглядит так:

Код: Выделить всё

---
- hosts: clients
  vars:
    ca_server: server.example.com
    easyrsa_path: /path/to/easy-rsa/2.0
  tasks:
  - name: check if certificate deployed
    stat:
      path: /etc/openvpn/{{ ansible_hostname }}.key
    register: cert
  - name: create key and certificate
    when: not cert.stat.exists
    delegate_to: "{{ ca_server }}"
    shell: >
      cd {{ easyrsa_path }} &&
      . ./vars &&
      ./pkitool {{ ansible_hostname }}
  - name: fetch private key and certificate
    when: not cert.stat.exists
    delegate_to: "{{ ca_server }}"
    with_items:
      - "{{ easyrsa_path }}/keys/{{ ansible_hostname }}.key"
      - "{{ easyrsa_path }}/keys/{{ ansible_hostname }}.crt"
    fetch:
      src: "{{ item }}"
      dest: tmp/
      flat: yes
      fail_on_missing: yes
  - name: deploy private key
    when: not cert.stat.exists
    copy:
      src: tmp/{{ ansible_hostname }}.key
      dest: /etc/openvpn/{{ ansible_hostname }}.key
      mode: 0600
  - name: deploy certificate
    when: not cert.stat.exists
    copy:
      src: tmp/{{ ansible_hostname }}.crt
      dest: /etc/openvpn/{{ ansible_hostname }}.crt
      mode: 0644
  - name: local cleanup
    become: no
    with_fileglob:
      - tmp/{{ ansible_hostname }}.*
    local_action: file path={{ item }} state=absent

Буду благодарен за советы по улучшению. Пока не вижу, как можно сделать проще, но громоздкость конструкции мне не нравится.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Stauffenberg »

Bizdelnick писал(а):
11.01.2017 13:59
Это помимо того, что муторно, ещё и небезопасно: компроментация любого хоста приведёт к компроментации всех остальных.

Каким образом компроментация любого хоста может проивести к компроментации всех остальных, если доступ только в одну сторону с одного хоста?
Мы явно говорим с Вами о разных вещах :)
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
ieleja
Сообщения: 307
ОС: Debian 9, macOS, Windows
Контактная информация:

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение ieleja »

и за предположения, что:

мне ещё и доступ между ними во всех возможных комбинациях надо настраивать?
ad infinitum
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Stauffenberg »

Bizdelnick писал(а):
12.01.2017 17:01
Буду благодарен за советы по улучшению.

Я думаю, Вам сначала надо разобраться как устроен и правильно пользоваться ansible. Пока же советы тех. кто пользуется ansible, будут Вами восприняты как "костыли".
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Bizdelnick »

Stauffenberg
Разобраться мне, безусловно, придётся. Сделайте одолжение и помогите в этом немножко: объясните, где ошибка в моих рассуждениях.
Вы предложили использовать scp для копирования файла с хоста A на хост B. Это значит, что пользователь на хосте A должен иметь доступ на хост B, видимо по незапароленному ключу или каким-то ещё образом, не предполагающим ввода пароля. Вывод: в случае компроментации хоста A злоумышленник получит ключ для доступа к хосту B, то есть автоматически будут скомпроментированы они оба.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Stauffenberg »

Bizdelnick
Да, один хост должен иметь доступ ко всем остальным. Но Вы написали
компроментация любого хоста приведёт к компроментации всех остальных.


Если вероятность взлома этой системы на столько высока, можно придумать что-то с private ключем... например, удалять его с этой системы и копировать обратно, когда снова понадобится доступ. Лучшем решением было бы конечно что-то типа Kerberos, где ввод пароля создает сертификат на определенное время, но я думаю стоит просто лучше продумать безопасность системы с private ключем, а не выдумывать костыли.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Bizdelnick »

Stauffenberg писал(а):
12.01.2017 21:45
Да, один хост должен иметь доступ ко всем остальным. Но Вы написали

Это не я написал, это Вы написали
Stauffenberg писал(а):
11.01.2017 01:59

Код: Выделить всё

 - command: scp что-то куда-то

Если я неправильно понял, что Вы имели в виду (а это вполне вероятно, потому что приведённый Вами код похож на что угодно, только не на работоспособную пьесу), то поясните это. А с ключами я как-нибудь разберусь без помощи зала.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Stauffenberg »

Bizdelnick писал(а):
12.01.2017 22:41
приведённый Вами код похож на что угодно, только не на работоспособную пьесу

Продолжать беседу, думаю, бессмысленно.


Эту команду тоже можно запускать с того единстввенного хоста через SSH, который имеет доступ ко всем остальным. Не стоит интерпретировать это как код. Это просто один из подходов, как это можно было бы сделать, т.е. пример или псевдкод, если хотите :)

Код: Выделить всё

 - command: restart openvpn client

Никакой магии. Всего лишь удаленная команда, т.е. запущенная через ssh, к примеру. Т.е. сначала копируем все конфиги, затем перезагружаем интерфейс. Запускается ansible скрипт на одном и том же хосте каждый раз.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Решено: Взаимосвязанные задачи на разных хостах в ansible

Сообщение Bizdelnick »

Stauffenberg писал(а):
12.01.2017 23:29
Продолжать беседу, думаю, бессмысленно.

Аминь.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить