構成管理101:Ansible Playbookの作成

前書き

簡単に言えば、サーバー構成管理(一般的にITオートメーションとも呼ばれます)は、インフラストラクチャ管理をコードベースに変換するソリューションであり、バージョン管理および再利用が容易なプロビジョニングスクリプトのセットでサーバーを展開するために必要なすべてのプロセスを記述します。 サーバーインフラストラクチャの整合性を長期にわたって大幅に改善できます。

https://www.digitalocean.com/community/tutorials/an-introduction-to-configuration-management [前のガイド]で、サーバーインフラストラクチャの構成管理戦略を実装する主な利点、構成管理の方法について説明しましたツールが機能し、これらのツールに通常共通するもの。

このシリーズのこのパートでは、完全な自動化フレームワークとオーケストレーション機能を提供する構成管理ツールであるAnsibleを使用してサーバープロビジョニングを自動化するプロセスを順を追って説明します。 Apacheを使用したUbuntu 18.04 Webサーバーの展開を完全に自動化するための簡単な例を作成するために必要な言語用語、構文、および機能に焦点を当てます。

次のリストには、目標を達成するために自動化する必要があるすべての手順が含まれています。

  1. `+ apt +`キャッシュを更新する

  2. Apacheをインストールする

  3. カスタムドキュメントルートディレクトリを作成する

  4. カスタムドキュメントルートに `+ index.html`ファイルを配置します

  5. テンプレートを適用して、カスタム仮想ホストをセットアップします

  6. Apacheを再起動します

まず、Ansibleで使用される用語を確認し、次に、プレイブックの作成に使用できる主要な言語機能の概要を説明します。 ガイドの最後に、Ubuntu 18.04でApacheをセットアップするために説明されている手順を自動化するための完全なプロビジョニングの例の内容があります。

入門

Ansibleのより実践的なビューに移る前に、このツールで導入された重要な用語と概念を理解することが重要です。

用語

次のリストには、Ansibleで使用される最も関連性の高い用語の簡単な概要が含まれています。

  • * Control Node *:Ansibleがインストールされているマシンで、管理しているサーバーでプロビジョニングを実行します。

  • * Inventory *:管理しているサーバーに関する情報を含む `+ INI +`ファイル。

  • * Playbook *:自動化する必要がある一連の手順を含む `+ YAML +`ファイル。

  • タスク:実行する単一のプロシージャを定義するブロック。例:パッケージのインストール。

  • モジュール:モジュールは通常、パッケージの処理やファイルの作成と変更など、システムタスクを抽象化します。 Ansibleには多数の組み込みモジュールがありますが、カスタムモジュールを作成することもできます。

  • ロール:再利用と共有を容易にするために事前定義された方法で編成された、関連するプレイブック、テンプレート、およびその他のファイルのセット。

  • 再生:開始から終了まで実行されるプロビジョニングは_play_と呼ばれます。

  • 事実:ネットワークインターフェイスやオペレーティングシステムなど、システムに関する情報を含むグローバル変数。

  • ハンドラー:サービスの再起動やリロードなど、サービスステータスの変更をトリガーするために使用されます。

タスク形式

タスクは、Ansibleによって実行される単一の自動ステップを定義します。 通常、モジュールの使用またはrawコマンドの実行が含まれます。 タスクは次のようになります。

- name: This is a task
 apt: name=vim state=latest

`+ name `の部分は実際にはオプションですが、タスクの実行時にプロビジョニングの出力に表示されるため、推奨されます。 ` apt `部分は、Debianベースのディストリビューションでパッケージの管理を抽象化する組み込みのAnsibleモジュールです。 このサンプルタスクは、パッケージ ` vim `の状態を ` latest +`に変更する必要があることをAnsibleに伝えます。これにより、パッケージマネージャーは、まだインストールされていない場合にこのパッケージをインストールします。

プレイブック形式

プレイブックは、サーバーのプロビジョニングを自動化するための一連のディレクティブを含む「+ YAML 」ファイルです。 次の例は、2つのタスクを実行する簡単なプレイブックです。「 apt 」キャッシュを更新し、その後「 vim +」をインストールします。

---
- hosts: all
 become: true
 tasks:
    - name: Update apt-cache
      apt: update_cache=yes

    - name: Install Vim
      apt: name=vim state=latest

`+ YAML +`はインデントに依存してデータ構造をシリアル化します。 そのため、プレイブックを書くとき、特に例をコピーするときは、正しいインデントを維持するように特に注意する必要があります。

このガイドが終了する前に、詳細な説明のある実際のプレイブックの例を見ることになります。 次のセクションでは、Ansibleプレイブックの作成に使用できる最も重要な要素と機能の概要を説明します。

プレイブックを書く

