序章

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 作業するのは次のようになります。

プレイブックの例
  1. ---
  2. - hosts: all
  3. become: true
  4. roles:
  5. - apache
  6. vars:
  7. doc_root: /var/www/example

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

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

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

役割の作成


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

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

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

  1. cd ~
  2. mkdir roles
  3. cd roles

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

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

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

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

  1. mkdir apache
  2. cd apache

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

  1. mkdir defaults files handlers meta templates tasks vars

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

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

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

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

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


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

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

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


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

  1. cd ~/roles/apache/tasks

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

  1. nano main.yml

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

main.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

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

main.yml
  1. ---
  2. - name: Update apt
  3. apt: update_cache=yes
  4. - name: Install Apache
  5. apt: name=apache2 state=latest
  6. - name: Create custom document root
  7. file: path={{ doc_root }} state=directory owner=www-data group=www-data
  8. - name: Set up HTML file
  9. copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644
  10. - name: Set up Apache virtual host file
  11. template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
  12. notify: restart apache

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

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

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

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

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

初め cdhandlers 私たちの役割のサブディレクトリ:

  1. cd ~/roles/apache/handlers

もう一度、テキストエディタでファイルを開き、元のコンテンツ全体を貼り付けます playbook.yml:

  1. nano main.yml

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

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

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

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

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

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


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

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

  1. cd ~/roles/apache/files
  2. 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でファイルを編集します。

  1. cd ~/roles/apache/templates
  2. 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 ロールディレクトリ(この例ではホームディレクトリ)から。 これで、プレイブックファイルを作成できます。

  1. cd ~
  2. 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つのファイルにある場合とまったく同じです。

  1. ansible-playbook playbook.yml
Output
PLAY [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は、ユーザーが提供する役割のリポジトリであり、プレイブックに追加して、自分で作成しなくてもさまざまなタスクを実行できます。

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

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

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

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

Output
Found 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 指図:

  1. 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 役割、Apacheがリモートシステムでセットアップおよび構成されていることを確認してから、 geerlingguy.php 役割の場所。 含めることもできます mysql、 と wordpress リモートサーバーの動作に応じて、任意の順序で役割を選択します。

ランニング ansible-playbook playbook.yml Galaxyの役割を追加すると、次のような出力になります。

Output
PLAY [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コードがクリーンで読みやすいことを保証します。 最も重要なことは、ロールを使用すると、コードを簡単に再利用および共有し、制御されたモジュール方式で変更を実装できることです。