4

Я использую Ansible, среди прочего, для резервного копирования. Я запускаю ansible-playbook с пользователем без полномочий root (скажем, это user) и ssh как user . После этого я настроил повышение привилегий, чтобы стать пользователем root на каждом сервере. До сих пор проблем нет.

Чтобы получить удаленный каталог, у меня есть что-то эквивалентное следующему правилу:

- synchronize:
  mode: pull
  delete: true
  src: "{{ dir }}/"
  dest: "{{ tank_base }}/{{ inventory_hostname }}/{{ dir }}/"
  rsync_opts:
    - "--exclude=tmp*"
    - "--exclude=~*"
    - "--exclude=*~"
    - "--exclude=.gvfs/"
    - "--exclude=.cache/"

но для некоторого подкаталога это дает следующую ошибку (слегка отредактирован, чтобы скрыть личные данные):

Фатальный: [сервер]: СБОЙ! => {"updated": false, "cmd": "/usr/bin/rsync --delay-updates -F --compress --delete-after --архив --rsh 'ssh -S none -o StrictHostKeyChecking = нет '--exclude = tmp * --exclude = ~ * --exclude = * ~ --exclude = .gvfs/ --exclude = .cache/ --out-format =' <>% i% n% L ' \"сервер:/ var/ backup/ \" \"/ var/ tank/ snapshot/ server/ backup/ \" "," fail ": true," msg ":" rsync: opendir \"/ var/ backup/ subdir \"fail: Permission denied (13) \nrsync error: некоторые файлы / атрибуты не были перенесены (см. предыдущие ошибки) (код 23) в main.c (1650) [generator = 3.1.2] \n", "rc": 23}

Сбой подкаталога (/var/backup/subdir в приведенном выше случае) принадлежит root:root и он доступен для чтения / записи только владельцу. Я предполагаю, что rsync пытается извлечь файлы как user а не как root .

Как я могу извлечь эти каталоги, не ставя под угрозу безопасность и, возможно, ничего не меняя на стороне сервера? Ведь повышение привилегий уже на месте и работает.

2 ответа2

2

Ведь повышение привилегий уже на месте и работает.

Не совсем - модуль synchronize запускает rsync локально на машине управления, а не на целевом узле (для которого вы устанавливаете повышение привилегий). Документация модуля описывает это в деталях (выдержка ниже):

  • Пользователь и право доступа для синхронизироваться src принадлежит пользователю , выполняющей задачу анзибля на локальном хосте (или remote_user для delegate_to хоста , когда используются delegate_to

  • Пользователь и разрешения для синхронизированного dest - это права remote_user на хосте назначения или become_user если активен параметр become=yes .

Таким образом, он обращается к вашей исходной папке (server:/var/backup/ в примере) как user а не root .


Если вам не требуется пароль для user sudo на целевой машине (или вы просто настраиваете его таким образом для команды rsync ), вы можете использовать параметр Delegate_to delegate_to: <your_server> сочетании с rsync_path="sudo rsync" чтобы запустить его явно с sudo .

1

В Ansible 2.2.1.0 это сработало для меня:

- synchronize:
    mode: pull
    src: "/home/vagrant/dir1"
    dest: "/my_linux/dir1"
    recursive: yes
    delete: no
    times: yes

... и с этим инвентарем (для использования ansible_ssh_private_key_file var):

[vagrant1]
192.168.77.4

[vagrant1:vars]
ansible_user=vagrant
ansible_ssh_private_key_file="/Users/Chilcano/.vagrant.d/insecure_private_key"

Надеюсь, это поможет вам.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .