その他の言語はこちらをお読みください。
English,
日本語,
Portugues do Brasil,
Française,
Español.
Ansibleは、Playbook で使用できる値を格納するための変数をサポートしています。変数はさまざまな場所で定義でき、明確な優先順位があります。Ansible は、タスクの実行時に変数をその値に置き換えます。
この演習では、特に以下についての変数について説明します。
host_vars
と group_vars
について、また使用するときansible_facts
の使い方debug
モジュールを使用して、コンソールウィンドウに変数を出力する方法変数は、変数名を二重中括弧で囲むことにより、AnsiblePlaybooks で参照されます。
こちらが変数です。{{ variable1 }}
変数とその値は、インベントリー、追加ファイル、コマンドラインなどのさまざまな場所で定義できます。
インベントリーで変数を使う場合は、host_vars
と group_vars
という名前の 2
つのディレクトリーにあるファイルで変数を定義することが推奨されます。
group_vars/servers.yml
という YAML
ファイルが作成されます。node1
専用の変数を定義するために、変数定義のある host_vars/node1.yml
ファイルが作成されます。ヒント
ホスト変数はグループ変数よりも優先されます (優先順位の詳細については、docs を参照してください)。
理解を深め練習するためにも、ラボをみていきましょう。「Webサーバーを構築しましょう。1 つまたは 2
つ。またはそれ以上…」というテーマに続いて、index.html
を変更し、サーバーがデプロイされている開発環境 (dev / prod)
を表示します。
Ansible コントロールホストでは、student<X>
ユーザーとして、~/ansible-files/
に変数定義を保持するディレクトリーを作成します。
[student<X>@ansible-1 ansible-files]$ mkdir host_vars group_vars
次に、変数定義を含む 2 つのファイルを作成します。異なる環境 dev
または prod
を参照する stage
を定義します。
~/ansible-files/group_vars/web.yml
ファイルを作成します。---
stage: dev
~/ansible-files/host_vars/node2.yml
ファイルを作成します。---
stage: prod
これはなんでしょうか。
web
グループのサーバーすべてには、値 dev
を持つ stage
が定義されています。そのため、デフォルトでは、開発環境のメンバーとしてフラグを立てます。node2
については、これはオーバーライドされ、ホストは実稼働サーバーとしてフラグが立てられます。次に、~/ansible-files/files/
で 2 つのファイルを作成します。
1 つは、以下の内容の prod_web.html
と呼ばれます。
<body>
<h1>これは稼働 Web サーバーです。それでは!</h1>
</body>
もう 1 つは、以下のない用の dev_web.html
と呼ばれるファイルです。
<body>
<h1>これは開発用ウェブサーバーです。お楽しみください!</h1>
</body>
次に、「stage」変数にしたがって、prod または dev web.html
ファイルをコピーする Playbook が必要です。
~/ansible-files/
ディレクトリーに deploy_index_html.yml
という新しい Playbook を作成します。
ヒント
変数「stage」がどのように、コピーするファイルの名前で使用さているかに注意してください。
---
- name: Copy web.html
hosts: web
become: true
tasks:
- name: copy web.html
copy:
src: "{{ stage }}_web.html"
dest: /var/www/html/index.html
[student<X>@ansible-1 ansible-files]$ ansible-playbook deploy_index_html.yml
Ansible Playbook は、さまざまなファイルを index.html としてホストにコピーし、curl
を使用してテストします。
node1:
[student<X>@ansible-1 ansible-files]$ curl http://node1
<body>
<h1>This is a development webserver, have fun!</h1>
</body>
node2:
[student<X>@ansible-1 ansible-files]$ curl http://node2
<body>
<h1>This is a production webserver, take care!</h1>
</body>
node3:
[student<X>@ansible-1 ansible-files]$ curl http://node3
<body>
<h1>This is a development webserver, have fun!</h1>
</body>
ヒント
おそらくこのような考えがありませんでしょうか。ファイルの内容を変更する、もっと賢い方法があるはず…。その通りです。このラボは、変数の説明を行うためのものでした。次の章では、テンプレートについて学びます。
Ansible ファクトは、管理対象ホストから Ansible によって自動的に検出される変数です。それぞれの ansible-playbook
実行の出力にリストされている「ファクトの収集」タスクを覚えていますか?その時点で、管理対象ノードごとにファクトが収集されます。ファクトは、setup
モジュールでプルできます。これらには、管理者が再利用できる変数に格納された有用な情報が含まれています。
Ansible がデフォルトで収集するファクトを把握するには、コントロールノードで、student ユーザーとして次を実行します。
[student<X>@ansible-1 ansible-files]$ ansible node1 -m setup
多すぎる場合は、特定のファクトに出力を制限するフィルターを使用できます。使用する表現は、シェルスタイルのワイルドカードです。
[student<X>@ansible-1 ansible-files]$ ansible node1 -m setup -a 'filter=ansible_eth0'
あるいは、メモリ関連のファクトだけを探すのはどうでしょうか。
[student<X>@ansible-1 ansible-files]$ ansible node1 -m setup -a 'filter=ansible_*_mb'
ヒント
grep を使用してファクトを検索し、フィルターを適用して、このファクトのみを出力します。
警告
回答を以下に示します。
[student<X>@ansible-1 ansible-files]$ ansible node1 -m setup|grep distribution
[student<X>@ansible-1 ansible-files]$ ansible node1 -m setup -a 'filter=ansible_distribution' -o
もちろん、ファクトは、正しい名前を使用して、変数のように Playbook
で使用できます。このプレイブックを次のように、~/ansible-files/
ディレクトリーに facts.yml
として作成します。
---
- name: Output facts within a playbook
hosts: all
tasks:
- name: Prints Ansible facts
debug:
msg: The default IPv4 address of {{ ansible_fqdn }} is {{ ansible_default_ipv4.address }}
ヒント
「debug」モジュールは、変数と式のデバッグを行うのに便利です。
それを実行して、ファクトがどのように出力されるかを確認します。
[student<X>@ansible-1 ansible-files]$ ansible-playbook facts.yml
PLAY [Output facts within a playbook] ******************************************
TASK [Gathering Facts] *********************************************************
ok: [node3]
ok: [node2]
ok: [node1]
ok: [ansible-1]
TASK [Prints Ansible facts] ****************************************************
ok: [node1] =>
msg: The default IPv4 address of node1 is 172.16.190.143
ok: [node2] =>
msg: The default IPv4 address of node2 is 172.16.30.170
ok: [node3] =>
msg: The default IPv4 address of node3 is 172.16.140.196
ok: [ansible-1] =>
msg: The default IPv4 address of ansible is 172.16.2.10
PLAY RECAP *********************************************************************
ansible-1 : ok=2 changed=0 unreachable=0 failed=0
node1 : ok=2 changed=0 unreachable=0 failed=0
node2 : ok=2 changed=0 unreachable=0 failed=0
node3 : ok=2 changed=0 unreachable=0 failed=0
ナビゲーション
こちらをクリックして Ansible for Red Hat Enterprise Linux Workshop に戻ります