Permissão negada no módulo de sincronização Ansible

4

Estou usando o Ansible, entre outras coisas, para fins de backup. Eu corro ansible-playbook com um usuário non-root (digamos que é user ) e ssh como user . Depois disso, configurei o escalonamento de privilégios para se tornar root em todos os servidores. Até agora, sem problemas.

Para buscar um diretório remoto, tenho algo equivalente à seguinte regra:

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

mas para algum subdiretório ele apresenta o seguinte erro (ligeiramente editado para ocultar dados pessoais):

fatal: [server]: FAILED! => {"changed": false, "cmd": "/usr/bin/rsync --delay-updates -F --compress --delete-after --archive --rsh 'ssh -S none -o StrictHostKeyChecking=no' --exclude=tmp* --exclude=~* --exclude=*~ --exclude=.gvfs/ --exclude=.cache/ --out-format='<>%i %n%L' \"server:/var/backup/\" \"/var/tank/snapshot/server/backup/\"", "failed": true, "msg": "rsync: opendir \"/var/backup/subdir\" failed: Permission denied (13)\nrsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1650) [generator=3.1.2]\n", "rc": 23}

O subdiretório que falha ( /var/backup/subdir no caso acima) é de propriedade de root:root e é legível / gravável apenas pelo proprietário. Meu palpite é que rsync está tentando extrair os arquivos como user em vez de root .

Como posso puxar esses diretórios sem comprometer a segurança e, possivelmente, sem alterar nada no lado do servidor? Depois de todo o escalonamento de privilégios já estar em vigor e funcionando.

    
por ntd 20.11.2016 / 13:55

2 respostas

2

After all privilege escalation is already in place and working.

Não exatamente - synchronize module executa rsync localmente na máquina de gerenciamento, não no nó de destino (para o qual você configurou o escalonamento de privilégios). A documentação do Módulo descreve isso em detalhes (um trecho abaixo):

  • The user and permissions for the synchronize src are those of the user running the Ansible task on the local host (or the remote_user for a delegate_to host when delegate_to is used).

  • The user and permissions for the synchronize dest are those of the remote_user on the destination host or the become_user if become=yes is active.

Por isso, está acessando sua pasta de origem ( server:/var/backup/ no exemplo) como user not root .

Se você não precisar de senha para o user to sudo na máquina de destino (ou apenas configurá-lo desta forma para o comando rsync ), poderá usar o parâmetro delegate_to: <your_server> combinado com rsync_path="sudo rsync" para executá-lo explicitamente com sudo .

    
por 11.12.2016 / 07:33
1

No Ansible 2.2.1.0 isso funcionou para mim:

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

... e com este inventário (para usar 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"

Espero que ajude você.

    
por 19.04.2017 / 10:03