我在Windows主机上设置了Vagrant / Ansible。 Ansible设置为在Ubuntu guest上运行,因为Vagrant up
执行shell脚本,将provisioning yml
文件复制到guest虚拟机上,并在guest虚拟机上安装Ansible。
该脚本使用以下命令运行在guest虚拟机上设置的Ansible:
# 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
Ansible配置过程中的一个步骤是在/var/www
目录中设置Laravel的新副本。拉入Laravel之后,我的脚本会复制然后编辑文档根目录(.env
)中的/var/www
文件。
但问题在于,text file busy
消息失败了。这是作为来源和目的地在客人身上发生的副本,所以我想与VBox无关。我有一种感觉,它与文件名这么不寻常有关,但我还没有找到答案。
Laravel的task.yml
文件是:
---
- 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 }}
我也尝试使用模板方法,但错误相同:
- name: copy .env file
template: src=env.j2 dest={{ conf_file }}
我的conf文件包含:
conf_file: /var/www/.env
在复制步骤失败如下:
==> 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.
.env
源文件位于Laravel任务文件夹中名为files
的文件夹中,与我配置的其他项目相同,工作正常。文件.env
在失败后在www
文件夹中找不到,因此不会复制它。
答案 0 :(得分:10)
使用Ansible" copy"存在一些问题。虚拟机共享文件夹上的模块显然(cf https://github.com/ansible/ansible/issues/9526) - Vagrant设置的共享文件夹是/var/www/
目录吗?
也许首先尝试touch
创建文件,然后复制它:
变化:
- name: copy .env file
copy: src=env.j2 dest={{ conf_file }}
成:
- name: create .env file
shell: touch {{ conf_file }}
- name: copy .env file
copy: src=env.j2 dest={{ conf_file }}
编辑:某些用户在Ansible 1.9.3版本(2015年7月19日)中修复了此文件复制错误,但对于 Windows 上的人员仍然存在问题自2016-06-14起运行 Virtualbox (与vboxsf共享有关)的主机。 GitHub问题仍然关闭,但人们仍在评论,似乎正在提供可能的修复。
下面链接的解决方案似乎适用于大多数人(几个赞成票)。它建议将Ansible remote_tmp
配置设置添加到本地~/.ansible.cfg
,该设置指示Ansible在目标(共享)文件系统上使用临时文件夹:
https://github.com/ansible/ansible/issues/9526#issuecomment-199443969
答案 1 :(得分:1)
使用ansible 2.2你也可以设置unsafe_writes = yes