如何使用 Ansible 配置 Vim
在文章“系统管理员的五大 Vim 插件”中,我介绍了五个插件和一个额外插件,它们可以让系统管理员在使用 Vim 时的工作更轻松。本文将通过开发一个Ansible剧本来扩展这一点,以使用这些插件配置初始 Vim 环境。
此剧本适用于 Fedora Linux 系统,但只需进行少量修改即可在其他发行版中同样适用。在以下每个部分中,我们将讨论使其在其他系统上运行所需的更改。
注意:此剧本会覆盖现有.vimrc
配置文件,因此设置尚未配置 Vim 的新系统更有用。如果您有现有的 Vim 配置文件,请在运行此剧本之前将其备份。
要运行此剧本,您必须安装 Ansible。在 Fedora 中,您可以使用 安装 Ansible dnf
,如下所示:
$ sudo dnf install -y ansible
有关 Ansible 安装选项的更多详细信息,请查看Ansible 安装指南。
1. 开始行动
创建 Ansible 剧本文件vim-config.yaml
并使用您最喜欢的文本编辑器进行编辑。如果您是 Ansible 新手,请查看此 剧本 链接以了解更多信息。
$ vi vim-config.yaml
[ 你可能还喜欢: vi 编辑器简介]
现在,通过提供名称和目标主机列表来开始您的剧本定义。在本例中,我们将仅针对localhost
本地配置 Vim。
- name: Config Vim with plugins
hosts: localhost
接下来,设置gather_facts: yes
选项以收集 有关系统的事实。您需要在下一步中访问环境变量:
gather_facts: yes
最后,设置全局选项become: no
以表明这些任务通常不需要提升权限。我们将在本地为需要提升权限的单个任务设置提升权限,例如安装系统包。
become: no
接下来,定义一些有用的变量。
2. 定义变量
配置 Vim 和 Vim 插件需要向$HOME/.vim
目录和$HOME/.vimrc
配置文件添加内容。为了确保我们一致地使用这些值并避免多次重新输入它们,让我们定义两个变量来存储它们的值:
vars:
vim_dir: "{{ ansible_env.HOME }}/.vim"
vimrc: "{{ ansible_env.HOME }}/.vimrc"
请注意,我们使用ansible_env.HOME
fact 变量来检索环境变量的值$HOME
。有关获取环境变量的更多信息,请参阅文档。
现在,让我们开始定义剧本执行的任务。
3.安装所需的软件包
创建剧本的下一步是定义剧本将运行的任务。首先提供tasks:
剧本参数:
tasks:
因为第一项任务是安装我们稍后将安装的一些 Vim 插件所需的系统包。使用package模块安装它们并提供启用权限提升的参数become: yes
,这是安装系统包所必需的:
- name: Install required packages
package:
name:
- vim-enhanced
- git
- powerline-fonts
- fzf
state: installed
become: yes
该package
模块适用于不同的发行版,但软件包名称不同。这些值适用于 Fedora 32。如果您在其他发行版中运行此剧本,请根据您的发行版要求更改软件包名称。
接下来,创建.vim
目录结构。
4. 创建目录
使用带有参数的文件state: directory
模块来创建所需的目录。由于有三个目录,因此循环执行此模块以使用单个任务创建所有目录:
- name: Ensure .vim/{autoload,bundle} directory exists
file:
path: "{{ item }}"
state: directory
recurse: no
mode: 0750
loop:
- "{{ vim_dir }}"
- "{{ vim_dir }}/autoload"
- "{{ vim_dir }}/bundle"
请注意,我们使用vim_dir
之前定义的变量来表示.vim
目录。我们使用Jinja2语法{{ vim_dir }}
。
现在目录已经到位,您需要下载 Pathogen。
5. 下载病原体
在这个例子中,我们使用Vim-Pathogen作为 Vim 插件管理器。要使用 Ansible 安装它,请应用get_url模块将插件文件直接下载到其目标目录:
- name: Ensure Pathogen is in place
get_url:
dest: "{{ vim_dir }}/autoload/pathogen.vim"
url: https://tpo.pe/pathogen.vim
接下来,部署所需的插件。
6. 从 Git 部署插件
安装 Pathogen 后,让我们使用git模块通过将其 GitHub 存储库克隆到目标目录来部署所需的插件。与创建目录类似,使用循环通过单个任务克隆所有存储库:
- name: Deploy plugins
git:
dest: "{{ vim_dir }}/bundle/{{ item.name }}"
repo: "{{ item.url }}"
clone: yes
update: yes
recursive: no
loop:
- name: vim-airline
url: https://github.com/vim-airline/vim-airline
- name: nerdtree
url: https://github.com/preservim/nerdtree
- name: fzf-vim
url: https://github.com/junegunn/fzf.vim
- name: vim-gitgutter
url: https://github.com/airblade/vim-gitgutter
- name: vim-fugitive
url: https://github.com/tpope/vim-fugitive
- name: vim-floaterm
url: https://github.com/voldikss/vim-floaterm
请注意,我们使用字典列表作为循环的输入,并{{ item.KEY }}
在需要时使用它们的值和语法作为模块参数的输入。
接下来,复制 Vim 的基本配置文件。
7.复制初始配置文件
作为最后一项任务,使用复制模块复制 Vim 的基本配置文件。首先,在子目录下创建配置文件files
:
$ mkdir files
$ vim files/vimrc
execute pathogen#infect()
syntax on
filetype plugin indent on
colo darkblue
" Configuration vim Airline
set laststatus=2
let g:airline#extensions#tabline#enabled=1
let g:airline_powerline_fonts=1
" Configuration NERDTree
map <F5> :NERDTreeToggle<CR>
" Configuration floaterm
let g:floaterm_keymap_toggle = '<F12>'
let g:floaterm_width = 0.9
let g:floaterm_height = 0.9
" Configuration Vim.FZF
let g:fzf_preview_window = 'right:50%'
let g:fzf_layout = { 'window': { 'width': 0.9, 'height': 0.6 } }
然后,使用该copy
模块将文件复制到目标位置:
- name: Ensure .vimrc config in place
copy:
src: vimrc
dest: "{{ vimrc }}"
backup: yes
mode: 0640
请注意,您不需要files
在src
路径中指定目录。默认情况下,Ansible 会在此子目录中查找要复制的文件。
最后,执行剧本。
8. 综合起来
您的剧本已完成。作为参考,以下是完整的剧本:
- name: Config Vim with plugins
hosts: localhost
gather_facts: yes
become: no
vars:
vim_dir: "{{ ansible_env.HOME }}/.vim"
vimrc: "{{ ansible_env.HOME }}/.vimrc"
tasks:
- name: Install required packages
package:
name:
- vim-enhanced
- git
- powerline-fonts
- fzf
state: installed
become: yes
tags:
- install_packages
- name: Ensure .vim/{autoload,bundle} directory exists
file:
path: "{{ item }}"
state: directory
recurse: no
mode: 0750
loop:
- "{{ vim_dir }}"
- "{{ vim_dir }}/autoload"
- "{{ vim_dir }}/bundle"
- name: Ensure Pathogen is in place
get_url:
dest: "{{ vim_dir }}/autoload/pathogen.vim"
url: https://tpo.pe/pathogen.vim
- name: Deploy plugins
git:
dest: "{{ vim_dir }}/bundle/{{ item.name }}"
repo: "{{ item.url }}"
clone: yes
update: yes
recursive: no
loop:
- name: vim-airline
url: https://github.com/vim-airline/vim-airline
- name: nerdtree
url: https://github.com/preservim/nerdtree
- name: fzf-vim
url: https://github.com/junegunn/fzf.vim
- name: vim-gitgutter
url: https://github.com/airblade/vim-gitgutter
- name: vim-fugitive
url: https://github.com/tpope/vim-fugitive
- name: vim-floaterm
url: https://github.com/voldikss/vim-floaterm
- name: Ensure .vimrc config in place
copy:
src: vimrc
dest: "{{ vimrc }}"
backup: yes
mode: 0640
现在,保存文件,然后关闭文本编辑器。
ansible-playbook
使用命令和剧本名称执行剧本。由于此剧本localhost
仅针对目标,因此并不严格要求清单。您仍然可以创建一个。此外,由于其中一个任务需要特权升级,请提供参数-K
以输入您的sudo
密码,以允许 Ansible 执行这些任务。
注意:.vimrc
在运行此剧本之前,请备份现有的配置文件。
$ ansible-playbook -K vim-config.yaml
BECOME password:
PLAY [Config Vim with plugins] *************************************
TASK [Gathering Facts] *********************************************
ok: [localhost]
TASK [Install required packages] ***********************************
changed: [localhost]
TASK [Ensure .vim/{autoload,bundle} directory exists] **************
changed: [localhost] => (item=/home/ricardo/.vim)
changed: [localhost] => (item=/home/ricardo/.vim/autoload)
changed: [localhost] => (item=/home/ricardo/.vim/bundle)
TASK [Ensure Pathogen is in place] *********************************
changed: [localhost]
TASK [Deploy plugins] **********************************************
changed: [localhost] => (item={'name': 'vim-airline', 'url': 'https://github.com/vim-airline/vim-airline'})
changed: [localhost] => (item={'name': 'nerdtree', 'url': 'https://github.com/preservim/nerdtree'})
changed: [localhost] => (item={'name': 'fzf-vim', 'url': 'https://github.com/junegunn/fzf.vim'})
changed: [localhost] => (item={'name': 'vim-gitgutter', 'url': 'https://github.c
changed: [localhost] => (item={'name': 'vim-fugitive', 'url': 'https://github.com/tpope/vim-fugitive'})
changed: [localhost] => (item={'name': 'vim-floaterm', 'url': 'https://github.com/voldikss/vim-floaterm'})
TASK [Ensure .vimrc config in place] *******************************
changed: [localhost]
PLAY RECAP *********************************************************
localhost : ok=5 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
您现在可以通过运行以下命令来测试新的 Vim 配置vim
:
[ 需要更多有关 Ansible 的信息?参加 Red Hat 提供的免费技术概述课程。Ansible Essentials:自动化技术概述的简易性。]
下一步是什么?
您创建了一个剧本,用于自动部署基本的 Vim 配置,其中包含六个对系统管理员有用的插件。如果您想使用相同的剧本来部署其他插件,请将它们添加到任务中的循环列表中Deploy plugins
。此外,将任何所需的系统包添加到Install required packages
任务中。
使用此剧本,您可以使用基础设施即代码原则快速部署和更新您的 Vim 配置。
有关 Ansible 的更多信息,请查阅其官方文档。