ウェブサイト検索

Ansibleの変数とファクトの使い方 - パート8


このAnsibleシリーズでは変数について言及しており、少し思い出させるためにお伝えします。変数は、多くのプログラミング言語と同様に、基本的には値を表すキーです。

有効な変数名の構成要素とは?

変数名は、文字、数字、アンダースコア、またはそのいずれかの2つまたはすべての混合を含むことができます。しかし、変数名は常に文字で始まる必要があり、スペースを含むことはできません。

有効な変数名と許可されていない変数名のいくつかの例を見てみましょう:

有効な変数名の例:

football 
foot_ball
football20 
foot_ball20

無効な変数名の例:

foot ball
20 
foot-ball

変数の種類について話しましょう:

1. プレイブックの変数

プレイブックの変数は非常に簡単で明確です。プレイブックで変数を定義するには、インデントを使って変数を書く前にキーワードvarsを使用するだけです。

変数の値にアクセスするには、二重波括弧の間に引用符で囲まれた状態で置いてください。

こちらがシンプルなプレイブックの例です:

- hosts: all
  vars:
    greeting: Hello world! 

  tasks:
  - name: Ansible Basic Variable Example
    debug:
      msg: "{{ greeting }}"

上記のプレイブックでは、greeting 変数はプレイブックが実行されるときに、値 Hello world! に置き換えられます。プレイブックは実行されると、単にメッセージ Hello world! を表示します。

さらに、次のように変数のリストまたは配列を持つことができます。

下のプレイブックにはcontinentsという変数が示されています。この変数は5つの異なる値、すなわち大陸名を保持しています。これらの値はすべて、最初の変数としてindex 0を使用して簡単にアクセスできます。

以下のプレイブックの例は、アジア(インデックス1)を取得して表示します。

- hosts: all
  vars:
    continents:
      - Africa
      - Asia
      - South America
      - North America
      - Europe
      
  tasks:
  - name: Ansible List variable Example
    debug:
      msg: "{{ continents [1] }}"

変数リストは、同様に次のように構成できます:

vars:
    Continents: [Africa, Asia, South America, North America, Europe]

リストのすべてのアイテムを一覧表示するには、with_itemsモジュールを使用します。これにより、配列内のすべての値をループ処理します。

- hosts: all
  vars:
    continents: [Africa, Asia, South America, North America, Europe]

  tasks:
  - name: Ansible array variables example
    debug: 
      msg: "{{ item }}"
    with_items:
      - "{{ continents }}"

別の種類のAnsible変数は辞書変数です。

辞書 変数は、プレイブックで追加的にサポートされています。辞書変数を定義するには、辞書変数名のすぐ下にキーと値のペアをインデントして記述してください。

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 10.200.50.1
   vlans:
       id: 10
       port: 2

上の例では、vlansは辞書変数であり、idとportはキーと値のペアです。

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 
   vlans:
      id: 10
      port: 20

 tasks:
   name: Configure default gateway
   system_configs:
   default_gateway_ip: “{{ default_gateway  }}“


   name: Label port on vlan 10
   vlan_config:
	vlan_id: “{{ vlans[‘id’]  }}“
     port_id: 1/1/ {{ vlans[‘port’]  }}

port_idについて、値を変数ではなくテキストから始めるため、中括弧を囲む必要はありません。

2. 特殊変数

Ansibleは、ユーザーによって変更または定義することができない、Jinja2テンプレートやプレイブックで参照できる事前定義された変数のリストを提供します。

集合的に、Ansibleの定義済み変数のリストはAnsibleファクツと呼ばれ、これはプレイブックが実行される際に収集されます。

すべてのAnsible変数のリストを取得するには、以下のようにAnsibleのアドホックコマンドでsetupモジュールを使用してください。

# ansible -m setup hostname

これは、次のようにJSON形式で出力を表示します。

# ansible -m setup localhost

出力から、Ansibleの特別な変数のいくつかの例は次のとおりであることがわかります。

ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux

他にも多くのAnsibleの特別な変数がありますが、これはほんの一例です。

これらの変数は、Jinja2 テンプレートで次のように使用できます:

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

3. 在庫変数

最後に、リストにはAnsibleのインベントリ変数があります。インベントリは、Ansibleによって管理されるすべてのホストを含むINI形式のファイルです。

インベントリでは、ホストシステムに変数を割り当て、後でプレイブック内でそれを使用することができます。

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080

上記は、以下のようにプレイブックYAMLファイルに表現できます:

---
   web_servers:
     web_server_1:
        ansible_user=centos
	   http_port=80

web_server_2:
        ansible_user=ubuntu
	   http_port=8080

ホストシステムが同じ変数を共有している場合、在庫ファイルに別のグループを定義することで、手間を減らし、不必要な繰り返しを避けることができます。

例えば:

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80

上記は次のように構造化できます:

[web_servers]
web_server_1
web_server_2


[web_servers:vars]
ansible_user=centos
http_port=80

そして、プレイブックのYAMLファイルでは、次のように定義されます:

---
   web_servers:
    
     hosts: 
       web_server_1:
	  web_server_2:

     vars: 
        ansible_user=centos
   http_port=80

Ansibleファクト

プレイブックを実行する際、Ansibleが最初に行うタスクはセットアップタスクの実行です。おそらくあなたは次の出力に出くわしたことがあるでしょう:

TASK:  [Gathering facts] *********

Ansibleのファクトは、接続しているリモートノードに関するシステムのプロパティや情報のことです。この情報には、システムアーキテクチャ、OSのバージョン、BIOS情報、システムの日時、システムの稼働時間、IPアドレス、ハードウェア情報などが含まれます。

任意のシステムに関する事実を取得するには、下記のコマンドに示されたようにセットアップモジュールを使用してください。

# ansible -m setup hostname

例えば:

# ansible -m setup database_server

これは、次のようにJSON形式で大量のデータを出力します:

Ansibleのファクトは、システム管理者がどの操作を実行するべきかを把握するのに便利です。たとえば、オペレーティングシステムに応じて、どのソフトウェアパッケージをインストールする必要があるか、またそれらをどのように構成する必要があるかを知ることができます。

カスタムファクト

あなたは、Ansibleによって収集される独自のカスタムファクトを作成できることをご存知でしたか?はい、できます。それでは、どうやってそれを行うのでしょうか?モードを切り替えて、方法を見てみましょう。

最初のステップは、管理ノードまたはリモートノードに/etc/ansible/facts.dディレクトリを作成することです。

このディレクトリ内に、.fact 拡張子のファイルを作成します。このファイルは、プレイブックがAnsibleコントロールノードで実行されるときにJSONデータを返します。このデータには、プレイブック実行後にAnsibleが取得する他のファクトも含まれます。

date_time.factというカスタムファイルの例です。これは日付と時間を取得します。

# mkdir -p /etc/ansible/facts.d
vim /etc/ansible/facts.d/date_time.fact

次の行を追加してください。

#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"

ファイルを保存して終了します。

実行権限を割り当ててください:

# chmod +x /etc/ansible/facts.d/date_time.fact

さて、check_date.ymlというプレイブックをAnsible制御ノード上に作成しました。

---

- hosts: webservers

  tasks:
   - name: Get custom facts
     debug:
      msg: The custom fact is {{ansible_local.date_time}}

ansible_local 変数にファイルを追加します。ansible_local はすべてのカスタムファクトを保存します。

さて、プレイブックを実行し、Ansibleがファクトファイルに保存された情報を取得している様子を観察してください。

# ansible_playbook check_date.yml

結論

これで、Ansibleの変数とファクトに関するこのチュートリアルは終了です。

関連記事: