動的インベントリ・スクリプトの使用

正確なインベントリ・リストを使用することがAnsibleプレイブックの実行に不可欠です。Oracle Cloud Infrastructureでは、ダウンロードして実行できるスクリプトが提供されており、これを使用するとインスタンスのインベントリ・リストを常に最新の状態に保つことができます。このスクリプトにより、プレイブックが、Oracle Cloud Infrastructure Computeインスタンスの最新セットを常に使用できるようになります。

重要

OCIインベントリ・リストを使用してインベントリ・リストの取得と維持を行うことをお薦めします。

動的インベントリ・スクリプトのダウンロードと構成

次の場所、動的インベントリ・スクリプト(oci_inventory.py)およびデフォルト構成ファイル(oci_inventory.ini)をダウンロードします:

重要:

スクリプトを使用する前に、有効なOracle Cloud Infrastructure構成があることを確認します。詳細は、SDKおよびCLIの構成ファイルを参照してください。

スクリプトと構成の詳細

oci_inventory.pyスクリプトは、Oracle Cloud Infrastructure SDK for Pythonを使用してOracle Cloud Infrastructureテナンシのコンピュート・インスタンスを問い合せてから、Ansibleプレイブックで使用するための動的インベントリを作成します。Pythonスクリプトで引数を使用して、問合せの対象の構成プロファイルおよびテナンシ・コンパートメントを制御します。

oci_inventory.iniファイルの設定を使用して、インベントリ詳細をキャッシュする方法を制御し、どのOracle Cloud Infrastructureプロファイルを使用するかを制御できます。このファイルによって、ホスト名を変更し、生成されたインベントリ・リストでのホストの指定方法を制御できます。

引数および環境変数

スクリプトが受け入れられるコマンドライン引数と環境変数の完全なリストは、動的インベントリ・スクリプトを参照してください。

優先順位

動的インベントリ・スクリプトで使用される構成の優先順位は次のとおりです:

  1. コマンドライン引数。
  2. 環境変数。
  3. Oracle Cloud Infrastructure構成ファイルの選択したprofileの構成設定。
ノート

インベントリ・スクリプトで使用されるデフォルトの構成ファイルは./oci_inventory.iniです。Oracle Cloud Infrastructure SDK構成ファイルのデフォルトは~/.oci/configです。プロファイル名が指定されていない場合、スクリプトはconfigファイルからDEFAULTプロファイルを読み取ります。
重要

デフォルトでは、インベントリはテナンシのすべてのコンパートメントについて生成されます。このスクリプトがすべてのコンパートメントにアクセスできるようにするには、ルート・コンパートメントに対するCOMPARTMENT_INSPECT権限が必要です。ただし、compartment_ocidが指定されると、インベントリは特定のコンパートメントのみについて生成されるため、指定されたコンパートメントのみのCOMPARTMENT_INSPECT権限が必要になります。

