はじめに
Ansible は、インフラストラクチャ管理を簡素化する強力な IT 自動化ツールです。この実践的な実験(Lab)では、Ansible を使用して、ターゲットシステム上に特定のコンテンツを持つファイルを作成する方法を学びます。この実験(Lab)の終わりには、Ansible のファイル管理の基本を理解し、独自のインフラストラクチャで自動化されたファイル作成を実装できるようになります。
Ansible のインストールとセットアップ
Ansible を使用してファイルを作成する前に、システムにインストールして設定する必要があります。環境をセットアップしましょう。
Ansible のインストール
まず、パッケージリストを更新し、Ubuntu 22.04 システムに Ansible をインストールします。
sudo apt update
sudo apt install -y ansible
これらのコマンドを実行すると、Ansible が正常にインストールされたことを示す出力が表示されるはずです。インストールを確認しましょう。
ansible --version
次のような出力が表示されるはずです。
ansible [core 2.12.0]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.x (default, ...) [GCC 11.2.0]
jinja version = 3.0.3
libyaml = True
簡単な Ansible インベントリの作成
Ansible は、管理するホストを定義するためにインベントリファイルを使用します。この実験(Lab)では、自分のマシンを含むローカルインベントリを作成します。
- Ansible プロジェクト用の新しいディレクトリを作成します。
mkdir -p ~/project/ansible-files
cd ~/project/ansible-files
- VSCode を使用してインベントリファイルを作成します。
- WebIDE のエクスプローラーアイコンをクリックします。
~/project/ansible-filesディレクトリに移動します。- 右クリックして「新しいファイル」を選択します。
- ファイル名を
inventoryとします。 - ファイルに次の内容を追加します。
[local]
localhost ansible_connection=local
このインベントリファイルは、SSH を使用せずにローカルマシンでコマンドを実行するように Ansible に指示します。
- 同じディレクトリに簡単な
ansible.cfgファイルを作成します。- WebIDE のエクスプローラーアイコンをクリックします。
~/project/ansible-filesディレクトリに移動します。- 右クリックして「新しいファイル」を選択します。
- ファイル名を
ansible.cfgとします。 - ファイルに次の内容を追加します。
[defaults]
inventory = ./inventory
host_key_checking = False
- 簡単な Ansible コマンドを実行して、セットアップを確認しましょう。
cd ~/project/ansible-files
ansible local -m ping
次のような出力が表示されるはずです。
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
これにより、Ansible が正しくインストールされ、ローカルマシンでコマンドを実行するように設定されていることが確認されます。
Ansible Playbook を使用したコンテンツ付きファイルの作成
Ansible のセットアップが完了したので、コンテンツ付きファイルの作成方法を学びましょう。Ansible は、ファイルを管理するためのいくつかのモジュールを提供しており、このステップでは copy モジュールに焦点を当てます。
Ansible Playbook の理解
Ansible Playbook は、ターゲットホストで実行される一連のタスクを記述する YAML ファイルです。各タスクは、特定のアクションを実行するために、特定の Ansible モジュールを利用します。
コンテンツ付きのファイルを作成するための最初の Playbook を作成しましょう。
- WebIDE で、
~/project/ansible-filesディレクトリに新しいファイルを作成します。- ディレクトリを右クリックして「新しいファイル」を選択します。
- ファイル名を
create_file.ymlとします。 - 次の内容を追加します。
---
- name: Create a file with content
hosts: local
tasks:
- name: Create a simple text file
copy:
dest: "~/project/hello.txt"
content: |
Hello from Ansible!
This file was created using the Ansible copy module.
Current date: {{ ansible_date_time.date }}
この Playbook が何をするのかを理解しましょう。
hosts: local行は、この Playbook がインベントリのlocalグループ内のホストで実行されることを指定します。tasksセクションには、実行するタスクのリストが含まれています。copyモジュールは、コンテンツ付きのファイルを作成するために使用されます。destパラメータは、ファイルの宛先パスを指定します。contentパラメータには、ファイルに書き込まれるテキストコンテンツが含まれています。{{ ansible_date_time.date }}は、Playbook の実行時に現在の日付に置き換えられる変数です。
- 次に、Playbook を実行しましょう。
cd ~/project/ansible-files
ansible-playbook create_file.yml
次のような出力が表示されるはずです。
PLAY [Create a file with content] ***********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a simple text file] ***********************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- ファイルが作成され、期待されるコンテンツが含まれていることを確認しましょう。
cat ~/project/hello.txt
次のような出力が表示されるはずです。
Hello from Ansible!
This file was created using the Ansible copy module.
Current date: 2023-08-15
日付は、Playbook を実行した現在の日付を反映します。
Ansible における冪等性(Idempotence)
冪等性(Idempotence)は Ansible の重要な機能です。同じ Playbook を複数回実行しても、同じ結果が得られるはずです。Playbook をもう一度実行して、冪等性がどのように機能するかを見てみましょう。
ansible-playbook create_file.yml
今回は、「changed」カウントが 0 になるはずです。
PLAY [Create a file with content] ***********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a simple text file] ***********************************************
ok: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
これは、Ansible がファイルが既に正しいコンテンツで存在すること認識し、再度変更しないことを示しています。
Ansible での変数とテンプレートの使用
このステップでは、変数とテンプレートを使用して、Ansible でより動的なファイルを作成する方法を説明します。
変数の使用
変数は、Playbook をより柔軟で再利用可能にします。変数を使用して設定ファイルを作成する Playbook を作成しましょう。
- WebIDE で、
~/project/ansible-filesディレクトリに新しいファイルを作成します。- ディレクトリを右クリックして「新しいファイル」を選択します。
- ファイル名を
variables_demo.ymlとします。 - 次の内容を追加します。
---
- name: Create files using variables
hosts: local
vars:
app_name: "MyApplication"
app_version: "1.0.0"
port_number: 8080
log_level: "INFO"
tasks:
- name: Create config file with variables
copy:
dest: "~/project/app_config.ini"
content: |
## Configuration for {{ app_name }}
## Generated by Ansible
[application]
name = {{ app_name }}
version = {{ app_version }}
[server]
port = {{ port_number }}
log_level = {{ log_level }}
この Playbook では、
varsセクションは、Playbook 全体で使用できる変数を定義します。- 変数は、
{{ variable_name }}構文を使用して参照されます。 copyモジュールは、これらの変数を含むコンテンツでファイルを作成するために使用されます。
- 次に、Playbook を実行しましょう。
cd ~/project/ansible-files
ansible-playbook variables_demo.yml
次のような出力が表示されるはずです。
PLAY [Create files using variables] ********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create config file with variables] ***************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- 生成されたファイルの内容を調べてみましょう。
cat ~/project/app_config.ini
次のような出力が表示されるはずです。
## Configuration for MyApplication
## Generated by Ansible
[application]
name = MyApplication
version = 1.0.0
[server]
port = 8080
log_level = INFO
Jinja2 テンプレートの使用
より複雑なファイルコンテンツの場合、Ansible は Jinja2 テンプレートをサポートしています。テンプレートファイルを作成し、Playbook で使用してみましょう。
- テンプレートディレクトリを作成します。
mkdir -p ~/project/ansible-files/templates
- WebIDE でテンプレートファイルを作成します。
~/project/ansible-files/templatesディレクトリに移動します。- 右クリックして「新しいファイル」を選択します。
- ファイル名を
web_config.j2とします。 - 次の内容を追加します。
## Web Server Configuration
## Generated by Ansible on {{ ansible_date_time.date }}
server {
listen {{ web_port }};
server_name {{ server_name }};
location / {
root {{ doc_root }};
index index.html;
}
{% if enable_ssl %}
## SSL Configuration
ssl_certificate {{ ssl_cert }};
ssl_certificate_key {{ ssl_key }};
{% endif %}
}
- 次に、このテンプレートを使用する Playbook を作成します。
~/project/ansible-filesディレクトリに移動します。- 右クリックして「新しいファイル」を選択します。
- ファイル名を
template_demo.ymlとします。 - 次の内容を追加します。
---
- name: Create files using templates
hosts: local
vars:
web_port: 80
server_name: "example.com"
doc_root: "/var/www/html"
enable_ssl: true
ssl_cert: "/etc/ssl/certs/example.com.crt"
ssl_key: "/etc/ssl/private/example.com.key"
tasks:
- name: Create web server config from template
template:
src: templates/web_config.j2
dest: ~/project/web_server.conf
この Playbook では、
templateモジュールがcopyの代わりに使用されます。srcパラメータは、テンプレートファイルを指します。destパラメータは、出力ファイルの作成場所を指定します。varsセクションで定義された変数は、テンプレートで使用されます。
- Playbook を実行します。
cd ~/project/ansible-files
ansible-playbook template_demo.yml
次のような出力が表示されるはずです。
PLAY [Create files using templates] ********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create web server config from template] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- 生成された設定ファイルを調べてみましょう。
cat ~/project/web_server.conf
次のような出力が表示されるはずです。
## Web Server Configuration
## Generated by Ansible on 2023-08-15
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
## SSL Configuration
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
}
Jinja2 テンプレートが変数でレンダリングされ、enable_ssl が true に設定されているため、SSL の条件付きセクションが含まれていることに注意してください。
Ansible を使用した高度なファイル管理
この最終ステップでは、ファイルパーミッション、条件付きファイル作成、および複数のファイル関連モジュールの使用など、Ansible を使用した高度なファイル管理テクニックを探求します。
ファイルパーミッションと所有権の設定
ファイルを作成する際には、多くの場合、特定のパーミッションと所有権を設定する必要があります。これを示す Playbook を作成しましょう。
- WebIDE で新しいファイルを作成します。
~/project/ansible-filesディレクトリに移動します。- 右クリックして「新しいファイル」を選択します。
- ファイル名を
file_permissions.ymlとします。 - 次の内容を追加します。
---
- name: Manage file permissions and ownership
hosts: local
tasks:
- name: Create a script file with execute permissions
copy:
dest: ~/project/script.sh
content: |
#!/bin/bash
echo "This script was created by Ansible"
echo "Current user: $(whoami)"
echo "Current directory: $(pwd)"
mode: "0755"
- name: Create a read-only configuration file
copy:
dest: ~/project/readonly.conf
content: |
## This is a read-only configuration file
setting1 = value1
setting2 = value2
mode: "0444"
この Playbook では、
modeパラメータは、ファイルパーミッションを設定するために使用されます。0755は、所有者に対して読み取り、書き込み、実行を許可し、グループとその他に対して読み取りと実行を許可します。0444は、すべての人に対して読み取り専用を意味します。
- Playbook を実行します。
cd ~/project/ansible-files
ansible-playbook file_permissions.yml
次のような出力が表示されるはずです。
PLAY [Manage file permissions and ownership] **********************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a script file with execute permissions] **************************
changed: [localhost]
TASK [Create a read-only configuration file] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- 作成されたファイルのパーミッションを確認しましょう。
ls -l ~/project/script.sh ~/project/readonly.conf
次のような出力が表示されるはずです。
-rwxr-xr-x 1 labex labex 118 Aug 15 12:34 /home/labex/project/script.sh
-r--r--r-- 1 labex labex 73 Aug 15 12:34 /home/labex/project/readonly.conf
- スクリプトが実行可能であることを確認しましょう。
~/project/script.sh
次のような出力が表示されるはずです。
This script was created by Ansible
Current user: labex
Current directory: /home/labex/project/ansible-files
条件付きファイル作成
特定の条件が満たされた場合にのみファイルを作成する必要がある場合があります。条件付きファイル作成を示す Playbook を作成しましょう。
- WebIDE で新しいファイルを作成します。
~/project/ansible-filesディレクトリに移動します。- 右クリックして「新しいファイル」を選択します。
- ファイル名を
conditional_file.ymlとします。 - 次の内容を追加します。
---
- name: Conditional file creation
hosts: local
vars:
environment: "development"
create_debug_file: true
create_backup: false
tasks:
- name: Create environment-specific configuration
copy:
dest: "~/project/{{ environment }}_config.yml"
content: |
## Configuration for {{ environment }} environment
debug: {{ 'enabled' if environment == 'development' else 'disabled' }}
log_level: {{ 'DEBUG' if environment == 'development' else 'INFO' }}
- name: Create debug log file
copy:
dest: ~/project/debug.log
content: |
## Debug log file
## Created: {{ ansible_date_time.iso8601 }}
mode: "0644"
when: create_debug_file
- name: Create backup directory
file:
path: ~/project/backup
state: directory
mode: "0755"
when: create_backup
この Playbook では、
whenディレクティブは、タスクの条件付き実行に使用されます。- Jinja2 の条件文は、変数を基に値を変更するためにファイルコンテンツで使用されます。
fileモジュールは、ディレクトリを作成するために使用されます。
- Playbook を実行します。
cd ~/project/ansible-files
ansible-playbook conditional_file.yml
次のような出力が表示されるはずです。
PLAY [Conditional file creation] **********************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create environment-specific configuration] ******************************
changed: [localhost]
TASK [Create debug log file] **************************************************
changed: [localhost]
TASK [Create backup directory] ************************************************
skipped: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
create_backup が false に設定されているため、「Create backup directory」タスクがスキップされたことに注意してください。
- 作成されたファイルを調べてみましょう。
cat ~/project/development_config.yml
cat ~/project/debug.log
ls -la ~/project/ | grep backup
作成された 2 つのファイルの内容が表示され、バックアップディレクトリが作成されていないことを確認できます。
複数のファイル関連モジュールの使用
Ansible は、ファイル管理のためのいくつかのモジュールを提供しています。複数のファイル関連モジュールを使用する Playbook を作成しましょう。
- WebIDE で新しいファイルを作成します。
~/project/ansible-filesディレクトリに移動します。- 右クリックして「新しいファイル」を選択します。
- ファイル名を
file_modules.ymlとします。 - 次の内容を追加します。
---
- name: Demonstrate file-related modules
hosts: local
tasks:
- name: Create a directory
file:
path: ~/project/ansible_demo
state: directory
mode: "0755"
- name: Create a file using the copy module
copy:
dest: ~/project/ansible_demo/copied.txt
content: "This file was created using the copy module.\n"
- name: Create a symbolic link
file:
src: ~/project/ansible_demo/copied.txt
dest: ~/project/ansible_demo/link_to_copied.txt
state: link
- name: Create a file with blockinfile module
blockinfile:
path: ~/project/ansible_demo/block.txt
create: true
block: |
This is a block of text
that will be inserted
as a single unit.
marker: "## {mark} ANSIBLE MANAGED BLOCK"
この Playbook では、
fileモジュールは、state: directoryと共に使用され、ディレクトリを作成します。fileモジュールは、state: linkと共に使用され、シンボリックリンクを作成します。blockinfileモジュールは、マーカーコメントで囲まれたテキストブロックを含むファイルを作成するために使用されます。
- Playbook を実行します。
cd ~/project/ansible-files
ansible-playbook file_modules.yml
次のような出力が表示されるはずです。
PLAY [Demonstrate file-related modules] ***************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [Create a directory] *****************************************************
changed: [localhost]
TASK [Create a file using the copy module] ************************************
changed: [localhost]
TASK [Create a symbolic link] *************************************************
changed: [localhost]
TASK [Create a file with blockinfile module] **********************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- 結果を確認しましょう。
ls -la ~/project/ansible_demo/
cat ~/project/ansible_demo/copied.txt
cat ~/project/ansible_demo/link_to_copied.txt
cat ~/project/ansible_demo/block.txt
以下が表示されるはずです。
ansible_demoという名前のディレクトリ- 指定されたコンテンツを持つ
copied.txtという名前のファイル copied.txtを指すlink_to_copied.txtという名前のシンボリックリンク- マーカーコメントで囲まれたテキストブロックを含む
block.txtという名前のファイル
最後のコマンドの出力は次のようになるはずです。
## BEGIN ANSIBLE MANAGED BLOCK
This is a block of text
that will be inserted
as a single unit.
## END ANSIBLE MANAGED BLOCK
これは、Ansible のファイル管理機能の多様性を示しています。
まとめ
この Ansible ファイル管理実験を完了したことをおめでとうございます。いくつかの重要な概念とテクニックを学びました。
- 基本的な自動化タスクのために Ansible をインストールおよび設定する方法
copyモジュールを使用して、特定のコンテンツを持つファイルを作成する- 変数を使用して、ファイルコンテンツを動的にする
- より複雑なファイル生成のために Jinja2 テンプレートを使用する
- ファイルのパーミッションと所有権を設定する
- 変数に基づいて条件付きファイル作成を実装する
- さまざまなファイル管理タスクにさまざまな Ansible モジュールを使用する
これらのスキルは、インフラストラクチャにおけるファイル管理タスクを自動化するための強固な基盤を形成します。Ansible を使用すると、複数のサーバー間で一貫したファイルコンテンツを確保し、制御された方法で変更を適用し、構成の監査可能な記録を維持できます。
Ansible の学習を続けるには、ロール、Playbook の構成、Ansible と他の DevOps ツールとの統合などのより高度なトピックを検討してください。


