カスタム、Git、およびシステムロールを使用してプレイブックをアセンブルおよび実行する
このステップでは、準備したすべてのコンポーネント(カスタムロール、Git からの依存関係、RHEL システムロール)を統合します。これらのロールをオーケストレーションして開発 Web サーバーを完全に構成するメインプレイブックを作成します。
このステップは、さまざまな部品から複雑な機械を組み立てるようなものだと考えてください。各ロールは特定の目的を果たし、それらが連携して完全な Web サーバー環境を作成します。これを管理可能な小さな部分に分解しましょう。
まず、メインプロジェクトディレクトリにいることを確認してください。
cd ~/project
構成に入る前に、何を作成しているのかを理解しましょう。
- Ansible Configuration: Ansible の動作方法とファイルの検索場所を設定します。
- Inventory: 管理するサーバーを定義します(この場合は localhost)。
- Variables: ロールが使用するデータを格納します(開発者情報、SELinux 設定)。
- Custom Role Content: 開発者環境を構成する実際のタスクです。
- Main Playbook: すべてを正しい順序で実行するオーケストレーターです。
1. Ansible 構成とインベントリの作成
ansible.cfgファイルは、Ansible に動作方法を指示する設定ファイルのようなものです。これがないと、すべてのコマンドでパスとオプションを指定する必要があります。これがあれば、Ansible はロール、コレクション、インベントリの場所を自動的に認識します。
nanoを使用してansible.cfgファイルを作成します。このファイルは、Ansible がロール、コレクション、インベントリの場所をどこで見つけるかを指示します。
nano ansible.cfg
以下の内容を追加します。各行を理解しましょう。
[defaults]
inventory = inventory
roles_path = roles
collections_paths = collections
host_key_checking = False
[privilege_escalation]
become = True
各設定の意味:
inventory = inventory: -i inventoryを毎回入力する代わりに、Ansible はこのファイルを自動的に使用します。
roles_path = roles: Ansible はrolesディレクトリでロールを探します。
collections_paths = collections: Ansible はインストールされたコレクションをここで見つけます。
host_key_checking = False: ラボ環境での SSH キー検証エラーを防ぎます。
become = True: 必要に応じて、昇格された権限でタスクを自動的に実行します。
nanoを保存して終了します(Ctrl+X、次にY、次にEnterを押します)。
インベントリファイルは、Ansible がどのマシンを管理するかを指示します。この場合、ローカルマシンを構成しています。
nano inventory
次の行を追加します。
localhost ansible_connection=local
これはどういう意味か:
localhost: 対象ホストの名前です。
ansible_connection=local: SSH の代わりにローカル接続を使用します(Ansible を実行しているのと同じマシンを管理しているため)。
nanoを保存して終了します。
2. ロール変数の定義
Ansible の変数は、ロールが使用できる設定のようなものです。タスクにユーザー名やポート番号のような値をハードコーディングする代わりに、変数ファイルで定義します。これにより、自動化が柔軟で再利用可能になります。
group_vars/allディレクトリは、Ansible がすべてのホストの変数を自動的にロードする特別な場所です。このディレクトリ内の任意の YAML ファイルが、プレイブックやロールで利用可能になります。
すべてのホストに適用される変数のディレクトリ構造を作成します。
mkdir -p group_vars/all
次に、開発者情報用の変数ファイルを作成します。このデータは、カスタムロールがユーザーアカウントと Web 構成を作成するために使用します。
nano group_vars/all/developers.yml
次の内容を追加します。
---
web_developers:
- username: jdoe ## First developer
port: 9081 ## Custom port for this developer's website
- username: jdoe2 ## Second developer
port: 9082 ## Custom port for this developer's website
このデータ構造の意味:
web_developers: 開発者情報を含むリストです。
- 各開発者には
usernameとportがあります。
- カスタムロールは、このリストをループして各開発者の構成を作成します。
保存して終了します。
次に、SELinux 構成用の変数ファイルを作成します。SELinux(Security-Enhanced Linux)は、アプリケーションができることを制御するセキュリティモジュールです。
nano group_vars/all/selinux.yml
次の内容を追加します。
---
selinux_state: enforcing ## Set SELinux to enforcing mode (highest security)
selinux_ports: ## List of ports to allow Apache to use
- ports: "9081" ## Allow port 9081
proto: "tcp" ## Protocol: TCP
setype: "http_port_t" ## SELinux type: HTTP port
state: "present" ## Add this rule
- ports: "9082" ## Allow port 9082
proto: "tcp" ## Protocol: TCP
setype: "http_port_t" ## SELinux type: HTTP port
state: "present" ## Add this rule
SELinux 設定の理解:
selinux_state: enforcing: SELinux は不正な操作を積極的にブロックします。
selinux_ports: ポート構成のリストです。
http_port_t: Apache がポートにバインドすることを許可する SELinux タイプです。
- デフォルトでは、Apache はポート 80 と 443 しか使用できません。ポート 9081 と 9082 を明示的に許可する必要があります。
保存して終了します。
3. カスタムロールの入力
apache.developer_configsロールには現在ディレクトリ構造がありますが、実際のコンテンツはありません。以下を追加する必要があります。
- Templates: 変数を含めることができるファイル(Jinja2 構文を使用)。
- Tasks: Ansible が実行する実際の作業。
- Handlers: 通知されたときにのみ実行される特別なタスク(サービスの再起動など)。
- Metadata: ロールの依存関係に関する情報。
テンプレートを使用すると、変数に基づいて適応する設定ファイルを作成できます。.j2拡張子は、これが Jinja2 テンプレートであることを示します。
nano roles/apache.developer_configs/templates/developer.conf.j2
次の内容を追加します。
{% for dev in web_developers %}
Listen {{ dev.port }}
<VirtualHost *:{{ dev.port }}>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/{{ dev.username }}
<Directory /var/www/{{ dev.username }}>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
{% endfor %}
テンプレート構文の理解:
{% for dev in web_developers %}: 開発者リストのループを開始します。
{{ dev.port }}: この開発者のポート番号を挿入します。
{{ dev.username }}: この開発者のユーザー名を挿入します。
{% endfor %}: ループを終了します。
- 結果として、各開発者の個別の仮想ホスト構成が生成されます。
これが作成するもの: 2 人の開発者に対して、このテンプレートは次の Apache 構成を生成します。
- Apache をポート 9081 および 9082 でリッスンさせます。
/var/www/jdoeおよび/var/www/jdoe2からコンテンツを提供する仮想ホストを作成します。
- 各ディレクトリに適切な権限を設定します。
保存して終了します。
タスクは、Ansible が実行する実際の作業です。各タスクは、特定のことを達成するために Ansible モジュールを使用します。
nano roles/apache.developer_configs/tasks/main.yml
次の内容を追加し、各タスクを理解しましょう。
---
## Task 1: Create user accounts for each developer
- name: Create developer user accounts
ansible.builtin.user: ## Use the 'user' module
name: "{{ item.username }}" ## Create user with this name
state: present ## Ensure the user exists
loop: "{{ web_developers }}" ## Do this for each developer in the list
## Task 2: Create web directories for each developer
- name: Create developer web root directories
ansible.builtin.file: ## Use the 'file' module
path: "/var/www/{{ item.username }}" ## Create this directory
state: directory ## Ensure it's a directory
owner: "{{ item.username }}" ## Set the owner
group: "{{ item.username }}" ## Set the group
mode: "0755" ## Set permissions (rwxr-xr-x)
loop: "{{ web_developers }}"
## Task 3: Create a sample webpage for each developer
- name: Create a sample index.html for each developer
ansible.builtin.copy: ## Use the 'copy' module
content: "Welcome to {{ item.username }}'s dev space\n" ## File content
dest: "/var/www/{{ item.username }}/index.html" ## Where to put the file
owner: "{{ item.username }}" ## File owner
group: "{{ item.username }}" ## File group
mode: "0644" ## File permissions (rw-r--r--)
loop: "{{ web_developers }}"
## Task 4: Deploy the Apache configuration file
- name: Deploy developer apache configs
ansible.builtin.template: ## Use the 'template' module
src: developer.conf.j2 ## Source template file
dest: /etc/httpd/conf.d/developer.conf ## Destination on the server
mode: "0644" ## File permissions
notify: restart apache ## Trigger the restart handler when this changes
主要な概念の理解:
loop: リストの各項目に対してタスクを繰り返します。
{{ item.username }}: ループ内の現在の項目のユーザー名を参照します。
notify: restart apache: このタスクが変更を加えると、「restart apache」というハンドラーがトリガーされます。
- ファイル権限:
0755は、所有者が読み取り/書き込み/実行可能で、他者は読み取り/実行可能であることを意味します。0644は、所有者が読み取り/書き込み可能で、他者は読み取りのみ可能であることを意味します。
保存して終了します。
ハンドラーは、他のタスクから通知されたときにのみ実行される特別なタスクです。通常、サービスの再起動などのアクションに使用されます。
nano roles/apache.developer_configs/handlers/main.yml
次の内容を追加します。
---
- name: restart apache ## This name must match the notify: statement
ansible.builtin.service: ## Use the 'service' module
name: httpd ## The service name (Apache is called 'httpd' on RHEL)
state: restarted ## Restart the service
ハンドラーを使用する理由:
- 効率性:設定が実際に変更された場合にのみサービスが再起動されます。
- 順序:すべてのタスクが最初に実行され、その後すべてのハンドラーが最後に実行されます。
- 冪等性:複数のタスクが同じハンドラーを通知できますが、それは一度だけ実行されます。
保存して終了します。
最後に、カスタムロールが以前にインストールしたinfra.apacheロールに依存していることを Ansible に伝える必要があります。
nano roles/apache.developer_configs/meta/main.yml
ファイルのコンテンツを次のように置き換えます。
---
dependencies:
- role: infra.apache ## This role must run before our custom role
これは何をするか:
- Ansible が
apache.developer_configsを実行すると、まずinfra.apacheが自動的に実行されます。
- これにより、カスタム構成を追加する前に Apache がインストールされ構成されることが保証されます。
- 依存関係はリストされた順序で実行されます。
保存して終了します。
4. メインプレイブックのアセンブルと実行
プレイブックは、Ansible に何を行い、どのような順序で行うかを指示するレシピのようなものです。プレイブックは次のことを行います。
- SELinux 設定の構成(pre_tasks)。
- ロールの実行(依存関係チェーンを含む)。
メインプレイブックファイルを作成します。
nano web_dev_server.yml
詳細な説明とともに次の内容を追加します。
---
- name: Configure Dev Web Server ## Playbook name
hosts: localhost ## Run on localhost
pre_tasks: ## Tasks that run before roles
## Task 1: Configure SELinux mode
- name: Set SELinux to enforcing mode
ansible.posix.selinux: ## Module from ansible.posix collection
policy: targeted ## Use the 'targeted' SELinux policy
state: "{{ selinux_state }}" ## Use the variable we defined
when: selinux_state is defined ## Only run if the variable exists
## Task 2: Configure SELinux ports
- name: Configure SELinux ports for Apache
community.general.seport: ## Module from community.general collection
ports: "{{ item.ports }}" ## Port number
proto: "{{ item.proto }}" ## Protocol (tcp)
setype: "{{ item.setype }}" ## SELinux type (http_port_t)
state: "{{ item.state }}" ## present or absent
loop: "{{ selinux_ports }}" ## Loop through our port list
when: selinux_ports is defined ## Only run if the variable exists
roles: ## Roles to execute
- apache.developer_configs ## Our custom role (which will trigger infra.apache)
実行順序の理解:
pre_tasks: SELinux 構成が最初に実行されます。
roles: ロールの依存関係(infra.apache)が実行され、次にカスタムロールが実行されます。
handlers: 通知されたハンドラーが最後に実行されます。
この順序が重要な理由:
- Apache がカスタムポートにバインドしようとする前に SELinux を構成する必要があります。
- 仮想ホストを構成する前に Apache をインストールする必要があります。
- すべての構成が完了した後でサービスの再起動が行われます。
保存して終了します。
これで、完全な自動化を実行する準備ができました。
ansible-playbook web_dev_server.yml
プレイブックが実行され、詳細な出力が表示されます。期待される内容は次のとおりです(例)。
PLAY [Configure Dev Web Server] *************************************************
TASK [Gathering Facts] **********************************************************
ok: [localhost] ## Ansible collects system information
TASK [Set SELinux to enforcing mode] *******************************************
changed: [localhost] ## SELinux mode was changed
TASK [Configure SELinux ports for Apache] **************************************
changed: [localhost] => (item={'ports': '9081', 'proto': 'tcp', 'setype': 'http_port_t', 'state': 'present'})
changed: [localhost] => (item={'ports': '9082', 'proto': 'tcp', 'setype': 'http_port_t', 'state': 'present'})
TASK [infra.apache : Ensure Apache is installed.] *******************************
changed: [localhost] ## Apache package was installed
TASK [apache.developer_configs : Create developer user accounts] ****************
changed: [localhost] => (item={'username': 'jdoe', 'port': 9081})
changed: [localhost] => (item={'username': 'jdoe2', 'port': 9082})
TASK [apache.developer_configs : Create developer web root directories] *********
changed: [localhost] => (item={'username': 'jdoe', 'port': 9081})
changed: [localhost] => (item={'username': 'jdoe2', 'port': 9082})
TASK [apache.developer_configs : Create a sample index.html for each developer] *
changed: [localhost] => (item={'username': 'jdoe', 'port': 9081})
changed: [localhost] => (item={'username': 'jdoe2', 'port': 9082})
TASK [apache.developer_configs : Deploy developer apache configs] ***************
changed: [localhost] ## Configuration file was created
RUNNING HANDLER [apache.developer_configs : restart apache] *********************
changed: [localhost] ## Apache was restarted
PLAY RECAP **********************************************************************
localhost : ok=17 changed=12 unreachable=0 failed=0 skipped=3 rescued=0 ignored=0
複数のソースからの複数のロールを組み合わせて、完全な Web 開発環境を作成する複雑なプレイブックを正常にアセンブルして実行しました!