動的インベントリ・スクリプトの使用
正確なインベントリ・リストを使用することがAnsibleプレイブックの実行に不可欠です。Oracle Cloud Infrastructureでは、ダウンロードして実行できるスクリプトが提供されており、これを使用するとインスタンスのインベントリ・リストを常に最新の状態に保つことができます。このスクリプトにより、プレイブックが、Oracle Cloud Infrastructure Computeインスタンスの最新セットを常に使用できるようになります。
動的インベントリ・スクリプトのダウンロードと構成
次の場所、動的インベントリ・スクリプト(oci_inventory.py
)およびデフォルト構成ファイル(oci_inventory.ini
)をダウンロードします:
- https://github.com/oracle/oci-ansible-modules/blob/master/inventory-script/oci_inventory.py
- https://github.com/oracle/oci-ansible-modules/blob/master/inventory-script/oci_inventory.ini
スクリプトと構成の詳細
oci_inventory.py
スクリプトは、Oracle Cloud Infrastructure SDK for Pythonを使用してOracle Cloud Infrastructureテナンシのコンピュート・インスタンスを問い合せてから、Ansibleプレイブックで使用するための動的インベントリを作成します。Pythonスクリプトで引数を使用して、問合せの対象の構成プロファイルおよびテナンシ・コンパートメントを制御します。
oci_inventory.ini
ファイルの設定を使用して、インベントリ詳細をキャッシュする方法を制御し、どのOracle Cloud Infrastructureプロファイルを使用するかを制御できます。このファイルによって、ホスト名を変更し、生成されたインベントリ・リストでのホストの指定方法を制御できます。
引数および環境変数
スクリプトが受け入れられるコマンドライン引数と環境変数の完全なリストは、動的インベントリ・スクリプトを参照してください。
優先順位
動的インベントリ・スクリプトで使用される構成の優先順位は次のとおりです:
- コマンドライン引数。
- 環境変数。
- 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_names
をFalse
に設定します。sanitize_names
がTrue
のときにダッシュ(-)も置換するには、設定ファイルでreplace_dash_in_names
をTrue
に設定します。動的インベントリの使用方法
プレイブック実行時の動的インベントリの使用
動的インベントリを使用するには、まず正しい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_FORMAT
をprivate_ip
に設定する必要があります。