序章

簡単に言うと、サーバー構成管理(一般にITオートメーションとも呼ばれます)は、インフラストラクチャ管理をコードベースに変換するソリューションであり、バージョン管理して簡単に再利用できる一連のプロビジョニングスクリプトでサーバーを展開するために必要なすべてのプロセスを記述します。 時間の経過とともに、サーバーインフラストラクチャの整合性を大幅に向上させることができます。

以前のガイドでは、サーバーインフラストラクチャに構成管理戦略を実装する主な利点、構成管理ツールの仕組み、およびこれらのツールに通常共通するものについて説明しました。

シリーズのこのパートでは、究極のシンプルさとミニマリズムの目標を維持しながら、完全な自動化フレームワークとオーケストレーション機能を提供する構成管理ツールであるAnsibleを使用してサーバープロビジョニングを自動化するプロセスについて説明します。 Apacheを使用してUbuntu18.04Webサーバーのデプロイメントを完全に自動化するための簡略化された例を作成するために必要な言語の用語、構文、および機能に焦点を当てます。

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

  1. aptキャッシュを更新します
  2. Apacheをインストールします
  3. カスタムドキュメントルートディレクトリを作成します
  4. index.htmlファイルをカスタムドキュメントルートに配置します
  5. テンプレートを適用して、カスタム仮想ホストを設定します
  6. Apacheを再起動します

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

:このガイドは、Ansible言語と、サーバープロビジョニングを自動化するためのプレイブックの作成方法を紹介することを目的としています。 このツールのインストールと開始に必要な手順、Ansibleコマンドとプレイブックの実行方法など、Ansibleの概要については、 Ubuntu18.04ガイドにAnsibleをインストールして構成する方法を確認してください。 。

入門

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

用語

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

  • コントロールノード:Ansibleがインストールされているマシンで、管理しているサーバーでプロビジョニングを実行します。
  • Inventory :管理しているサーバーに関する情報を含むINIファイル。
  • Playbook :自動化する必要のある一連の手順を含むYAMLファイル。
  • タスク:実行する単一のプロシージャを定義するブロック。例:パッケージのインストール。
  • Module :モジュールは通常、パッケージの処理やファイルの作成と変更などのシステムタスクを抽象化します。 Ansibleには多数の組み込みモジュールがありますが、カスタムモジュールを作成することもできます。
  • Role :再利用と共有を容易にするために事前定義された方法で編成された、関連するプレイブック、テンプレート、およびその他のファイルのセット。
  • Play :最初から最後まで実行されるプロビジョニングは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と評価された場合にのみ、タスクが実行されます。 この例では、 fact をテストして、オペレーティングシステムが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はJinja2テンプレートエンジンを使用します。

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

<VirtualHost *:80>
    ServerAdmin [email protected]
    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

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

ハンドラーは、restartstopなどのサービスの状態変更をトリガーするために使用されます。 通常のタスクとかなり似ているように見えますが、ハンドラーは、タスク内の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のインストールと構成を自動化するプレイブックの実際の例について詳しく説明します。

プレイブックの例

次に、このガイドの概要で説明されているように、Ubuntu18.04システム内でのApacheWebサーバーのインストールを自動化するプレイブックを見てみましょう。

Apacheを設定するためのテンプレートファイルとWebサーバーによって提供されるHTMLファイルを含む完全な例は、Githubにあります。 このフォルダーには、 Vagrant によって管理される仮想マシンを使用して、簡単なセットアップでプレイブックをテストできるVagrantfileも含まれています。

プレイブックの内容

プレイブックの全内容は、あなたの便宜のためにここにあります:

playbook.yml
  1. ---
  2. - hosts: all
  3. become: true
  4. vars:
  5. doc_root: /var/www/example
  6. tasks:
  7. - name: Update apt
  8. apt: update_cache=yes
  9. - name: Install Apache
  10. apt: name=apache2 state=latest
  11. - name: Create custom document root
  12. file: path={{ doc_root }} state=directory owner=www-data group=www-data
  13. - name: Set up HTML file
  14. copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644
  15. - name: Set up Apache virtual host file
  16. template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
  17. notify: restart apache
  18. handlers:
  19. - name: restart apache
  20. service: name=apache2 state=restarted

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

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

become:true become: trueの部分は、このプレイブックのすべてのタスクを実行するために特権昇格(sudo)を使用するようにAnsibleに指示します。 このオプションは、タスクごとに上書きできます。

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

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

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

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

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

プレイブックの実行

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

  1. ansible-playbook playbook.yml

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

  1. ansible-playbook -l host_or_group playbook.yml

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

  1. ansible-playbook -l host_or_group playbook.yml -u remote-user

Ansibleコマンドとプレイブックの実行方法の詳細については、 Ubuntu18.04にAnsibleをインストールして構成する方法に関するガイドを参照してください。

結論

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

このシリーズの次のパートでは、Rubyに基づく表現力豊かで強力なカスタムDSLを使用してプロビジョニングスクリプトを作成する、人気のある定評のある構成管理ツールであるPuppetの実用的な概要を説明します。