Ansibleロールを使用してインフラストラクチャ環境を抽象化する方法

提供:Dev Guides
移動先:案内検索

序章

Ansibleは、管理者と運用チームのサーバーの制御を自動化するように設計された構成管理ツールです。 Ansibleを使用すると、単一の中央サーバーを使用して、SSHとPythonを唯一の要件として使用して多くの異なるリモートシステムを制御および構成できます。

Ansibleは、タスク定義に基づいて管理するサーバー上でタスクを実行します。 これらのタスクは、タスクごとにYAMLの小さなスニペットを使用して、組み込みのコミュニティで維持されているAnsibleモジュールを呼び出します。

単一のAnsibleコントロールノードで管理するシステムの数と種類が複雑になるにつれて、タスクをAnsibleプレイブックにグループ化することは理にかなっています。 プレイブックを使用すると、リモートシステムで多くの個別のタスクを実行する必要がなくなり、代わりに1つのファイルで環境全体を一度に構成できます。

ただし、プレイブックは、システムごとに複数のタスクを使用して多くの異なるシステムを構成する必要がある場合、複雑になる可能性があるため、AnsibleではRoleと呼ばれるディレクトリ構造にタスクを整理することもできます。 この構成では、プレイブックはタスクではなくロールを呼び出すため、タスクをグループ化して、他のプレイブックでロールを再利用できます。 ロールを使用すると、テンプレート、静的ファイル、および変数をタスクとともに1つの構造化された形式で収集することもできます。

このチュートリアルでは、ロールを作成する方法と、テンプレート、静的ファイル、および変数をロールに追加する方法について説明します。 役割の構築の基本に慣れたら、 Ansible Galaxy を使用して、コミュニティが提供する役割をプレイブックに組み込みます。 このチュートリアルを終了するまでに、サーバー用に独自の環境固有の役割を作成し、それらを独自のプレイブックで使用して1つまたは複数のシステムを管理できるようになります。

前提条件

このチュートリアルに従うには、プレイブックを作成して実行できるように、Ansibleをインストールして構成する必要があります。 また、Ansibleプレイブックの書き方を理解する必要があります。

Ansibleの役割とは何ですか?


前提条件のチュートリアルでは、ターミナルでansibleコマンドを使用してコアAnsibleツールを実行する方法を学習しました。 また、タスクをプレイブックに収集し、ansible-playbookコマンドを使用してそれらを実行する方法も学びました。 単一のコマンドの実行からタスク、プレイブックへの進行における次のステップは、Ansibleの役割を使用してすべてを再編成することです。

ロールは、タスクとプレイブックに加えて抽象化されたレベルであり、モジュール式で再利用可能な形式でAnsible構成を構造化できます。 プレイブックに機能と柔軟性を追加するにつれて、プレイブックは扱いにくくなり、保守が困難になる可能性があります。 ロールを使用すると、複雑なプレイブックを、中央のエントリポイントで調整できる個別の小さなチャンクに分割できます。 たとえば、このチュートリアルでは、使用するplaybook.yml全体は次のようになります。

プレイブックの例

---
- hosts: all
  become: true
  roles:
    - apache
  vars:
    doc_root: /var/www/example

Apache Webサーバーを構成するために実行される一連のタスクはすべて、作成するapacheロールに含まれます。 ロールは、構成管理101:Ansible Playbooks の前提条件で行ったように各タスクを個別にリストするのではなく、Apacheをインストールするために完了する必要のあるすべてのタスクを定義します。

Ansibleセットアップをロールに編成すると、異なるタイプのサーバー間で共通の構成手順を再利用できます。 これは、1つのプレイブックに複数のタスクファイルを含めることでも可能ですが、ロールは、既知のディレクトリ構造とファイル名の規則に依存して、プレイ内で使用されるファイルを自動的にロードします。

一般に、ロールの背後にある考え方は、一貫した構造を使用してタスクを共有および再利用できるようにすると同時に、すべてのインフラストラクチャのタスクを複製することなくタスクを簡単に維持できるようにすることです。

役割の作成


Ansibleロールを作成するには、特別にレイアウトされたディレクトリ構造が必要になります。 Ansibleがそれらを見つけて使用できるように、ロールには常にこのディレクトリレイアウトが必要です。

ここでは、ユーザーのホームディレクトリをAnsibleの作業ディレクトリとして使用していることを前提としています。 Ansible構成を別の場所に保持している場合は、(cd)をそのディレクトリに変更する必要があります。

