はじめに
Ansible は、IT インフラストラクチャの管理を簡素化する強力なオープンソースの自動化ツールです。このチュートリアルでは、特定の URL からファイルをダウンロードできる Ansible の get_url モジュールについて解説します。このモジュールは、ソフトウェアのインストール、構成管理、コンテンツのデプロイなど、自動化タスクに不可欠です。
このチュートリアルを通して、Ansible のセットアップ方法、get_url モジュールの基本および高度なオプションの使用方法、そしてファイルダウンロードを自動化するための実践的な例を学びます。このガイドの終わりには、このモジュールを活用してファイル管理プロセスを効率化する方法をしっかりと理解できるようになります。
Ansible のインストールとセットアップ
get_url モジュールを使用する前に、Ansible がシステムに正しくインストールされ、設定されていることを確認する必要があります。
Ansible のインストール
まず、LabEx 環境に Ansible をインストールすることから始めましょう。
sudo apt update
sudo apt install -y ansible
これらのコマンドを実行した後、Ansible のバージョンを確認して、正しくインストールされていることを確認します。
ansible --version
Ansible のバージョンと設定の詳細を示す、次のような出力が表示されるはずです。
ansible [core 2.12.x]
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
executable location = /usr/bin/ansible
python version = 3.10.x (default, ...) [GCC 11.x]
作業ディレクトリの作成
次に、Ansible プロジェクト専用のディレクトリを作成しましょう。
mkdir -p ~/project/ansible-get-url
cd ~/project/ansible-get-url
簡単なインベントリの設定
Ansible は、どのホストを管理するかを知る必要があります。このチュートリアルでは、ローカルマシンをターゲットとする簡単なインベントリファイルを作成します。
echo "localhost ansible_connection=local" > inventory.ini
このインベントリファイルは、ローカル接続を使用して Ansible を localhost に対して実行することを指定しています。
Ansible 設定ファイルの作成
Ansible の動作をカスタマイズするために、簡単な設定ファイルを作成しましょう。
cat > ansible.cfg << EOF
[defaults]
inventory = inventory.ini
host_key_checking = False
EOF
この設定ファイルは、Ansible にインベントリファイルを使用するように指示し、テスト環境での接続を簡素化するためにホストキーチェックを無効にします。
Ansible セットアップのテスト
簡単な ping コマンドを実行して、Ansible の設定が正しく機能していることを確認しましょう。
ansible localhost -m ping
次のような成功した応答が表示されるはずです。
localhost | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
この出力は、Ansible が正しくインストールされ、localhost と通信できることを確認しています。これで、次のステップで get_url モジュールを使用する準備ができました。
get_url モジュールを使用した基本的な Playbook の作成
Ansible がセットアップされたので、get_url モジュールを使用して URL からファイルをダウンロードするシンプルな Playbook を作成しましょう。
Ansible Playbook の理解
Ansible Playbook は、管理対象ホストで実行される一連のタスクを定義する YAML ファイルです。Playbook は一連のプレイとして構成され、各プレイは以下で構成されます。
- ターゲットとするホストのセット
- 実行するタスクのセット
最初の Playbook の作成
get_url モジュールを使用する基本的な Playbook を作成しましょう。プロジェクトディレクトリに download-file.yml という名前のファイルを作成します。
cd ~/project/ansible-get-url
ファイルエディタを開き、次の内容でファイルを作成します。
---
- name: Download a file from URL
hosts: localhost
become: no
tasks:
- name: Create downloads directory
file:
path: ~/project/ansible-get-url/downloads
state: directory
mode: "0755"
- name: Download a sample text file
get_url:
url: https://raw.githubusercontent.com/ansible/ansible/devel/README.md
dest: ~/project/ansible-get-url/downloads/ansible-readme.md
mode: "0644"
この Playbook は、次のことを行います。
- ダウンロードしたファイルを保存するための
downloadsディレクトリを作成します。 get_urlモジュールを使用して、GitHub から Ansible README.md ファイルをダウンロードします。
get_url モジュールパラメータの理解
get_url タスクの主要なパラメータを分解してみましょう。
url: ファイルのダウンロード元となる URL を指定します。dest: ファイルが保存される宛先パスを定義します。mode: ファイルのパーミッションを設定します (0644 は所有者に対して読み取りと書き込み、グループとその他に対して読み取りを意味します)。
Playbook の実行
Playbook を作成したので、ansible-playbook コマンドを使用して実行しましょう。
ansible-playbook download-file.yml
次のような出力が表示されるはずです。
PLAY [Download a file from URL] ***********************************************
TASK [Gathering Facts] ********************************************************
ok: [localhost]
TASK [Create downloads directory] *********************************************
changed: [localhost]
TASK [Download a sample text file] ********************************************
changed: [localhost]
PLAY RECAP ********************************************************************
localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ダウンロードしたファイルの検証
ファイルが正しくダウンロードされたことを確認しましょう。
ls -l ~/project/ansible-get-url/downloads/
ダウンロードしたファイルが表示されるはずです。
-rw-r--r-- 1 labex labex 3154 Mar 15 12:34 ansible-readme.md
ダウンロードしたファイルの内容を表示することもできます。
head -n 10 ~/project/ansible-get-url/downloads/ansible-readme.md
これにより、Ansible README.md ファイルの最初の 10 行が表示され、正常にダウンロードされたことが確認されます。
おめでとうございます!get_url モジュールを使用して URL からファイルをダウンロードする最初の Ansible Playbook を正常に作成し、実行しました。
高度な get_url オプションの使用
基本をカバーしたので、実際のシナリオで役立つ get_url モジュールの高度なオプションをいくつか見ていきましょう。
高度な Playbook の作成
さまざまな高度なオプションを示す、advanced-download.yml という名前の新しい Playbook を作成しましょう。
cd ~/project/ansible-get-url
ファイルエディタを開き、次の内容でファイルを作成します。
---
- name: Advanced get_url Module Options
hosts: localhost
become: no
tasks:
- name: Create advanced downloads directory
file:
path: ~/project/ansible-get-url/advanced-downloads
state: directory
mode: "0755"
- name: Download with checksum validation
get_url:
url: https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
dest: ~/project/ansible-get-url/advanced-downloads/jq
mode: "0755"
checksum: sha256:af986793a515d500ab2d35f8d2aecd656e764504b789b66d7e1a0b727a124c44
- name: Download with timeout and retries
get_url:
url: https://raw.githubusercontent.com/ansible/ansible-examples/master/README.md
dest: ~/project/ansible-get-url/advanced-downloads/examples-readme.md
timeout: 30
retries: 3
delay: 5
force: yes
- name: Download only if file doesn't exist
get_url:
url: https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg
dest: ~/project/ansible-get-url/advanced-downloads/ansible-example.cfg
force: no
高度なパラメータの理解
この Playbook で使用されている高度なパラメータを見てみましょう。
チェックサム検証 (Checksum Validation):
checksum: ダウンロードしたファイルの期待されるチェックサムを指定します (形式:アルゴリズム:チェックサム)- これにより、ダウンロードしたファイルの整合性が確保され、正しいチェックサムでファイルが既に存在する場合はダウンロードが防止されます。
タイムアウトと再試行 (Timeout and Retries):
timeout: HTTP リクエストが完了するまでの最大時間 (秒単位)retries: ダウンロードが失敗した場合の再試行回数delay: 再試行間の遅延 (秒単位)force: ファイルが既に存在する場合でもファイルをダウンロードするかどうか
条件付きダウンロード (Conditional Download):
force: no: 宛先にファイルが存在しない場合にのみファイルがダウンロードされます。
高度な Playbook の実行
高度な Playbook を実行しましょう。
ansible-playbook advanced-download.yml
次のような出力が表示されるはずです。
PLAY [Advanced get_url Module Options] ****************************************
TASK [Gathering Facts] ********************************************************
ok: [localhost]
TASK [Create advanced downloads directory] ************************************
changed: [localhost]
TASK [Download with checksum validation] **************************************
changed: [localhost]
TASK [Download with timeout and retries] **************************************
changed: [localhost]
TASK [Download only if file doesn't exist] ************************************
changed: [localhost]
PLAY RECAP ********************************************************************
localhost : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
高度なダウンロードの検証
高度なオプションでダウンロードしたファイルを確認しましょう。
ls -l ~/project/ansible-get-url/advanced-downloads/
ダウンロードしたすべてのファイルが表示されるはずです。
-rwxr-xr-x 1 labex labex 3773448 Mar 15 12:45 jq
-rw-r--r-- 1 labex labex 426 Mar 15 12:45 examples-readme.md
-rw-r--r-- 1 labex labex 1690 Mar 15 12:45 ansible-example.cfg
ダウンロードした jq バイナリが動作するかテストしてみましょう。
~/project/ansible-get-url/advanced-downloads/jq --version
jq のバージョン (例:jq-1.6) を示す出力が表示され、実行可能ファイルが正しいチェックサムで正しくダウンロードされたことが確認されます。
これで、さまざまな要件と制約を持つファイルをダウンロードするために、get_url モジュールのさまざまな高度なオプションを正常に使用しました。
実用的な Web アプリケーションのデプロイの実装
これまでに学んだことを、より実用的なシナリオに適用してみましょう。Ansible の get_url モジュールを使用して、シンプルな Web アプリケーションをデプロイします。
Web アプリケーションプロジェクトのセットアップ
まず、Web アプリケーションのディレクトリ構造を作成しましょう。
mkdir -p ~/project/ansible-get-url/webapp/public
cd ~/project/ansible-get-url
Web アプリケーションデプロイ Playbook の作成
次に、Web アプリケーションに必要なファイルをダウンロードする deploy-webapp.yml という名前の Playbook を作成します。
---
- name: Deploy Web Application Files
hosts: localhost
become: no
vars:
webapp_dir: ~/project/ansible-get-url/webapp
assets_base_url: https://raw.githubusercontent.com/ansible/ansible-documentation/devel/docs/docsite/rst/_static
tasks:
- name: Ensure webapp directories exist
file:
path: "{{ item }}"
state: directory
mode: "0755"
loop:
- "{{ webapp_dir }}"
- "{{ webapp_dir }}/public"
- "{{ webapp_dir }}/public/css"
- "{{ webapp_dir }}/public/images"
- name: Create index.html
copy:
dest: "{{ webapp_dir }}/public/index.html"
content: |
<!DOCTYPE html>
<html>
<head>
<title>Ansible Demo App</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="container">
<h1>Welcome to Ansible Demo</h1>
<p>This site was deployed using Ansible's get_url module!</p>
<img src="images/ansible-logo.png" alt="Ansible Logo">
</div>
</body>
</html>
- name: Download CSS file
get_url:
url: "{{ assets_base_url }}/css/ansible.css"
dest: "{{ webapp_dir }}/public/css/style.css"
mode: "0644"
timeout: 30
retries: 3
- name: Download Ansible logo
get_url:
url: "{{ assets_base_url }}/images/ansible_logo.svg"
dest: "{{ webapp_dir }}/public/images/ansible-logo.png"
mode: "0644"
timeout: 30
retries: 3
- name: Install Python HTTP server
apt:
name: python3-http.server
state: present
become: yes
- name: Display information about running the web server
debug:
msg: |
Web application has been deployed!
To start the web server, run:
cd {{ webapp_dir }}/public && python3 -m http.server 8080
Then access it at: http://localhost:8080
この Playbook は、次のことを行います。
- Web アプリケーションに必要なディレクトリ構造を作成します。
- 基本的な HTML コンテンツを含む index.html ファイルを作成します。
get_urlモジュールを使用して、CSS ファイルと Ansible ロゴ画像をダウンロードします。- Python HTTP サーバーをインストールします。
- Web サーバーの実行方法に関する情報を表示します。
Web アプリケーションデプロイ Playbook の実行
Playbook を実行しましょう。
ansible-playbook deploy-webapp.yml
Web アプリケーションが正常にデプロイされたことを示す出力が表示されるはずです。
Web サーバーの起動
次に、デプロイしたアプリケーションをテストするために、Web サーバーを起動しましょう。
cd ~/project/ansible-get-url/webapp/public
python3 -m http.server 8080 &
Web サーバーは、ポート 8080 でバックグラウンドで実行されるようになりました。ブラウザアクセスが可能な通常の環境であれば、http://localhost:8080 で Web アプリケーションにアクセスできます。
デプロイされたファイルの確認
必要なすべてのファイルが正しくデプロイされたことを確認しましょう。
ls -la ~/project/ansible-get-url/webapp/public/
index.html ファイルと作成したディレクトリが表示されるはずです。
ls -la ~/project/ansible-get-url/webapp/public/css/
ダウンロードした CSS ファイルが表示されるはずです。
ls -la ~/project/ansible-get-url/webapp/public/images/
ダウンロードした Ansible ロゴ画像が表示されるはずです。
HTML コンテンツの表示
index.html ファイルの内容を確認しましょう。
cat ~/project/ansible-get-url/webapp/public/index.html
Playbook で作成した HTML コンテンツが表示されるはずです。
Web サーバーの停止
テストが完了したら、Web サーバーのプロセス ID を見つけて kill することで、Web サーバーを停止できます。
pkill -f "python3 -m http.server 8080"
おめでとうございます!Ansible の get_url モジュールを使用して、必要なファイルをダウンロードすることにより、シンプルな Web アプリケーションを正常にデプロイしました。
まとめ
このチュートリアルでは、Ansible の get_url モジュールを使用して、特定の URL からファイルをダウンロードする実践的な経験を積みました。以下のことを学びました。
- ローカル開発用に Ansible をインストールおよび設定する方法
get_urlモジュールを使用してファイルをダウンロードする基本的な Playbook を作成する方法- チェックサム検証、タイムアウト、再試行、条件付きダウンロードなどの高度なオプションを利用する方法
get_urlモジュールを使用した、実用的な Web アプリケーションデプロイのシナリオを実装する方法
これらのスキルは、ソフトウェアデプロイ、コンテンツ管理、システム構成など、さまざまな IT 運用におけるファイル管理タスクを自動化するための基本です。get_url モジュールは、より複雑な Ansible ワークフローに統合して、インフラストラクチャ管理プロセスを合理化できる多用途なツールです。
Ansible の学習を続ける中で、より包括的なファイル管理の自動化のために、get_url モジュールを補完する uri、unarchive、synchronize などの関連モジュールを検討してください。


