Распределите ssh открытые ключи среди хостов

Законченное движение sendmail маршрут обертки с помощью следующего ресурса: http://kb.parallels.com/1711

Существует способ найти то, от чего папки был выполнен Сценарий PHP, который отправляет почту. Отметьте, пути могут быть, немного отличаются от нижеупомянутого в зависимости от Вашей ОС и версии Plesk:

1) создайте/var/qmail/bin/sendmail-wrapper сценарий с содержанием:

!/bin/sh (повторяют X-Additional-Header: $PWD; кошка), | кладут-a для первого удара/var/tmp/mail.send |/var/qmail/bin/sendmail-qmail "$"

Отметьте, это должны быть эти две строки включая '#!/bin/sh'. 2) затем создайте файл журнала/var/tmp/mail.send и предоставьте ему "a+rw" права, сделайте обертку e> xecutable, переименуйте старый sendmail и свяжите его с новой оберткой: ~ # касаются/var/tmp/mail.send ~ # chmod a+rw/var/tmp/mail.send ~ # chmod a+x/var/qmail/bin/sendmail-wrapper ~ # mv/var/qmail/bin/sendmail/var/qmail/bin/sendmail-qmail ~ # ln-s/var/qmail/bin/sendmail-wrapper,/var/qmail/bin/sendmail 3) Ожидают в течение приблизительно одного часа и возвращаются sendmail назад:

~ # комната-f/var/qmail/bin/sendmail ~ # ln-s/var/qmail/bin/sendmail-qmail/var/qmail/bin/sendmail

Исследуйте/var/tmp/mail.send файл, должны быть строки, запускающиеся с "X-Additional-Header": указание папкам доменов, где сценарии, которые отправили почту, расположены. Вы видите, что все почтовые Сценарии PHP папок были выполнены от со следующей командой:

~ # grep X-Additional/var/tmp/mail.send | grep cat /etc/psa/psa.conf | grep HTTPD_VHOSTS_D | sed -e 's/HTTPD_VHOSTS_D//'

f Вы не видите вывода от команды выше, это означает, что никакая почта не была отправлена с помощью почты PHP () функция из Plesk виртуальный каталог хостов.

10
задан 15 June 2014 в 13:45
3 ответа

Я нашел решение, которое мне подходит. Я создаю открытые / закрытые ключи на своей машине, на которой запускается Ansible, и при первом подключении я вставляю ключи на место.

Затем я добавляю ключи от всех подчиненных устройств к главному устройству следующим образом:

# Tasks for PostgreSQL master
- name: add slave public key
  sudo: yes
  authorized_key: user=postgres state=present key="{{ lookup('file', '../../../keys/' + item + '/id_rsa.pub') }}"
  with_items: groups.databases_slave

Полное руководство можно найти на github.com/soupdiver/ansible-cluster .

5
ответ дан 2 December 2019 в 22:10

Я считаю, что в вашем случае должно работать следующее решение. Я использовал его для аналогичного сценария с центральным сервером резервного копирования и несколькими клиентами резервного копирования.

У меня есть роль (скажем, « db_replication_master »), связанная с сервером, получающим соединения:

    - role: db_replication_master
      db_slaves: ['someserver', 'someotherserver']
      db_slave_user: 'someuser' # in case you have different users
      db_master_user: 'someotheruser'
      extra_pubkeys: ['files/id_rsa.pub'] # other keys that need access to master

Затем мы создаем актуальные задачи в роли db_replication_master :

    - name: create remote accounts ssh keys
      user:
        name: "{{ db_slave_user }}"
        generate_ssh_key: yes
      delegate_to: "{{ item }}"
      with_items: db_slaves

    - name: fetch pubkeys from remote users
      fetch:
        dest: "tmp/db_replication_role/{{ item }}.pub"
        src: "~{{db_slave_user}}/.ssh/id_rsa.pub"
        flat: yes
      delegate_to: "{{ item }}"
      with_items: db_slaves
      register: remote_pubkeys
      changed_when: false # we remove them in "remove temp local pubkey copies" below

    - name: add pubkeys to master server
      authorized_key:
        user: "{{ db_master_user }}"
        key: "{{ lookup('file', item) }}"
      with_flattened:
        - extra_pubkeys
        - "{{ remote_pubkeys.results | default({}) | map(attribute='dest') | list }}"

    - name: remove temp local pubkey copies
      local_action: file dest="tmp/db_replication_role" state=absent
      changed_when: false

Итак, мы в основном:

  • динамически создаем ssh-ключи на тех подчиненных устройствах, у которых их еще нет
  • , затем мы мы используем delegate_to для запуска модуля fetch на ведомых устройствах и получения их ключей ssh ​​pubkeys на хост, на котором запущен ansible, также сохраняя результат этой операции в переменной, чтобы мы могли получить доступ к фактический список извлеченных файлов
  • после этого мы приступаем к обычной отправке извлеченных ключей ssh ​​pubkeys (плюс любые предоставленные дополнительные pubkeys) на главный узел с помощью модуля authorized_keys (мы используем пару фильтров jinja2, чтобы копать вне пути к файлам из переменной в приведенной выше задаче)
  • наконец, мы удаляем файлы pubkey локально cac hed на хосте, на котором работает ansible

Ограничение наличия одного и того же пользователя на всех хостах, вероятно, можно обойти, но из того, что я получил из вашего вопроса, это, вероятно, не проблема для вас (это немного более актуально для моего сценария резервного копирования ). Конечно, вы также можете сделать настраиваемым тип ключа (rsa, dsa, ecdsa и т. Д.).

Обновление : ой, я изначально использовал терминологию, специфичную для моей проблемы, а не вашей ! Теперь должно быть больше смысла.

5
ответ дан 2 December 2019 в 22:10

У меня такая же проблема, и я решил ее следующим образом:

---
# Gather the SSH of all hosts and add them to every host in the inventory
# to allow passwordless SSH between them
- hosts: all
  tasks:
  - name: Generate SSH keys
    shell: ssh-keygen -q -t rsa -f /root/.ssh/id_rsa -N ''
    args:
      creates: /root/.ssh/id_rsa

  - name: Allow passwordless SSH between all hosts
    shell: /bin/cat /root/.ssh/id_rsa.pub
    register: ssh_keys

  - name: Allow passwordless SSH between all hosts
    lineinfile:
      dest: /root/.ssh/authorized_keys
      state: present
      line:  " {{ hostvars[item]['ssh_keys']['stdout'] }}"
    with_items: "{{ groups['all']}}"
0
ответ дан 2 December 2019 в 22:10

Теги

Похожие вопросы