動的インベントリ・スクリプトで生成されるインベントリ・リストは、次の属性を使用してグループ化されます:

  • コンピュート・インスタンスが存在するリージョン
  • コンピュート・インスタンスが属するコンパートメントの名前
  • コンピュート・インスタンスが存在する可用性ドメイン
  • コンピュート・インスタンスが存在するVCNのvcn_id
  • コンピュート・インスタンスが存在するサブネットのsubnet_id
  • コンピュート・インスタンスが存在するサブネットのsecurity_list_ids
  • コンピュート・インスタンスの起動に使用されるイメージのimage_id
  • コンピュート・インスタンスのシェイプ
  • インスタンスのフリーフォーム・タグ(グループ名がtag_<tag_name>=<tag_value>に設定されている)
  • インスタンスの定義済タグ(グループ名が<tag_namespace>#<tag_name>=<tag_value>に設定されている)
  • Oracle Cloud Infrastructure Computeインスタンスのメタデータ(キー/値ペア)(グループ名が<metadata-key>=<metadata-value>に設定されている)
  • Oracle Cloud Infrastructure Computeインスタンスの拡張メタデータ(キー/値ペア)(グループ名が<metadata-key>=<metadata-value>に設定されている)
重要

デフォルトでは、インベントリが生成されるとき、グループ名とホスト名の英字以外の文字はすべて、アンダースコア(_)で置き換えられます。例外は、シャープ(#)、等号(=)、ピリオド(.)、ダッシュ(-)です。これにより、これらの名前をAnsibleグループ名として使用できます。このデフォルトの置換を無効化するには、動的インベントリ設定ファイル(デフォルトの場所は./oci_inventory.ini)で、sanitize_namesFalseに設定します。sanitize_namesTrueのときにダッシュ(-)も置換するには、設定ファイルでreplace_dash_in_namesTrueに設定します。

動的インベントリの使用方法

プレイブック実行時の動的インベントリの使用

動的インベントリを使用するには、まず正しいOracle Cloud Infrastructure SDK構成ファイルがあることを確認します。オプションで、oci_inventory.iniファイルも使用できます。

次のコマンドを使用して、ansible-playbookを起動します:

$ ansible-playbook -i <path-to-inventory-file>/oci_inventory.py <your-playbook-using-the-generated-inventory>

または、次のコマンドを使用して、ANSIBLE_HOSTS環境変数を使用します:

$ ANSIBLE_HOSTS=<path-to-inventory-file>/oci_inventory.py ansible-playbook <your-playbook-using-the-generated-inventory>

キャッシュの無効化と最新インベントリ・リストのフェッチ

動的インベントリ・スクリプトをスタンドアロン方式で実行している場合は、キャッシュされたインベントリ・リストを無視し、--refresh (-r)引数を使用して最新のインベントリ・リストをフェッチできます。次に例を示します:

$ \<path-to-inventory-file\>/oci_inventory.py --refresh

かわりに、Ansibleプレイブックの起動時にインベントリ・スクリプトを使用する場合は、OCI_CACHE_MAX_AGE環境変数を0 (ゼロ)に設定して、キャッシュされたリストを無視し、最新のコンピュート・インスタンスをフェッチします。次に例を示します:

$ OCI_CACHE_MAX_AGE=0 ansible-playbook -i <path-to-inventory-file>/oci_inventory.py <your-playbook-using-the-generated-inventory>

インベントリ・リストのデバッグ

インベントリ・リストを調べるには、次のように、--list引数を使用して動的インベントリ・スクリプトを実行します:

$ \<path-to-inventory-file\>/oci_inventory.py --list

追加のデバッグ情報をSTDERRに出力する場合は、次のように--debug引数を使用します:

$ \<path-to-inventory-file\>/oci_inventory.py --debug

ホストに関する情報の取得

指定されたホストの情報を提供するように、インベントリ・スクリプトを構成できます。これには、次に示すように、--host引数を使用してホストのIPアドレスを指定します:

$ \<path-to-inventory-file\>/oci_inventory.py --host <host IP address>

このコマンドでは、次の一連の変数と値が返されます:

{
  "availability_domain": "IwGV:US-ASHBURN-AD-1",
  "compartment_id": "ocid1.compartment.oc1..<xxxxxEXAMPLExxxxx>",
  "defined_tags": {},
  "display_name": "ansible-test-instance",
  "extended_metadata": {},
  "freeform_tags": {},
  "id": "ocid1.instance.oc1.iad.<xxxxxEXAMPLExxxxx>",
  "image_id": "ocid1.image.oc1.iad.<xxxxxEXAMPLExxxxx>",
  "ipxe_script": null,
  "launch_mode": "CUSTOM",
  "launch_options": {
     "boot_volume_type": "ISCSI",
     "firmware": "UEFI_64",
     "network_type": "VFIO",
     "remote_data_volume_type": "ISCSI"
  },
  "lifecycle_state": "AVAILABLE",
  "metadata": {
     "baz": "quux",
     "foo": "bar"
  },
  "region": "iad",
  "shape": "VM.Standard1.1",
  "source_details": {
    "image_id": "ocid1.image.oc1.iad.<xxxxxEXAMPLExxxxx>",
  "source_type": "image"
  },
  "time_created": "2018-01-16T12:13:35.336000+00:00"
}

動的インベントリ・スクリプトのトラブルシューティング

インベントリ・スクリプトによって生成されたインベントリ・リストに、テナンシのすべてのコンピュート・インスタンスが含まれていない場合は、次の情報を確認してください。

ユーザーの権限

ユーザーのOCID (OCI_USER環境変数またはSDK構成ファイルのprofileセクションを使用して指定)に、コンピュート・インスタンスをリスト表示するためのポリシーの権限があることを確認します。API操作のための権限のリストを表示するには、コア・サービスの詳細を参照してください。

インベントリ・スクリプトでは、次の操作のAPIコールが実行されます:

  • ListCompartments
  • ListVNICAttachments
  • GetSubnet
  • GetVCN
  • GetVNIC
  • GetInstance

ホスト名のフォーマット

OCI_HOSTNAME_FORMATのデフォルトはpublic_ipです。public_ipが設定されたOCI_HOSTNAME_FORMATを使用して生成された動的インベントリには、パブリックIPアドレスがあるコンピュート・インスタンスしか含まれません。これが役立つのは、Ansibleコントローラ・ノードがVCNの外部にあり、パブリックIPアドレスがあるインスタンスにしかAnsibleがアクセスできない場合です。

VCN内のコンピュート・インスタンスでAnsibleを実行しているときに、プライベートIPアドレスを持つコンピュート・インスタンスを含めVCN内のすべてのサブネットにアクセスできる場合は、プライベートIPアドレスを使用してコンピュート・インスタンスをリスト表示するために、OCI_HOSTNAME_FORMATprivate_ipに設定する必要があります。