5

这应该很容易,但我已经尝试了一个小时。我的代码让 Ansible 复制.vimrc到每个主机,但.vim被默默忽略。

---
- name: vim pkg
  apt: pkg=vim state=installed

- name: vim dirs
  file: path=/home/jefdaj/.vim state=directory
  file: path=/root/.vim        state=directory

- name: vim files

  # these work
  copy: src=vim/vimrc dest=/home/jefdaj/.vimrc force=yes
  copy: src=vim/vimrc dest=/root/.vimrc        force=yes

  # but these don't
  copy: src=vim/bundle dest=/home/jefdaj/.vim/bundle force=yes recurse=yes
  copy: src=vim/bundle dest=/root/.vim/bundle        force=yes recurse=yes

那是怎么回事?我在路径上尝试了很多变化。它发生在 Debian 的 ansible 1.5.5 以及当前的 git 版本中。

编辑:现在它尝试复制,但在创建多个目录之一时总是失败,并出现如下错误OSError: [Errno 2] No such file or directory: '/root/.vim/bundle/bundle/vim-easymotion/autoload/vital/Over'

4

2 回答 2

6

不知道为什么会copy失败,但解决方案是synchronize改用。这有效:

- name: vim files
  synchronize:
    src=/absolute/repo/path/roles/common/files/{{ item.src }}
    dest={{ item.dst }}
  with_items:
    - {src: vim/bundle, dst: /home/jefdaj/.vim  }
    - {src: vim/vimrc , dst: /home/jefdaj/.vimrc}
    - {src: vim/bundle, dst: /root/.vim         }
    - {src: vim/vimrc , dst: /root/.vimrc       }

- name: vim permissions
  file: path={{ item.pth }} owner={{ item.own }} group={{ item.grp }} recurse=yes
  with_items:
    - {pth: /root/.vim         , own: root  , grp: root  }
    - {pth: /root/.vimrc       , own: root  , grp: root  }
    - {pth: /home/jefdaj/.vim  , own: jefdaj, grp: jefdaj}
    - {pth: /home/jefdaj/.vimrc, own: jefdaj, grp: jefdaj}

我不得不硬编码基本路径,因为它似乎不能正确处理相对路径。

于 2014-05-22T17:33:19.213 回答
1

你的filecopy任务的问题是一个任务中有多个动作。Ansible 任务只能有一个操作。

如下改变你的玩法,它应该可以工作:

---
- name: vim pkg
  apt: pkg=vim state=installed

- name: vim dir for jefdaj
  file: path=/home/jefdaj/.vim state=directory

- name: vim dir for root
  file: path=/root/.vim        state=directory

...

这同样适用于“vim 文件”任务:将它们分成四个任务。

于 2014-08-19T08:39:07.177 回答