por que o rsync não está copiando arquivos para o servidor?

1

Estou acompanhando um Railscast que ensina como configurar o solo do Chef. Ele usa dois comandos de terminal interessantes que eu nunca tinha visto antes, apenas um dos quais eu posso começar a trabalhar. Quando eu faço

scp -r [email protected]:/var/chef .

Copia o conteúdo do diretório do servidor remoto para minha máquina local. O seguinte comando deve sincronizar os arquivos de volta ao servidor depois que eu os mudo na minha máquina

rsync -r . [email protected]:/var/chef

No entanto, as alterações não estão sendo exibidas no servidor remoto e, quando eu executo os comandos chefes que devem aplicar as alterações, ele não mostra nenhuma alteração que precise ser feita.

Estou usando o rsync incorretamente?

Atualizar

A execução deste comando deu a seguinte saída. Ainda não são mostradas alterações no servidor remoto

rsync -rvv . [email protected]:/var/chef


'building file list ... 
done
delta-transmission enabled
chef/node.json
chef/solo.rb
chef/cache/chef-client-running.pid
chef/cache/chef-stacktrace.out
chef/chef/node.json
chef/chef/solo.rb
chef/chef/cache/chef-client-running.pid
chef/chef/cache/chef-stacktrace.out
chef/chef/cookbooks/main/recipes/default.rb
chef/cookbooks/main/recipes/default.rb
chef/cookbooks/main/templates/default/zshrc.erb
total: matches=17  hash_hits=17  false_alarms=0 data=0
sent 1167 bytes  received 442 bytes  643.60 bytes/sec
total size is 6236  speedup is 3.88'

Atualizar

Você notará na atualização acima que um diretório templates deve estar dentro do diretório main (junto com o diretório recipes ), no entanto, é isso que está sendo exibido

root@Chef3:/var/chef/cookbooks# cd main
root@Chef3:/var/chef/cookbooks/main# ls
recipes
    
por Leahcim 21.07.2013 / 02:14

1 resposta

1

Você tem duas hierarquias de arquivos misturadas: /var/chef e /var/chef/chef . Parece que você está editando um e depois lendo o outro.

scp -r [email protected]:/var/chef . cria um diretório chef dentro do diretório atual. Se você executou isso de /var/chef .

Os comandos propostos são terríveis. Esqueça tudo o que você leu nesse tutorial.

scp -r não preserva permissões ou tempos de arquivo. Use scp -rp para preservá-los.

rsync -r não preserva permissões ou tempos de arquivo. Esqueça que a opção -r existe. Use rsync -a , que preserva todos os metadados usuais. Sempre passe a opção -a para o rsync, a menos que você tenha uma boa razão para não fazê-lo.

Quando você escreve rsync -a /path/to/source /path/to/destination , isso cria um subdiretório chamado source sob destination . Se você quiser sincronizar /path/to/source com /path/to/destination , adicione uma% final/ ao final do destino: rsync -a /path/to/source /path/to/destination/ copies /path/to/source/somefile to /path/to/destination/somefile .

É muito importante preservar os tempos de modificação do arquivo. Dessa forma, você sabe quando um arquivo foi modificado pela última vez. Suas ferramentas também sabem quando um arquivo foi modificado. Em particular, sincronizar um diretório grande no qual a maioria dos arquivos não foi modificada é muito mais rápido se os tempos de arquivo forem confiáveis. O rsync pulará um arquivo rapidamente se o nome, tamanho e hora de modificação forem os mesmos em ambos os lados.

Você pode dizer ao rsync para transferir apenas arquivos mais recentes no lado da origem, adicionando a opção -u ( rsync -au SOURCE DESTINATION ). Isso limita os riscos se os arquivos também tiverem sido editados no lado do destino: você não apagará a versão mais nova que está no lado do destino com a cópia mais antiga no lado da origem. No entanto, você não pode detectar conflitos com segurança: se um arquivo tiver sido editado em ambos os lados, a versão que tiver a modificação mais recente vencerá.

O Rsync é uma ferramenta para sincronizar dados em uma direção. Não o use para sincronizar nas duas direções. Em vez disso, use Unison . O Unison mantém uma lista de versões de arquivos cada vez que você o executar e reclamará em alta voz se houver algum conflito (o mesmo arquivo editado independentemente em ambos os lados). Contanto que não haja conflito (ou seja, desde que cada arquivo seja modificado apenas de um lado entre as sincronizações), o Unison mesclará as alterações nos dois lados.

Para configurar o Unison, use a GUI ou crie um arquivo de preferências chamado ~/.unison/chef.prf contendo

root = /var/chef
root = server.example.com:/var/chef
times = true

Execute unison -auto chef para sincronizar as duas árvores.

Em vez de sincronizar arquivos, você deve colocar seus arquivos em controle de versão . Quando você fizer alterações, confirme-as no repositório. Para implantar suas alterações, verifique-as no servidor.

    
por 22.07.2013 / 03:38

Tags