まず、rolesというディレクトリを作成しましょう。 このチュートリアルの後半でPlaybookで新しい役割を使用する場合は、Ansibleがここを参照します。

cd ~
mkdir roles
cd roles

このディレクトリ内で、複数のプレイブックや異なるサーバー間で再利用できる役割を定義します。 作成する各ロールには、独自のディレクトリが必要です。 Configuration Management 101:Writing Ansible Playbooks チュートリアルからApacheプレイブックの例を取り上げ、再利用可能なAnsibleロールに変換します。

参考までに、これはそのチュートリアルのプレイブックです。

playbook.yml

---
- hosts: all
  become: true
  vars:
    doc_root: /var/www/example
  tasks:
    - name: Update apt
      apt: update_cache=yes

    - name: Install Apache
      apt: name=apache2 state=latest

    - name: Create custom document root
      file: path={{ doc_root }} state=directory owner=www-data group=www-data

    - name: Set up HTML file
      copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644

    - name: Set up Apache virtual host file
      template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
      notify: restart apache
  
  handlers:
    - name: restart apache
      service: name=apache2 state=restarted

まず、ロール用のApacheディレクトリを作成し、必要なディレクトリを設定します。

mkdir apache
cd apache

次に、コンテンツをロールとして使用する必要があることをAnsibleに通知する必要なサブディレクトリのセットを作成します。 mkdirコマンドを使用してこれらのディレクトリを作成します。

mkdir defaults files handlers meta templates tasks vars

これらのディレクトリには、私たちの役割を実装するためのすべてのコードが含まれます。 多くの役割は、関連するタスクの複雑さに応じて、これらのディレクトリの1つまたはいくつかのみを使用します。 独自の役割を作成する場合、これらのディレクトリのすべてを作成する必要はない場合があります。

各ディレクトリが表す内容は次のとおりです。

  • defaults :このディレクトリでは、含まれる役割または依存する役割のデフォルト変数を設定できます。 ここで設定されたデフォルトは、プレイブックまたはインベントリファイルで上書きできます。
  • files :このディレクトリには、リモートサーバーにコピーまたは実行される可能性のある静的ファイルとスクリプトファイルが含まれています。
  • handlers :以前プレイブックにあったすべてのハンドラーをこのディレクトリに追加できるようになりました。
  • meta :このディレクトリはロールメタデータ用に予約されており、通常は依存関係の管理に使用されます…たとえば、現在のロールが呼び出される前に適用する必要があるロールのリストを定義できます。
  • templates :このディレクトリは、リモートホストでファイルを生成するテンプレート用に予約されています。 テンプレートは通常、varsディレクトリにあるファイル、および実行時に収集されるホスト情報で定義された変数を使用します。
  • tasks :このディレクトリには、通常のAnsibleプレイブックのtasksセクションで通常定義されるタスクを含む1つ以上のファイルが含まれています。 これらのタスクは、ファイルへのフルパスを指定しなくても、ロール内のそれぞれのディレクトリに含まれているファイルとテンプレートを直接参照できます。
  • vars :ロールの変数は、このディレクトリ内のファイルで指定して、ロールの他の場所で参照できます。

main.ymlというファイルがディレクトリに存在する場合、その内容はロールを呼び出すプレイブックに自動的に追加されます。 ただし、filesおよびtemplatesディレクトリの内容は明示的に参照する必要があるため、これは適用されません。

プレイブックを役割に変える


Ansibleロールの各ディレクトリが何に使用されるかを理解したので、Apacheプレイブックをより適切に整理するためのロールに変えます。

前のセクションからroles/apache2/{subdirectories}構造がすでに設定されているはずです。 次に、役割を定義するためにいくつかのYAMLファイルを作成する必要があります。

タスクのmain.ymlファイルの作成


まず、tasksサブディレクトリから始めます。 今すぐそのディレクトリに移動します。

cd ~/roles/apache/tasks

このディレクトリにmain.ymlファイルを作成する必要があります。 Apacheプレイブックの内容全体を入力してから、タスクのみが含まれるように編集します。

nano main.yml

開始すると、ファイルは次のようになります。

main.yml

---
- hosts: all
  become: true
  vars:
    doc_root: /var/www/example

  tasks:
    - name: Update apt
      apt: update_cache=yes

    - name: Install Apache
      apt: name=apache2 state=latest

    - name: Create custom document root
      file: path={{ doc_root }} state=directory owner=www-data group=www-data

    - name: Set up HTML file
      copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644

    - name: Set up Apache virtual host file
      template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
      notify: restart apache

  handlers:
    - name: restart apache
      service: name=apache2 state=restarted

