Ansible文本文件繁忙错误

时间:2015-09-02 06:50:43

标签: ansible ansible-playbook file-copying

我在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文件夹中找不到,因此不会复制它。

2 个答案:

答案 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