如何使用ansible来配置vim vundle插件?

17

我使用vundle作为vim的插件管理器。我想使用ansible自动安装vundle插件。

但是我无法让ansible自动进行配置:

- name: install vundle plugin
  shell: vim +PluginInstall +qall

上面是用于安装vim的Ansible Playbook YML文件。当Ansible开始运行这个任务时,它会一直执行下去,永远不会结束也不会失败。直到我强制停止它按下CTRL C

如果我在虚拟机中直接运行该命令,它能够正常工作,vim应该会显示并完成安装。

问题出在哪里呢?

==========================================
编辑:

在阅读了Roy Zuo的回答后,打开了vim的详细模式,我尝试了以下命令:

vim -E -s -c "source ~/.vimrc" +PluginInstall +qall -V

以下是输出结果:

continuing in /home/vagrant/.vimrc
Searching for "/usr/share/vim/vimfiles/after/syntax/syncolor.vim"
Searching for "/home/vagrant/.vim/after/syntax/syncolor.vim"
Searching for "/home/vagrant/.vim/bundle/Vundle.vim/syntax/syncolor.vim"
Searching for "/after/syntax/syncolor.vim"
Searching for "colors/solarized.vim" in "/home/vagrant/.vim,/usr/share/vim/vimfiles,/usr/share/vim/vim74,/usr/share/vim/vimfiles/after,/home/vagrant/.vim/after,/home/vagrant/.vim/bundle/Vundle.vim,/after"
Searching for "/home/vagrant/.vim/colors/solarized.vim"
Searching for "/usr/share/vim/vimfiles/colors/solarized.vim"
Searching for "/usr/share/vim/vim74/colors/solarized.vim"
Searching for "/usr/share/vim/vimfiles/after/colors/solarized.vim"
Searching for "/home/vagrant/.vim/after/colors/solarized.vim"
Searching for "/home/vagrant/.vim/bundle/Vundle.vim/colors/solarized.vim"
Searching for "/after/colors/solarized.vim"
not found in 'runtimepath': "colors/solarized.vim"
line  188:
E185: Cannot find color scheme 'solarized'
finished sourcing /home/vagrant/.vimrc
continuing in command line

看起来vim在找不到.vimrc中指定的插件时停止了。 有什么办法可以继续吗?


可能是由于环境差异引起的。您是否以与登录到客户操作系统相同的用户身份运行播放? - Petro026
3个回答

10

在这种情况下,您希望vim运行在EX模式下,这样可以避免弹出需要tty显示的可视化界面。请尝试使用以下命令。

你想要vim在此情况下以EX模式运行,这将避免启动需要tty显示的视觉界面。请尝试使用以下命令。
vim -E -s -c "source ~/.vimrc" -c PluginInstall -c qa

这里的-E告诉vim在EX模式下启动,并且"-s"(仅在EX模式下可用,help -s-ex)表示我们希望它在没有提示或信息消息的情况下静默运行。此外,在不加载运行时文件的情况下,EX模式不知道如何执行 PluginInstall 命令。

 -s         Silent or batch mode.  Only when Vim was started as "ex" or
            when preceded with the "-e" argument.  Otherwise see -s,
            which does take an argument while this use of "-s" doesn't.
            To be used when Vim is used to execute Ex commands from a file
            instead of a terminal.  Switches off most prompts and
            informative messages.  Also warnings and error messages.
            The output of these commands is displayed (to stdout):
                    :print
                    :list
                    :number
                    :set      to display option values.

关于您的Solarized色彩方案缺失,由于已经使用了Vundle,所以在您的vimrc中添加以下内容即可。

Plugin 'altercation/vim-colors-solarized'

你需要确保colorscheme solarized这行代码在它之后。


请注意,Ansible 可能无法扩展 ~,但我还没有深入研究。将其替换为完整路径或 Ansible 变量始终很容易。 - Roy Zuo
我尝试了你的命令,但ansible失败了:failed: [default] => {"changed": true, "cmd": "vim -E -s -c \"source ~/.vimrc\" -c PluginInstall -c qa", "delta": "0:00:00.050793", "end": "2015-11-16 12:56:56.527921", "rc": 1, "start": "2015-11-16 12:56:56.477128", "warnings": []} - Aaron Shen
我尝试设置一个playbook,这个命令按预期正确安装插件。我使用的命令是vim -E -s -c“source ~/.vimrc”-c PlugInstall -c qa,其中PlugInstall是来自vim-plug的命令。然而,返回代码确实是1。在终端中直接尝试相同的命令会得到0。我不知道发生了什么,但如果你想让你的playbook继续,ignore_errors: yes可能会有所帮助。 - Roy Zuo
嗨 Roy,感谢您的努力。 我正在使用带有 vagrant 的 ansible,在我的 guest os 中以无头模式运行,这可能是问题吗? - Aaron Shen
@AaronShen 我也遇到了同样的问题。我在任务中使用了becomebecome_user解决了这个问题。 - ariel17
显示剩余2条评论

0
问题是关于 vim 的,但如果你正在使用 neovim,那么 --headless 标志可以很好地解决这个问题。
- name: install vundle plugin
  shell: nvim +PluginInstall +qall --headless

0
以下是我的解决方法。我创建了一个角色来设置服务器用户环境,包括设置vim。我使用Vundle,所以还展示了如何在ansible中设置它。 我在实现中使用了Roy Zuo的vim命令。echo -ne'\n'在vim命令源代码".vimrc"文件时发送一个回车符。vim抱怨还没有安装插件,要求我按回车键继续,因此采用了这种解决方案。
在role/vars/main.yml中:
server_users:
  - joe
  - jane

在角色/任务/main.yml中:

- name: copy .vimrc over to server
  copy:
    src: '.vimrc_{{ item }}'
    dest: '/home/{{ item }}/.vimrc'
    owner: "{{ item }}"
    group: "{{ item }}"
    mode: '0644'
  with_items: "{{ server_users }}"
  become: true 

  # https://github.com/VundleVim/Vundle.vim                                                                                                     
- name: install vim plugin handler                                                                                                            
  git:                                                                                                                                        
    repo: 'https://github.com/VundleVim/Vundle.vim.git'                                                                                       
    dest: '/home/{{ item }}/.vim/bundle/Vundle.vim'
  become_user: "{{ item }}"                                                                                         
  with_items: "{{ server_users }}"                                                                                                            
  become: true

- name: install vim plugins                                                                                                                   
  shell: >                                                                                                                                  
    echo -ne '\n' | vim -E -s -c "source ~/.vimrc" -c PluginInstall -c qa            
  register: resultvim
  become_user: "{{ item }}"
  with_items: "{{ server_users }}"
  become: true
  failed_when: ( result.rc not in [0,1] )

# optional for debugging
- debug:                                                                                                                                      
  msg: "{{ resultvim }}"

我将服务器用户的vimrc文件保存在这里

role/files/:
.vimrc_joe
.vimrc_jane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接