記事「Ansibleを使用してVimを構成する方法」では、いくつかのVimプラグインを使用して初期Vim環境を構成するためのAnsibleプレイブックを開発しました。この現在の記事では、プレイブックをAnsibleの役割に変換することで、前の例に基づいて構築を続けています。
Ansibleロールを使用すると、構成ファイル、テンプレート、タスク、ハンドラーなどの関連する自動化アーティファクトをグループ化してカプセル化することにより、再利用可能な自動化コンポーネントを開発できます。ロールはこれらのコンポーネントを分離するため、それらを再利用して他の人と共有する方が簡単です。また、ユーザーが役割を呼び出すときに設定できる変数を公開して、特定の要件に従ってシステムを構成できるようにすることで、役割を構成可能にすることもできます。
[あなたも好きかもしれません:Vimでできるはずの4つのこと]
この記事では、元のプレイブックvim-config.yaml
を変換します 再利用可能な役割に。現時点では、新しい機能は追加しませんが、次の記事でこの例をさらに拡張します。オリジナルのプレイブックとvimrc
を見つけることができます ここに構成ファイルがあります。
1。新しい役割を開始する
Ansibleロールを作成するには、公式ドキュメントに記載されている標準のディレクトリ構造に従ってディレクトリを作成するだけで十分です。
簡単にして標準に準拠するには、ansible-galaxy role init role_name
を使用します このディレクトリを作成するコマンド。このコマンドは、更新可能なドキュメント用のいくつかのテンプレートを含む、必要な構造を作成します。 vim
を初期化するために使用します roles
の下の役割 ディレクトリ。まず、roles
を作成します ディレクトリとそれに切り替えます:
$ mkdir roles
$ cd roles
次に、コマンドansible-galaxy
を使用します 役割を初期化するには:
$ ansible-galaxy role init vim
- Role vim was created successfully
次に、役割のディレクトリ構造を確認します。
$ 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
役割が機能するために必須ではありませんが、ファイルREADME.md
を更新して役割を文書化することを強くお勧めします。 およびmeta/main.yml
。ロールが実行する他のロールに依存している場合は、これらの依存関係をmeta/main.yml
に文書化することが重要です。 、必要に応じてAnsibleがそれらを自動的にダウンロードできるようにします。
新しく作成したディレクトリに切り替えます:
$ cd vim
Vimの役割には依存関係は必要ありません。動作するメタ構成ファイルの例を次に示します。必要に応じて、名前、会社名、および適切なライセンスで更新してください。
$ 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: []
元のファイルには追加のコメントがありますが、簡潔にするために削除しました。
次に、実行するタスクを定義します。
2。タスクの定義
一般的に、ロールは1つ以上のタスクを実行して、ロールの要件に従ってターゲットシステムを構成します。この場合、Vimをインストールして設定する必要があります。デフォルトでは、ロールを実行すると、main.yml
という名前のファイルが検索されます。 tasks
で サブディレクトリを作成し、その中にリストされているすべてのタスクを実行します。タスクを複数のファイルに分割してより複雑な役割にし、main.yml
から呼び出すことができます include_tasks
を使用する またはimport_tasks
モジュール。
この役割では、必要なすべてのタスクをtasks/main.yml
に含めます ファイル:
$ 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
元のプレイブックとは異なり、タスク定義とともに直接インストールするパッケージまたはプラグインのリストが含まれていないことに注意してください。代わりに、変数install_packages
を使用しています およびplugins
。
値をハードコーディングする代わりに変数を定義することで、ロールをより再利用可能にし、保守しやすくします。次に、これらの変数の値を2つの異なる方法で定義します。 plugins
から始めます 変数、次に説明します。
3。デフォルト変数の定義
Ansibleの役割を開発する場合、役割のユーザーが値を提供して、役割がそのタスクを実行する方法をカスタマイズできるようにすることができます。これらの変数により、役割がより再利用可能になり、ユーザーは特定の要件に基づいて結果を変更できます。
この例では、plugins
変数を使用すると、ユーザーはVimでインストールするプラグインを指定できるため、ニーズに合わせて役割を柔軟に設定できます。 defaults/main.yml
でデフォルト値を定義することをお勧めします ユーザーがこの変数に値を指定しなくても、ロールが正常に実行されるようにするためのファイル。
このファイルは、優先順位が非常に低い変数を定義します。つまり、Ansibleは、値が他の場所で定義されていない場合にのみ変数を使用します。
次に、plugins
のデフォルト値を定義します このような変数:
$ 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
この場合、元のプレイブックと同じ値を使用してデフォルト値を定義しています。つまり、この変数の値を指定せずにロールを呼び出すと、元のプレイブックとまったく同じように動作し、これらの6つのプラグインがインストールされます。
内部変数を定義します。
4。役割変数の定義
別のクラスの変数は、役割変数または内部変数です。これらの変数をタスクとは別のファイルで定義することにより、役割の維持が容易になります。これらの変数は多くの場所で再利用でき、中央の場所で更新する方が簡単です。ただし、プレイブックやインベントリなどの一般的な場所に設定することで、ユーザーが簡単にオーバーライドできるようにしたくはありません。
変数install_packages
、インストールに必要なパッケージのリストを定義し、vimrc
、Vimの設定ファイルの場所を指定するのは、内部変数の良い例です。 vars/main.yml
で定義します 。このファイルは、簡単にオーバーライドされない優先順位の高い変数を定義します。ユーザーは、役割を呼び出すときに値を明示的に設定することで、必要に応じて値を提供できますが、この場合、ユーザーは自分が何をしているかを知っていると見なすことができます。
$ 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
Ansible変数の優先順位がどのように機能するかの詳細については、ドキュメントの「変数の優先順位について」を参照してください。
5。ファイルのコピー
この役割を作成する最後のステップは、ファイルvimrc
をコピーすることです。 files
に ディレクトリ。デフォルトでは、copy
を使用する場合 モジュールをロールタスクとして使用すると、files
にコピーするファイルが検索されます。 サブディレクトリ。 vimrc
を定義します このようなファイル:
$ 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 } }
ファイルを保存して閉じ、役割を完了します。次に、役割を使用するためのプレイブックを定義します。
6。プレイブックから役割を呼び出す
これで役割が完了したので、プレイブックから呼び出すことができます。デフォルトでは、Ansibleはroles
でロールを検索します プレイブックファイルまたはシステムディレクトリに関連するサブディレクトリ/etc/ansible/roles
。 Ansible構成のroles_path
を使用することもできます 代替の役割の場所を定義します。
この例では、roles
を作成したのと同じディレクトリにプレイブックを作成します ディレクトリ。それに切り替えます:
$ cd ../..
$ ls
roles
プレイブックを作成するvim-config.yaml
、元のプレイブックと同様ですが、今回は、タスクを定義する代わりに、モジュールimport_role
を使用します。 新しいvim
をインポートするには プレイブックへの役割:
$ 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
モジュールinclude_role
を使用して、プレイブックにロールを含めることもできます。 。これら2つのモジュールの違いについては、別の記事で説明します。待ちきれない場合は、ドキュメントを確認してください。
最後に、プレイブックを実行します。
8。プレイブックを実行する
ansible-playbook
を使用してプレイブックを実行します -K
を使用したコマンド パラメータを入力して、sudo
を入力します Ansibleがシステムパッケージをインストールできるようにするためのパスワード。
注 :既存の.vimrc
をバックアップします このプレイブックを実行する前の構成ファイル。
$ 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
このプレイブックは、ローカルホスト内のすべてのタスクを実行および実行します。リモートシステムを構成する場合は、目的のシステムでインベントリファイルを作成し、プレイブックのhosts
を更新します。 リスト。
[システム自動化についてもっと知りたいですか? RedHatの無料の本であるTheAutomatedEnterpriseを始めましょう。 ]
まとめ
これで、再利用して共有できるVimをインストールして構成する役割ができました。このシリーズの次の記事では、テンプレートファイルを追加して構成をさらに柔軟にすることで、この役割を改善します。
Moleculeを使用して、コンテナーまたは仮想マシンを使用して役割をテストすることもできます。このツールについて詳しく知りたい場合は、Ansibleの公式ブログの私の記事「MoleculeとPodmanを使用したAnsibleロールの開発とテスト-パート1」をお読みください。
Ansibleの詳細については、公式ドキュメントを参照してください。