ウェブサイト検索

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 }}"

上記の Playbook では、Playbook の実行時に greeting 変数が値 Hello world! に置き換えられます。プレイブックは、実行時にメッセージ Hello world! を出力するだけです。

さらに、次のように変数のリストまたは配列を使用することもできます。

以下のプレイブックは大陸と呼ばれる変数を示しています。この変数には 5 つの異なる値 (大陸名) が保持されます。これらの各値には、最初の変数としてインデックス 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 }}"

もう 1 つのタイプの Ansible 変数は辞書変数です。

プレイブックではディクショナリ変数が追加でサポートされています。ディクショナリ変数を定義するには、ディクショナリ変数名のすぐ下のキーと値のペアを識別するだけです。

hosts: switch_f01

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

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

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 テンプレートおよび Playbook で参照できるが、ユーザーが変更したり定義したりすることはできない、事前定義された変数のリストを提供します。

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 形式のファイルです。

インベントリでは、変数をホスト システムに割り当て、後でそれを Playbook で使用できます。

[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 の事実

Playbook を実行するとき、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

ここで、Ansible コントロール ノードに check_date.yml というプレイブックを作成しました。

---

- 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 の変数とファクトの操作に関するこのチュートリアルは終了です。