共计 4012 个字符,预计需要花费 11 分钟才能阅读完成。
导读 | 本文将使用 Centos8 系统通过编写 Ansible playbook 来扩展使用 vim 编辑器。通过介绍每一步的操作说明,最后将汇总起来。 |
在执行本实验钱,需要将 .vimrc
备份一下。本文编写的 playbook 会覆盖现有的 .vimrc
配置文件。
[ansible@Master ~]$ yum -y install ansible
创建 Ansible playbook 文件 vim-config.yaml
[ansible@Master ~]$ vim vim-config.yaml
现在,通过提供名称和目标主机列表来开始 playbook 的定义。本文,我们仅安装在本机,所以 hosts:
部分的值写的是localhost
。如果需要将 vim 部署到其他主机中,可以再次写入清单里面的主机、主机组。
- name: Config Vim with Plugins | |
hosts: localhost |
接下来,设置 gather_facts: yes
选项以收集有关系统信息。我们需要它来访问下一步中的环境变量:
gather_facts: yes
配置 Vim 和 Vim 插件需要向 $HOME/.vim
目录和 $HOME/.vimrc
配置文件添加内容。让我们定义两个变量来存储它们的值:
vars: | |
vim_dir: "{{ansible_env.HOME}}/.vim" | |
vimrc: "{{ansible_env.HOME}}/.vimrc" |
我们使用 ansible_env.HOME
变量来获取 $HOME
环境变量的值。
现在开始定义 playbook 将运行的任务。首先提供tasks:
:
tasks:
由于第一个任务是安装一些我们稍后将安装的 Vim 插件所需的系统包。使用 package
模块安装它们:
- name: Install required packages | |
package: | |
name: | |
- vim-enhanced | |
- git | |
- powerline-fonts | |
- fzf | |
state: installed | |
become: yes | |
tags: install_packages |
package
模块适用于不同的发行版。可以设置 become: yes
自动提升权限。tags
为安装部分添加一个标签,方便后面单独安装。
使用带有参数 state: directory
的 file
模块来创建目录。由于有三个目录,因此使用 loop
模块来保存所需的条目:
- 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-Pathogen
作为 Vim 插件管理器。若要使用 Ansible 安装它,可以使用get_url
模块将插件下载到其目标目录:
- name: Ensure Pathogen is in place | |
get_url: | |
url: https://github.com/tpope/vim-pathogen/blob/master/autoload/pathogen.vim | |
dest: "{{vim_dir}}/autoload/pathogen.vim" |
安装 Pathogen 后,从 GitHub 克隆到目标目录来部署所需的插件。与创建目录类似,使用 loop
模块克隆所需的仓库:
- name: Deploy Plugins | |
git: | |
repo: "{{item.url}}" | |
dest: "{{vim_dir}}/bundle/{{item.name}}" | |
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 |
我们使用字典列表作为 loop
的输入,调用他们的语法是 {{item.KEY}}
。
作为最后的任务,使用 copy
模块复制 Vim 的配置文件。首先,在子目录 files 下创建配置文件:
[ansible@Master ~]$ mkdir files | |
[ansible@Master ~]$ vim files/vimrc |
将如下内容复制到 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 :NERDTreeToggle | |
" Configuration floaterm | |
let g:floaterm_keymap_toggle = '' | |
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 |
注意,不需要在 src
路径中指定 files
目录。默认情况下,Ansible 在此子目录 files
中查找要复制的文件。
这里是完整的剧本:
- name: Config Vim with Plugins | |
hosts: localhost gather_facts: yesvars: | |
vim_dir: "{{ansible_env.HOME}}/.vim" | |
vimrc: "{{ansible_env.HOME}}/.vimrc" tasks: | |
- name: Install required packages | |
package: | |
name: | |
- vim-enhanced | |
- git | |
- powerline-fonts | |
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: | |
url: https://tpo.pe/pathogen.vim | |
dest: "{{vim_dir}}/autoload/pathogen.vim"- name: Deploy Plugins | |
git: | |
repo: "{{item.url}}" | |
dest: "{{vim_dir}}/bundle/{{item.name}}" | |
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
命令执行改剧本。由于此剧本仅针对本地主机,因此并不严格要求清单。首先添加 -C
选项,用来试运行一下,检查错误。然后再执行。
[ansible@Master ~]$ ansible-playbook -C vim-config.yaml | |
[ansible@Master ~]$ ansible-playbook vim-config.yaml |
通过本剧本,可以深入了解 ansible playbook 的许多模块使用方法。