最初の---行と、強調表示されているtasksセクションの行のみを保持します。 タスクの左側にある余分なスペースを削除することもできます。 また、このチュートリアルの後半で構成するmodsecurityというApacheモジュールを有効にするための新しいセクションを追加します。 これらの変更後、新しい~/roles/apache/tasks/main.ymlファイルは次のようになります。

main.yml

---
- name: Update apt
  apt: update_cache=yes

- name: Install Apache
  apt: name=apache2 state=latest

- name: Create custom document root
  file: path={{ doc_root }} state=directory owner=www-data group=www-data

- name: Set up HTML file
  copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644

- name: Set up Apache virtual host file
  template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
  notify: restart apache

これで、タスクファイルには、Apacheロールを使用するときに実行される実際のステップのみが含まれているため、追跡と理解が容易になります。

copy行とtemplate行がそれぞれsrc=index.htmlsrc=vhost.tplを使用して、先行パスなしでロール内のファイルを参照していることに注意してください。 私たちの役割のディレクトリ構造により、ファイルとテンプレートを名前で直接参照することができ、Ansibleはそれらを自動的に見つけます。

編集が終了したら、必ずファイルを保存して閉じてください。

ハンドラーの作成main.ymlファイル

プレイブックの大部分がtasks/main.ymlファイルにあるので、ハンドラーセクションをhandlers/main.ymlにあるファイルに移動する必要があります。

最初にcdhandlersサブディレクトリに配置します。

cd ~/roles/apache/handlers

ここでも、テキストエディタでファイルを開き、元のplaybook.ymlの内容全体を貼り付けます。

nano main.yml

保持する必要のある部分が再び強調表示されます。

playbook.yml

---
- hosts: all
  become: true
  vars:
    doc_root: /var/www/example
  tasks:
    - name: Update apt
      apt: update_cache=yes

    - name: Install Apache
      apt: name=apache2 state=latest

    - name: Create custom document root
      file: path={{ doc_root }} state=directory owner=www-data group=www-data

    - name: Set up HTML file
      copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644

    - name: Set up Apache virtual host file
      template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
      notify: restart apache

  handlers:
    - name: restart apache
    service: name=apache2 state=restarted

ハンドラーの前からも空白を削除します。 最終的に、ファイルは次のようになります。

---
- name: restart apache
  service: name=apache2 state=restarted

終了したら、ファイルを保存して閉じます。

ファイルとテンプレートの追加


タスクとハンドラーが配置されたので、次のステップは、index.htmlファイルとvhost.tplテンプレートがあることを確認して、Ansibleがそれらを見つけてリモートサーバーに配置できるようにすることです。 これらのファイルはtasks/main.ymlファイルで参照されているため、存在する必要があります。そうでない場合、Ansibleはロールを正しく実行できません。

まず、~/roles/apache/filesディレクトリにindex.htmlファイルを作成します。

cd ~/roles/apache/files
nano index.html

以下をエディターに貼り付けて、保存して閉じます。

<html>
<head><title>Configuration Management Hands On</title></head>

<h1>This server was provisioned using <strong>Ansible</strong></h1>

</html>

次に、vhost.tplテンプレートを編集します。 テンプレートディレクトリに移動し、nanoでファイルを編集します。

cd ~/roles/apache/templates
nano vhost.tpl

これらの行をエディターに貼り付けてから、保存して閉じます。

<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot {{ doc_root }}

<Directory {{ doc_root }}>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>

メタディレクトリ

役割が別の役割に依存している場合は、metaディレクトリにmain.ymlというファイルを追加できます。 このファイルは、このロールが「apt」と呼ばれるロールに依存することを指定している場合があります。 作成したApacheロールでは、依存関係は必要ありません。 ただし、「apt」などの別の役割が必要であるという架空のケースでは、~/roles/apache/meta/main.ymlのファイルは次のようになります。

---
dependencies:
  - apt

これにより、「apt」ロールがApacheロールの前に実行されるようになります。 このような依存関係を作成すると、実際の役割を実行する前に他のソフトウェアまたは構成を配置する必要がある、より複雑な役割で役立ちます。

Varsディレクトリ

先ほど、ロールの変数を設定するために使用できる「vars」ディレクトリがあると述べました。 vars/main.ymlファイルを使用して役割のデフォルトのパラメーターを構成することは可能ですが、これは通常、小さな役割にはお勧めしません。

