2015-09-02 18 views
5

Ho una configurazione Vagrant/Ansible sul mio host Windows. Ansible è configurato per l'esecuzione sul guest Ubuntu, come Vagrant up esegue uno script di shell che copia i file provisioning yml sul guest e installa Ansible anche sul guest.Errore occupato file di testo occupato

Lo script viene eseguito l'Ansible istituito sul guest con il seguente comando:

# Ansible installations 
sudo apt-get install -y ansible 

# Copy all Ansible scripts to the ubuntu guest 
sudo cp -rf -v /vagrant/provisioning /home/vagrant/ 

# cp /vagrant/hosts /home/vagrant/ 
sudo chmod 666 /home/vagrant/provisioning/hosts 

# Install roles 
sudo ansible-playbook /home/vagrant/provisioning/local.yml -i /home/vagrant/provisioning/hosts --connection=local 

Una delle fasi del processo di configurazione Ansible è la creazione di una nuova copia di laravel nella directory /var/www. Dopo aver inserito Laravel, il mio script copia e quindi modifica il file .env nella root del documento (/var/www).

Ma questo è il problema, non riesce con il messaggio text file busy. Questa è una copia che sta accadendo sul guest come sorgente e destinazione, quindi non credo che nulla abbia a che fare con VBox. Ho la sensazione che abbia a che fare con il nome del file che è così insolito, ma non ho trovato una risposta.

Il mio file task.yml per laravel è:

--- 
- name: Clone git repository 
    git: > 
     dest=/var/www 
     repo=https://github.com/laravel/laravel.git 
     update=no 
    sudo: yes 
    sudo_user: www-data 
    register: cloned 

- name: copy .env file 
    copy: src=env.j2 dest={{ conf_file }} 

- name: set APP_DOMAIN={{ server_name }} 
    lineinfile: dest=/var/www/.env regexp='^APP_DOMAIN=' line=APP_DOMAIN={{ server_name }} 

Ho anche provato con il metodo del modello con lo stesso errore:

- name: copy .env file 
    template: src=env.j2 dest={{ conf_file }} 

mio file di configurazione contiene:

conf_file: /var/www/.env 

Non riesce nella fase di copia come segue:

==> default: TASK: [laravel | copy .env file] ********************************************** 
==> default: failed: [10.0.1.10] => {"failed": true, "md5sum": "a380715fa81750708f7b9b6fea1a48fe"} 
==> default: msg: Could not replace file: /root/.ansible/tmp/ansible-tmp-1441176559.19-197929606462535/source to /var/www/.env: [Errno 26] Text file busy 
==> default: 
==> default: FATAL: all hosts have already failed -- aborting 
==> default: 
==> default: PLAY RECAP ******************************************************************** 
==> default:   to retry, use: --limit @/root/local.retry 
==> default: 
==> default: 10.0.1.10     : ok=21 changed=18 unreachable=0 failed=1 
The SSH command responded with a non-zero exit status. Vagrant 
assumes that this means the command failed. The output for this command 
should be in the log above. Please read the output to determine what 
went wrong. 

Il file di origine .env si trova in una cartella denominata files fuori dalla cartella delle attività di Laravel, come gli altri elementi configurati che funzionano correttamente. Il file .env non si trova nella cartella www dopo che non riesce, quindi non lo copia.

risposta

10

Ci sono stati alcuni problemi con l'utilizzo del modulo "copia" di Ansible sulle cartelle condivise di Virtualbox apparentemente (cf https://github.com/ansible/ansible/issues/9526) - la directory /var/www/ è una cartella condivisa configurata da Vagrant?

Forse provare touch ing il file prima di creare, poi copiarlo:

Cambio:

- name: copy .env file 
    copy: src=env.j2 dest={{ conf_file }} 

in:

- name: create .env file 
    shell: touch {{ conf_file }} 
- name: copy .env file 
    copy: src=env.j2 dest={{ conf_file }} 

EDIT: errore di copia Questo file è stato corretto nella versione 1.9.3 di Ansible (19 luglio 2015) per alcuni utenti, ma è ancora un problema per le persone su Host Windows in esecuzione Virtualbox (da fare con condivisione vboxsf) a partire dal 2016-06-14. Il problema di GitHub è ancora chiuso, ma le persone continuano a commentare e sembrano fornire possibili correzioni.

La soluzione collegata di seguito sembra funzionare per la maggior parte delle persone (diversi upvotes).Si suggerisce di aggiungere l'impostazione di configurazione Ansible remote_tmp al vostro locale ~/.ansible.cfg che istruisce Ansible di utilizzare una cartella temporanea sul bersaglio (comune) file system:

https://github.com/ansible/ansible/issues/9526#issuecomment-199443969

+0

Ciao @Ocean, grazie. Sì, '/ var/www' è la cartella condivisa, e ho visto il bug a cui mi riferisci, ma era del novembre 2014. Non è ancora stato risolto? A proposito, altri file copiano OK attraverso questo processo ma non nella cartella 'www' ... – TheRealPapa

+0

Inoltre, quale versione di Ansible viene installata sulla scatola di Ubuntu? – ocean

+0

Ciao @ocean, tutti i componenti la versione più recente (ora) su Windows 10. Ora sto provando il tuo suggerimento e ti riporterò. Grazie. – TheRealPapa

0

con ansible 2.2 è anche possibile impostare unsafe_writes = yes

Problemi correlati