Alteração do Vagrantfile com o Ansible playbook para controlar a permissão de arquivo na pasta sincronizada do Vagrant para Trellis

8

Eu uso o Trellis para o meu desenvolvimento WordPress. Funciona muito bem, exceto que estou achando difícil alterar a permissão de arquivo (ou diretório) dentro da pasta sincronizada.

Geralmente estou bem com a configuração de permissão padrão. No entanto, às vezes eu preciso dar permissão de gravação para alguns dos subdiretórios do diretório sincronizado principal (NFS).

Este é o Vagrantfile que usa o Ansible playbook para a principal configuração da VM (eu uso o VirtualBox). Eu não sou um programador Ruby nem trabalhei com o Ansible, no entanto, pelo que parece, a seguir é a parte de Vagrantfileonde as permissões de arquivo estão sendo definidas:

if Vagrant::Util::Platform.windows? and !Vagrant.has_plugin? 'vagrant-winnfsd'
    wordpress_sites.each_pair do |name, site|
        config.vm.synced_folder local_site_path(site), remote_site_path(name, site), owner: 'vagrant', group: 'www-data', mount_options: ['dmode=776', 'fmode=775']
    end
    config.vm.synced_folder ANSIBLE_PATH, ANSIBLE_PATH_ON_VM, mount_options: ['dmode=755', 'fmode=644']
    config.vm.synced_folder File.join(ANSIBLE_PATH, 'bin'), bin_path, mount_options: ['dmode=755', 'fmode=755']
else
    if !Vagrant.has_plugin? 'vagrant-bindfs'
        fail_with_message "vagrant-bindfs missing, please install the plugin with this command:\nvagrant plugin install vagrant-bindfs"
    else
        wordpress_sites.each_pair do |name, site|
            config.vm.synced_folder local_site_path(site), nfs_path(name), type: 'nfs'
            config.bindfs.bind_folder nfs_path(name), remote_site_path(name, site), u: 'vagrant', g: 'www-data', o: 'nonempty'
        end
        config.vm.synced_folder ANSIBLE_PATH, '/ansible-nfs', type: 'nfs'
        config.bindfs.bind_folder '/ansible-nfs', ANSIBLE_PATH_ON_VM, o: 'nonempty', p: '0644,a+D'
        config.bindfs.bind_folder bin_path, bin_path, perms: '0755'
    end
end

Como posso fazer alterações nesse arquivo de forma a poder controlar a permissão para arquivos e pastas específicos quando preciso. Como a alteração da permissão na pasta vagrant sincronizada na máquina host não reflete na máquina virtual, devo pelo menos poder fazer isso alterando o arquivo Vagrant e, em seguida, re-provisionando.

Como conseguir isso com facilidade, que persistirá em um novo provisionamento futuro?

Scott
fonte
seu Vagrantfile é muito grande, talvez seria melhor para copiar a parte relevante para o cargo
SztupY
Atualizado com CODE
Scott

Respostas:

4

Existem duas partes desse arquivo Vagrant, uma feita para os hosts Windows (a primeira metade), a outra para hosts UNIX (a segunda metade), mas essencialmente a mesma coisa - apenas com plugins diferentes.

Você pode ver nos comandos config.vm.synced_foldere config.bindfs.bind_folderonde eles configuram os diretórios apropriados com as permissões apropriadas.

Para adicionar um novo diretório com permissões diferentes, basta adicioná-los à lista. Observe que File.join('a','b')simplesmente converte o caminho para a/b, mas é uma maneira melhor de fazê-lo, pois é independente da plataforma (no Windows também pode lidar \com caminhos de estilo).

Por exemplo, se você deseja dar /tmp/needswritemais permissão à pasta, basta adicionar as duas linhas a seguir nos locais apropriados:

Configuração do Windows:

config.vm.synced_folder File.join(ANSIBLE_PATH, 'tmp', 'needswrite'), File.join(ANSIBLE_PATH_ON_VM, 'tmp', 'needswrite'), mount_options: ['dmode=777', 'fmode=777']

Configuração do Unix:

config.bindfs.bind_folder File.join(ANSIBLE_PATH_ON_VM, 'tmp', 'needswrite'), File.join(ANSIBLE_PATH_ON_VM, 'tmp', 'needswrite'), perms: '0777'

Por exemplo, isso definirá sua permissão para, em 777vez do padrão755

Observe que na configuração do Windows você deve mapear de ANSIBLE_PATHpara ANSIBLE_PATH_ON_VM, enquanto no bind de configuração do Unix fará uma remontagem, portanto, é necessário combiná-los com o mesmo nome de diretório.

Você também pode jogar com usuários e grupos:

Configuração do Windows:

config.vm.synced_folder File.join(ANSIBLE_PATH, 'tmp', 'needswrite'), File.join(ANSIBLE_PATH_ON_VM, 'tmp', 'needswrite'), owner: 'new-owner', group: 'new-group', mount_options: ['dmode=755', 'fmode=755']

Configuração do Unix:

config.bindfs.bind_folder File.join(ANSIBLE_PATH_ON_VM, 'tmp', 'needswrite'), File.join(ANSIBLE_PATH_ON_VM, 'tmp', 'needswrite'), u: 'new-owner', g: 'new-group', perms: '0777'

Aqui nós os configuramos para usar usuário new-ownere gruponew-group

SztupY
fonte