「vars」ディレクトリを使用しない理由は、構成の詳細がロール階層内に存在するようにするためです。 役割は主に一般的なタスクと依存関係ですが、変数は構成データです。 この2つを組み合わせると、自分の役割を他の場所で再利用することが難しくなります。

代わりに、機密情報の公開を心配せずに役割を簡単に共有できるように、役割の外部で構成の詳細を指定することをお勧めします。 また、ロール内で宣言された変数は、他の場所の変数によって簡単にオーバーライドされます。 特定のタスクに使用されるプレイブックに変数データを配置することをお勧めします。

ただし、「vars」ディレクトリは、より複雑な役割で役立つため、ここで言及する価値があります。 たとえば、ロールがさまざまなLinuxディストリビューションをサポートする必要がある場合、変数のデフォルト値を指定すると、さまざまなパッケージ名、バージョン、および構成を処理するのに役立ちます。

他のファイルを含める

多くのタスク、依存関係、または条件付きロジックを使用してロールを作成すると、それらが大きくなり、理解しにくくなることがあります。 このような状況では、タスクを独自のファイルに分割して、tasks/main.ymlに含めることができます。

たとえば、Apacheサーバー用にTLSを構成するための追加のタスクのセットがある場合、それらを独自のファイルに分離することができます。 ファイルをtasks/tls.ymlと呼び、次のようにtasks/main.ymlファイルに含めることができます。

. . .
tasks:
- include: roles/apache/tasks/tls.yml

スケルトンプレイブックを作成する


役割構造を構成したので、このチュートリアルの最初のモノリシックバージョンと比較して、最小限のプレイブックでそれを使用できます。

このようにロールを使用すると、プレイブックを使用して、サーバーが実行することになっていることを宣言できます。そのために、タスクの作成を常に繰り返す必要はありません。

Apacheの役割を含む最小限のプレイブックを作成するには、役割ディレクトリ(この例ではホームディレクトリ)からcdを作成します。 これで、プレイブックファイルを作成できます。

cd ~
nano playbook.yml

ファイルを開いたら、以下を貼り付けて、ファイルを保存して閉じます。

---
- hosts: all
  become: true
  roles:
    - apache
  vars:
    - doc_root: /var/www/example

このファイルに必要な情報はほとんどありません。 まず、この役割を実行するサーバーを一覧表示するため、- hosts: allを使用します。 webserversというホストのグループがある場合は、代わりにそれらをターゲットにすることができます。 次に、使用している役割を宣言します。 この場合は1つしかないため、- apache行を使用します。

これが私たちのプレイブック全体です。 それは非常に小さく、読んで理解するのが速いです。 プレイブックをこのように整理しておくと、個々のタスクの仕組みではなく、サーバーを構成するための全体的な目標に集中できます。 さらに良いことに、複数の役割要件がある場合は、プレイブックのrolesセクションにそれらをリストすると、表示されている順序で実行されます。

たとえば、ApacheとMySQLを使用してWordPressサーバーをセットアップする役割がある場合、次のようなプレイブックが作成される可能性があります。

---
- hosts: wordpress_hosts
  become: true
  roles:
    - apache
    - php
    - mysql
    - wordpress
  vars:
    - doc_root: /var/www/example

このプレイブック構造により、サーバーをどのように見せたいかを非常に簡潔にすることができます。 最後に、プレイブックはロールを呼び出すため、プレイブックを実行するコマンドは、すべてが1つのファイルにある場合とまったく同じです。

ansible-playbook playbook.yml
OutputPLAY [all] ******************************************************************************************

TASK [Gathering Facts] ******************************************************
ok: [64.225.15.1]

TASK [apache : Update apt] **************************************************
ok: [64.225.15.1]

TASK [apache : Install Apache] **********************************************
changed: [64.225.15.1]

TASK [apache : Create custom document root] *********************************
changed: [64.225.15.1]

TASK [apache : Set up HTML file] ********************************************
changed: [64.225.15.1]

TASK [apache : Set up Apache virtual host file] *****************************
changed: [64.225.15.1]

RUNNING HANDLER [apache : restart apache] ***********************************
changed: [64.225.15.1]

PLAY RECAP ******************************************************************
64.225.15.1              : ok=7    changed=5    unreachable=0    failed=0

たとえば、playbook.ymlファイルapache.ymlを呼び出して、ファイルの名前にそのファイルに含まれる役割を反映させることもできます。

Ansible Galaxy

Ansible Galaxy で利用できるリソースを調べないと、Ansibleの役割に関するチュートリアルは完了しません。 検索可能なGalaxyは、ユーザーが提供する役割のリポジトリであり、プレイブックに追加して、自分で作成しなくてもさまざまなタスクを実行できます。

