V článku Jak používat Ansible ke konfiguraci Vimu jsem vyvinul příručku Ansible pro konfiguraci počátečního prostředí Vim pomocí několika pluginů Vim. V tomto aktuálním článku pokračuji v návaznosti na předchozí příklad převedením příručky do role Ansible.
Ansible role vám umožňují vyvíjet opakovaně použitelné automatizační komponenty seskupováním a zapouzdřením souvisejících automatizačních artefaktů, jako jsou konfigurační soubory, šablony, úlohy a handlery. Vzhledem k tomu, že role tyto komponenty izolují, je snazší je znovu použít a sdílet s ostatními lidmi. Své role můžete také nastavit tak, aby byly konfigurovatelné tím, že odhalíte proměnné, které mohou uživatelé nastavit při volání role, což jim umožní nakonfigurovat svůj systém podle konkrétních požadavků.
[ Také by se vám mohlo líbit: Čtyři věci, které musíte ve Vimu umět ]
V tomto článku jsem převedl původní playbook vim-config.yaml
do znovu použitelné role. V tuto chvíli nebudu přidávat žádnou novou funkcionalitu, ale tento příklad dále rozvedu v dalším článku. Můžete najít původní playbook a vimrc
konfigurační soubor zde.
1. Zahájení nové role
K vytvoření role Ansible stačí vytvořit adresář podle standardní adresářové struktury zdokumentované v oficiální dokumentaci.
Chcete-li to usnadnit a dodržovat standard, použijte ansible-galaxy role init role_name
příkaz k vytvoření tohoto adresáře pro vás. Tento příkaz vytvoří požadovanou strukturu, včetně několika šablon pro dokumentaci, kterou můžete aktualizovat. Použijte jej k inicializaci vim
role pod roles
adresář. Nejprve vytvořte roles
adresář a přepněte se do něj:
$ mkdir roles
$ cd roles
Poté použijte příkaz ansible-galaxy
pro inicializaci role:
$ ansible-galaxy role init vim
- Role vim was created successfully
Nyní ověřte strukturu adresáře role:
$ tree vim
vim
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 8 files
I když to pro fungování role není nutné, důrazně se doporučuje zdokumentovat svou roli aktualizací souborů README.md
a meta/main.yml
. Pokud vaše role závisí na jiných rolích, které chcete provést, je důležité zdokumentovat tyto závislosti v meta/main.yml
, což umožňuje Ansible si je v případě potřeby automaticky stáhnout.
Přepněte se do nově vytvořeného adresáře:
$ cd vim
Vaše role Vim nevyžaduje žádné závislosti. Zde je příklad funkčního meta konfiguračního souboru. Aktualizujte jej svým jménem, názvem společnosti a vhodnou licencí, je-li to nutné:
$ vim meta/main.yml
galaxy_info:
author: <YOUR NAME>
description: Deploy and configure Vim with plugins
company: <YOUR COMPANY>
license: MIT
min_ansible_version: 2.8
platforms:
- name: Fedora
versions:
- 33
galaxy_tags: []
dependencies: []
Původní soubor obsahuje další komentáře, které jsem pro stručnost odstranil.
Dále definujte úkoly, které se mají provést.
2. Definování úkolů
Obecně řečeno, vaše role bude provádět jednu nebo více úloh pro konfiguraci cílového systému podle požadavků role. V tomto případě budete chtít nainstalovat a nakonfigurovat Vim. Ve výchozím nastavení, když spustíte roli, hledá soubor s názvem main.yml
v tasks
podadresář a provádět všechny úkoly v něm uvedené. Úlohy můžete rozdělit do více souborů pro složitější role a volat je z main.yml
pomocí include_tasks
nebo import_tasks
moduly.
Pro tuto roli zahrňte všechny požadované úlohy do tasks/main.yml
soubor:
$ vim tasks/main.yml
---
# tasks file for vim
- name: Install required packages
package:
name: "{{ install_packages }}"
state: present
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: "{{ plugins }}"
- name: Ensure .vimrc config in place
copy:
src: vimrc
dest: "{{ vimrc }}"
backup: yes
mode: 0640
Všimněte si, že na rozdíl od původní příručky nezahrnujete seznam balíčků nebo zásuvných modulů k instalaci přímo s definicí úlohy. Místo toho používáte proměnné install_packages
a plugins
.
Definováním proměnných namísto pevného kódování hodnot zajistíte, že vaše role budou znovupoužitelnější a snáze se udržují. Nyní definujte hodnoty pro tyto proměnné dvěma různými způsoby. Začněte s plugins
proměnná, pokrytá dále.
3. Definování výchozích proměnných
Když vyvíjíte roli Ansible, možná budete chtít umožnit uživatelům role poskytovat hodnoty, které jim umožní přizpůsobit, jak role plní své úkoly. Díky těmto proměnným je vaše role více znovu použitelná, což uživatelům umožňuje upravit výsledek na základě jejich specifických požadavků.
V tomto příkladu plugins
proměnná umožňuje uživatelům určit, které zásuvné moduly chtějí nainstalovat s Vim, díky čemuž je role flexibilní pro jejich potřeby. Doporučuje se pro něj definovat výchozí hodnotu v defaults/main.yml
soubor, aby bylo zajištěno, že se role úspěšně spustí, i když uživatel nezadá hodnotu této proměnné.
Tento soubor definuje proměnné s velmi nízkou prioritou, což znamená, že je Ansible použije pouze v případě, že hodnota nebyla definována nikde jinde.
Nyní definujte výchozí hodnotu pro plugins
proměnná takto:
$ vim defaults/main.yml
---
# defaults file for vim
plugins:
- 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
V tomto případě definujete výchozí hodnotu pomocí stejných hodnot z původního playbooku, což znamená, že pokud zavoláte roli bez zadání hodnoty této proměnné, bude se chovat přesně jako původní playbook a nainstaluje těchto šest pluginů.
Definujte vnitřní proměnné.
4. Definování proměnných rolí
Další třídou proměnných jsou proměnné role nebo interní proměnné. Definováním těchto proměnných v samostatném souboru od úkolů usnadníte údržbu své role. Tyto proměnné můžete znovu použít na mnoha místech a je jednodušší je aktualizovat na centrálním místě. Nechcete však uživatelům příliš usnadnit jejich přepsání tím, že je nastavíte na obecná umístění, jako je herní kniha nebo inventář.
Proměnné install_packages
, který definuje seznam požadovaných balíčků k instalaci, a vimrc
, který určuje umístění konfiguračního souboru Vim, jsou dobrými příklady interních proměnných. Definujte je v vars/main.yml
. Tento soubor definuje proměnné s vyšší prioritou, které nelze snadno přepsat. Uživatelé mohou v případě potřeby stále poskytovat hodnoty tak, že je explicitně nastaví při volání role, ale v tomto případě můžete předpokládat, že vědí, co dělají.
$ vim vars/main.yml
---
# vars file for vim
vim_dir: "{{ ansible_env.HOME }}/.vim"
vimrc: "{{ ansible_env.HOME }}/.vimrc"
install_packages:
- vim-enhanced
- git
- powerline-fonts
- fzf
Další podrobnosti o tom, jak funguje priorita proměnných Ansible, najdete v dokumentaci k tématu Principy priority proměnných.
5. Kopírování souborů
Posledním krokem k vytvoření této role je zkopírování souboru vimrc
do files
adresář. Ve výchozím nastavení při použití copy
modul jako úlohu role, vyhledá soubory ke zkopírování v files
podadresář. Definujte vimrc
soubor takto:
$ 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 } }
Uložte a zavřete soubor, abyste dokončili svou roli. Nyní je čas definovat příručku pro použití role.
6. Volání role z příručky
Nyní, když je vaše role dokončena, můžete ji zavolat ze svých příruček. Ve výchozím nastavení Ansible hledá role v roles
podadresář vzhledem k souboru playbook nebo systémovému adresáři /etc/ansible/roles
. Můžete také použít konfiguraci Ansible roles_path
definovat alternativní umístění rolí.
V tomto příkladu vytvořte playbook ve stejném adresáři, kde jste vytvořili roles
adresář. Přepněte na něj:
$ cd ../..
$ ls
roles
Vytvořte příručku vim-config.yaml
, podobně jako původní playbook, ale tentokrát místo definování úkolů použijte modul import_role
pro import vašeho nového vim
role do příručky:
$ vim vim-config.yaml
- name: Config Vim with plugins
hosts: localhost
gather_facts: yes
become: no
tasks:
- name: Configure Vim using role
import_role:
name: vim
Roli můžete také zahrnout do příručky pomocí modulu include_role
. Rozdílům mezi těmito dvěma moduly se budu věnovat v samostatném článku. Pokud se nemůžete dočkat, podívejte se do dokumentace.
Nakonec spusťte playbook.
8. Spusťte playbook
Spusťte playbook pomocí ansible-playbook
pomocí -K
parametr a zadejte sudo
heslo, které umožní Ansible instalovat systémové balíčky.
Poznámka :Zálohujte všechny existující .vimrc
konfiguračního souboru před spuštěním této příručky.
$ ansible-playbook -K vim-config.yaml
BECOME password:
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [Config Vim with plugins] ***********************************************
TASK [Gathering Facts] *******************************************************
ok: [localhost]
TASK [vim : 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 [vim : Ensure Pathogen is in place] *************************************
changed: [localhost]
TASK [vim : 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.com/airblade/vim-gitgutter'})
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=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Tato příručka spouští a provádí všechny úlohy v localhost. Pokud chcete nakonfigurovat vzdálený systém, vytvořte soubor inventáře s požadovanými systémy a aktualizujte playbook hosts
seznam.
[ Hledáte více o automatizaci systému? Začněte s The Automated Enterprise, bezplatnou knihou od Red Hat. ]
Sbalit
Nyní máte roli, která instaluje a konfiguruje Vim, kterou můžete znovu používat a sdílet. V dalším článku této série tuto roli vylepším přidáním souboru šablony, aby byla konfigurace ještě flexibilnější.
Molecule můžete také použít k testování svých rolí pomocí kontejnerů nebo virtuálních strojů. Pokud se chcete o tomto nástroji dozvědět více, přečtěte si můj článek Vývoj a testování rolí Ansible s Molecule a Podman – část 1 na oficiálním blogu Ansible.
Další informace o Ansible najdete v oficiální dokumentaci.