GNU/Linux >> Linux の 問題 >  >> Linux

LinuxでAnsibleの役割を開発するための8つのステップ

記事「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の詳細については、公式ドキュメントを参照してください。


Linux
  1. LinuxでVimをデフォルトのエディターとして設定する方法

  2. Linuxサーバーを保護するための7つのステップ

  3. Linuxシステム管理者向けのAnsibleの謎を解き明かす

  1. Ansibleを使用してcsvファイルからLinuxユーザーを作成する4つのステップ

  2. RHCE Ansibleシリーズ#9:Ansibleの役割

  3. OracleLinux8にAnsibleをインストールする方法

  1. LinuxにAnsibleをインストールしてテストする方法

  2. Linuxの高度なセキュリティ手順

  3. Linux での C# の開発