Ansibleの基本的な用語とプレイブックとタスクの一般的な形式に精通したので、より汎用性の高い自動化の作成に役立つプレイブックの機能について学習します。

変数の使用

Ansibleで変数を定義する方法はいくつかあります。 最も簡単な方法は、プレイブックの `+ vars `セクションを使用することです。 以下の例では、後でタスク内で使用される変数 ` package +`を定義しています。

---
- hosts: all
 become: true
 vars:
    package: vim
 tasks:
    - name: Install Package
      apt: name={{ package }} state=latest

`+ package +`変数にはグローバルスコープがあります。つまり、含まれているファイルやテンプレートからでも、プロビジョニングの任意のポイントからアクセスできます。

ループを使用する

ループは通常、異なる入力値を使用してタスクを繰り返すために使用されます。 たとえば、10個の異なるパッケージをインストールするための10個のタスクを作成する代わりに、単一のタスクを作成し、ループを使用して、インストールするすべての異なるパッケージでタスクを繰り返すことができます。

タスク内にループを作成するには、値の配列とともにオプション `+ with_items `を含めます。 次の例に示すように、ループ変数 ` item +`を介してコンテンツにアクセスできます。

- name: Install Packages
 apt: name={{ item }} state=latest
 with_items:
    - vim
    - git
    - curl

*配列変数*を使用してアイテムを定義することもできます。

---
- hosts: all
 become: true
 vars:
    packages: [ 'vim', 'git', 'curl' ]
 tasks:
    - name: Install Package
      apt: name={{ item }} state=latest
      with_items: "{{ packages }}"

条件を使用する

条件を使用して、たとえば変数またはコマンドからの出力に基づいて、タスクを実行するかどうかを動的に決定できます。

次の例は、Debianベースのシステムのみをシャットダウンします。

- name: Shutdown Debian Based Systems
 command: /sbin/shutdown -t now
 when: ansible_os_family == "Debian"

条件付きの `+ when `は、評価される式を引数として受け取ります。 式が ` true +`に評価される場合にのみ、タスクが実行されます。 この例では、*ファクト*をテストして、オペレーティングシステムがDebianファミリーのものかどうかを確認しました。

ITオートメーションの条件の一般的な使用例は、タスクの実行がコマンドの出力に依存する場合です。 Ansibleを使用してこれを実装する方法は、コマンド実行の結果を保持する変数を登録し、次のタスクでこの変数をテストすることです。 コマンドの終了ステータス(失敗または成功の場合)をテストできます。 出力内の特定の内容を確認することもできますが、これには正規表現と文字列解析コマンドの使用が必要になる場合があります。

次の例は、 `+ php -v `コマンドからの出力に基づく2つの条件付きタスクを示しています。 PHPがこのサーバーにインストールされていない場合、コマンドの実行が失敗することがわかっているため、コマンドの終了ステータスをテストします。 タスクの ` ignore_errors +`部分は、コマンドの実行が失敗した場合でもプロビジョニングを継続するために重要です。

- name: Check if PHP is installed
 register: php_installed
 command: php -v
 ignore_errors: true

- name: This task is only executed if PHP is installed
 debug: var=php_install
 when: php_installed|success

- name: This task is only executed if PHP is NOT installed
 debug: msg='PHP is NOT installed'
 when: php_installed|failed

ここで使用される `+ debug `モジュールは、変数の内容やデバッグメッセージを表示するのに便利なモジュールです。 文字列を出力する( ` msg `引数を使用する場合)か、変数の内容を出力する( ` var +`引数を使用する場合)ことができます。

テンプレートの使用

テンプレートは通常、構成ファイルをセットアップするために使用され、変数やその他の機能を使用して、これらのファイルをより汎用的で再利用可能にすることを目的としています。 Ansibleはhttp://jinja.pocoo.org/docs/dev/[Jinja2]テンプレートエンジンを使用します。

次の例は、このホストのドキュメントルートを設定する変数を使用して、Apache仮想ホストを設定するためのテンプレートです。

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

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

組み込みモジュール `+ template `は、タスクからテンプレートを適用するために使用されます。 テンプレートファイルに ` vhost.tpl +`の名前を付けて、プレイブックと同じディレクトリに配置した場合、これはテンプレートを適用してデフォルトのApache仮想ホストを置き換える方法です。

- name: Change default Apache virtual host
 template:
   src: vhost.tpl
   dest: /etc/apache2/sites-available/000-default.conf

ハンドラーの定義とトリガー

ハンドラーは、_restart_や_stop_などのサービスの状態変更をトリガーするために使用されます。 ハンドラは通常のタスクとかなり似ているように見えますが、ハンドラはタスクの `+ notify `ディレクティブから以前にトリガーされたときにのみ実行されます。 これらは通常、プレイブックの「 handlers +」セクションの配列として定義されますが、別のファイルに保存することもできます。