たとえば、mod_security2という便利なApacheモジュールをプレイブックに追加して、いくつかの追加のセキュリティ設定でApacheを構成できます。 apache_modsecurityと呼ばれるAnsibleGalaxyの役割を使用します。 この役割を使用するには、ローカルにダウンロードしてから、プレイブックに含めます。

まず、ansible-galaxyツールについて理解しましょう。 ツールを使用してGalaxyを検索し、検索コマンドから返されたリストから役割を選択します。

ansible-galaxy search "PHP for RedHat/CentOS/Fedora/Debian/Ubuntu"

検索コマンドは、次のようなものを出力します。

OutputFound 21 roles matching your search:

 Name                            Description
 ----                            -----------
 alikins.php                     PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 bpresles.php                    PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 entanet_devops.ansible_role_php PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 esperdyne.php                   PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 fidanf.php                      PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 frogasia.ansible-role-php       PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 geerlingguy.php                 PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 icamys.php                      PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 jhu-sheridan-libraries.php      PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 jibsan94.ansible_php            PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 KAMI911.ansible_role_php        PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 monsieurbiz.geerlingguy_php     PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 nesh-younify.ansible-role-php   PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 net2grid.php                    PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 thom8.ansible-role-php          PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 v0rts.php                       PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 vahubert.php                    PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 Vaizard.mage_php                PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 viasite-ansible.php             PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
 vvgelder.ansible-role-php       PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
(END)

Ansibleはlessコマンドを使用して、結果が多い場合に検索結果を出力します。これにより、qを押して終了するまで端末がブロックされます。 これは、検索結果が広範囲に渡り、spaceを押すことで検索結果をパジネートする必要がある場合に役立ちます。

プレイブックの役割geerlingguy.phpを選択します。 検索結果から返される役割について詳しく知りたい場合は、 Galaxy検索ページにアクセスして、詳細を知りたい役割名を貼り付けてください。

プレイブックで使用する役割をダウンロードするには、ansible-galaxy installコマンドを使用します。

ansible-galaxy install geerlingguy.php

そのコマンドを実行すると、次のような出力が表示されます。

Output- downloading role 'php', owned by geerlingguy
- downloading role from https://github.com/geerlingguy/ansible-role-php/archive/3.7.0.tar.gz
- extracting geerlingguy.php to /home/sammy/.ansible/roles/geerlingguy.php
- geerlingguy.php (3.7.0) was installed successfully

これで、playbook.ymlファイルに役割を追加できます。

---
- hosts: all
  become: true
  roles:
    - apache
    - geerlingguy.php
  vars:
    - doc_root: /var/www/example
    - php_default_version_debian: "7.2"

apacheロールの後にロールを配置することにより、geerlingguy.phpロールプレースの構成の前に、リモートシステムでApacheがセットアップおよび構成されていることを確認します。 mysql、およびwordpressの役割を、リモートサーバーの動作に応じて選択した任意の順序で含めることもできます。

Galaxyの役割を追加してansible-playbook playbook.ymlを実行すると、次のような出力になります。

OutputPLAY [all] *********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [64.225.15.1]

TASK [apache : Update apt] *****************************************************
changed: [64.225.15.1]

TASK [apache : Install Apache] *************************************************
changed: [64.225.15.1]

TASK [apache : Install modsecurity] ********************************************
changed: [64.225.15.1]

TASK [apache : Create custom document root] ************************************
changed: [64.225.15.1]

TASK [apache : Set up HTML file] ***********************************************
changed: [64.225.15.1]

TASK [apache : Set up Apache virtual host file] ********************************
changed: [64.225.15.1]

TASK [geerlingguy.php : Include OS-specific variables.] ************************
ok: [64.225.15.1]

TASK [geerlingguy.php : Define php_packages.] **********************************
ok: [64.225.15.1]

. . .

PLAY RECAP *********************************************************************
64.225.15.1                : ok=37   changed=15   unreachable=0    failed=0
(END)

結論

Ansibleロールは、サーバーがどのように見えるかを構造化および定義するための優れた方法です。 各サーバーのプレイブックだけに頼ることができたとしても、それらの使用方法を学ぶことは価値があります。 Ansibleを広範囲に使用することを計画している場合、ロールはホストレベルの構成をタスクから分離し、Ansibleコードがクリーンで読みやすいことを保証します。 最も重要なことは、ロールを使用すると、コードを簡単に再利用および共有し、制御されたモジュール方式で変更を実装できることです。