他の言語でもお読みいただけます:
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 つのディレクトリーにあるファイルで変数を定義することが推奨されます。
- グループ「servers」の変数を定義するために、変数定義のある
group_vars/servers.yml
という YAML ファイルが作成されます。 - ホスト
node1
専用の変数を定義するために、変数定義のあるhost_vars/node1.yml
ファイルが作成されます。
ヒント
ホスト変数はグループ変数よりも優先されます (優先順位の詳細については、docs を参照してください)。
理解を深め練習するためにも、ラボをみていきましょう。「Webサーバーを構築しましょう。1 つまたは 2 つ。またはそれ以上…」というテーマに続いて、index.html
を変更し、サーバーがデプロイされている開発環境 (dev / prod)を表示します。
Ansible コントロールホストでは、student
ユーザーとして、~/ansible-files/
に変数定義を保持するディレクトリーを作成します。
[student@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
- Playbook を実行します。
[student@ansible-1 ansible-files]$ ansible-navigator run deploy_index_html.yml
Ansible Playbook は、さまざまなファイルを index.html としてホストにコピーし、curl
を使用してテストします。
node1:
[student@ansible-1 ansible-files]$ curl http://node1
<body>
<h1>This is a development webserver, have fun!</h1>
</body>
node2:
[student@ansible-1 ansible-files]$ curl http://node2
<body>
<h1>This is a production webserver, take care!</h1>
</body>
node3:
[student@ansible-1 ansible-files]$ curl http://node3
<body>
<h1>This is a development webserver, have fun!</h1>
</body>
ヒント
おそらくこのような考えがありませんでしょうか。ファイルの内容を変更する、もっと賢い方法があるはず...。その通りです。このラボは、変数の説明を行うためのものでした。次の章では、テンプレートについて学びます。
Ansible ファクトは、管理対象ホストから Ansible によって自動的に検出される変数です。それぞれの ansible-navigator
実行の出力にリストされている「ファクトの収集」タスクを覚えていますか?その時点で、管理対象ノードごとにファクトが収集されます。ファクトは、setup
モジュールでプルできます。これらには、管理者が再利用できる変数に格納された有用な情報が含まれています。
Ansible がデフォルトで収集する情報を把握するために、学習者ユーザーとしてコントロールノード上で以下の Playbook を実行し、node1
のセットアップの詳細を確認します。
---
- name: Capture Setup
hosts: node1
tasks:
- name: Collect only facts returned by facter
ansible.builtin.setup:
gather_subset:
- 'all'
register: setup
- debug:
var: setup
[student@ansible-1 ansible-files]$ cd ~
[student@ansible-1 ~]$ ansible-navigator run setup.yml -m stdout
これはビットが大きすぎる可能性があり、フィルターを使用して出力を特定のファクトに制限することができます。式は Playbook 内でシェルスタイルのワイルドカードです。この例では、setup_filter.yml
というラベルが付けられた Playbook を作成します。この例では、eth0
ファクトを取得し、node1
のメモリー詳細を取得するようにフィルターします。
---
- name: Capture Setup
hosts: node1
tasks:
- name: Collect only specific facts
ansible.builtin.setup:
filter:
- 'ansible_eth0'
- 'ansible_*_mb'
register: setup
- debug:
var: setup
[student@ansible-1 ansible-files]$ ansible-navigator run setup_filter.yml -m stdout
- 管理対象ホストのディストリビューション (Red Hat) の検索と出力を試行します。これは Playbook で行います。
ヒント
フィルター内でワイルドカードを使用してファクトを検索し、フィルターを適用して、このファクトのみを出力します。
警告
回答を以下に示します。
---
- name: Capture Setup
hosts: node1
tasks:
- name: Collect only specific facts
ansible.builtin.setup:
filter:
- '*distribution'
register: setup
- debug:
var: setup
ワイルドカードが導入されると、出力は以下のようになります。
TASK [debug] *******************************************************************
ok: [ansible] => {
"setup": {
"ansible_facts": {
"ansible_distribution": "RedHat"
},
"changed": false,
"failed": false
}
}
これにより、検索する変数に ansible_distribution
というラベルが付けられます。
次に、Playbook を更新して、検索で明示的な指定を行い、以下の行を変更できます。
filter:
- '*distribution'
以下のように変更します。
filter:
- 'ansible_distribution'
[student@ansible-1 ansible-files]$ ansible-navigator run setup_filter.yml -m stdout
もちろん、ファクトは、正しい名前を使用して、変数のように 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@ansible-1 ansible-files]$ ansible-navigator run facts.yml
テキストユーザーインターフェース(TUI)ウィンドウ内で、以下の出力をキャプチャーするために :st
と入力します。
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
ナビゲーション
{% if page.url contains 'ansible_rhel_90' %}
Previous Exercise - Next Exercise
{% else %}
Previous Exercise - Next Exercise
{% endif %}
Click here to return to the Ansible for Red Hat Enterprise Linux Workshop