Apache仮想ホストを設定する以前のテンプレートの使用例を考慮してみましょう。 仮想ホストの変更後にApacheが再起動されるようにするには、最初にApacheサービスのハンドラーを作成する必要があります。 これは、プレイブック内でハンドラーを定義する方法です。

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

   - name: other handler
     service: name=other state=restarted

ここの `+ name `ディレクティブは、このハンドラーの一意の識別子になるため重要です。 タスクからこのハンドラーをトリガーするには、 ` notify +`オプションを使用する必要があります。

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

Ansibleプレイブックの作成を開始するために使用できる最も重要な機能のいくつかを見てきました。 次のセクションでは、UbuntuでのApacheのインストールと設定を自動化する、より現実的なプレイブックの例に飛び込みます。

プレイブックの例

このガイドの概要で説明したように、Ubuntu 18.04システム内でのApache Webサーバーのインストールを自動化するプレイブックを見てみましょう。

Apacheを設定するためのテンプレートファイルとWebサーバーが提供するHTMLファイルを含む完全な例は、https://github.com/erikaheidi/cfmgmt/tree/master/ansible [on Github]にあります。 このフォルダーには、https://vagrantup.com [Vagrant]によって管理される仮想マシンを使用して、簡単な設定でプレイブックをテストできるVagrantfileも含まれています。

プレイブックの内容

あなたの便宜のために、プレイブックの完全なコンテンツがここにあります:

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

このプレイブックの各部分をさらに詳しく見てみましょう。

  • hosts:all * プレイブックは、インベントリ内の ` all `ホスト( ` hosts:all +`)に適用する必要があることを示すことから始まります。 プレイブックの実行を特定のホストまたはホストのグループに制限することができます。 このオプションは、実行時に上書きできます。

  • become:true * + `+ become:true +`部分は、このPlaybookのすべてのタスクを実行するために特権エスカレーション(sudo)を使用するようAnsibleに指示します。 このオプションは、タスクごとに上書きできます。

  • vars * 後でタスクで使用される変数 ` doc_root +`を定義します。 このセクションには複数の変数を含めることができます。

  • tasks * 実際のタスクが定義されているセクション。 最初のタスクは ` apt `キャッシュを更新し、2番目のタスクはパッケージ ` apache2 +`をインストールします。

3番目のタスクは、組み込みモジュール* file *を使用して、ドキュメントルートとして機能するディレクトリを作成します。 このモジュールは、ファイルとディレクトリの管理に使用できます。

4番目のタスクは、モジュール* copy *を使用して、ローカルファイルをリモートサーバーにコピーします。 ApacheがホストするWebサイトとして提供される単純なHTMLファイルをコピーしています。

  • handlers * 最後に、サービスが宣言される ` handlers `セクションがあります。 Apacheテンプレートが適用される4番目のタスクから通知される ` restart apache`ハンドラーを定義します。

プレイブックの実行

このプレイブックのコンテンツをAnsibleコントロールノードにダウンロードしたら、 `+ ansible-playbook +`を使用してインベントリの1つ以上のノードで実行できます。 次のコマンドは、SSHキーペア認証を使用して現在のシステムユーザーとして接続し、デフォルトのインベントリファイルから*すべて*ホストでプレイブックを実行します。

ansible-playbook playbook.yml

また、「+-l +」を使用して、インベントリから単一のホストまたはホストのグループに実行を制限することもできます。

ansible-playbook -l  playbook.yml

リモートサーバーに接続するために別のSSHユーザーを指定する必要がある場合は、そのコマンドに引数 `+ -u +`を含めることができます。

ansible-playbook -l  playbook.yml -u

Ansibleコマンドとプレイブックの実行方法の詳細については、https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-ansible-on-ubuntu-18-のガイドを参照してください。 04 [Ubuntu 18.04にAnsibleをインストールおよび設定する方法]。

結論

Ansibleは、学習曲線が低く、プロビジョニングスクリプトに「+ YAML +」を使用する最小限のIT自動化ツールです。 パッケージのインストールやテンプレートの操作などのタスクを抽象化するために使用できる多数の組み込みモジュールがあります。 簡素化されたインフラストラクチャ要件とシンプルな言語は、構成管理を開始するユーザーに適しています。 ただし、PuppetやChefなどのより複雑なツールで使用できる高度な機能が欠けている場合があります。

https://www.digitalocean.com/community/tutorials/configuration-management-101-writing-puppet-manifests [このシリーズの次のパート]では、よく知られ確立された構成であるPuppetの実用的な概要を見ることができます。 Rubyに基づく表現力豊かで強力なカスタムDSLを使用してプロビジョニングスクリプトを記述する管理ツール。

Related