ノート:

Oracle Linux Automation EngineによるOCI動的インベントリの使用

イントロダクション

プロビジョニングおよび構成管理用のオープンソース・ソフトウェアであるOracle Linux Automation Engineは、インベントリ・ファイルを使用して、インフラストラクチャ内の管理対象ノードまたはホストに対して機能します。このインベントリ・ファイルには、サーバー、そのIPアドレスおよびその他のオプションの接続情報のリストが含まれます。

インフラストラクチャがほとんど変更されない場合、静的インベントリ・ファイルは適切に機能します。

ただし、クラウドを使用すると、インフラストラクチャは常に変化する可能性があります。そのため、ホストが入ってくるたびにインベントリを動的に更新する方法があると便利です。

目的

このチュートリアルでは、次のことを学習します。

前提条件

Oracle Linux Automation Engineのデプロイ

ノート:独自のテナンシで実行している場合は、linux-virt-labs GitHubプロジェクトREADME.mdを読み、演習環境をデプロイする前に前提条件を完了してください。

  1. Lunaデスクトップでターミナルを開きます。

  2. linux-virt-labs GitHubプロジェクトをクローニングします。

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 作業ディレクトリに移動します。

    cd linux-virt-labs/olam
    
  4. 必要なコレクションをインストールします。

    ansible-galaxy collection install -r requirements.yml
    
  5. Oracle Linuxインスタンス構成を更新します。

    cat << EOF | tee instances.yml > /dev/null
    compute_instances:
      1:
        instance_name: "ol-control-node"
        type: "control"
      2:
        instance_name: "ol-host"
        type: "remote"
    EOF
    
  6. 演習環境をデプロイします。

    ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6" -e "@instances.yml"
    

    無料の演習環境では、追加変数local_python_interpreterが必要です。この変数は、localhostで実行されている再生用にansible_python_interpreterを設定します。この変数は、python3.6モジュールの下にあるOracle Cloud Infrastructure SDK for PythonのRPMパッケージが環境によってインストールされるため必要です。

    デフォルトのデプロイメント・シェイプでは、AMD CPUおよびOracle Linux 8が使用されます。Intel CPUまたはOracle Linux 9を使用するには、デプロイメント・コマンドに-e instance_shape="VM.Standard3.Flex"または-e os_version="9"を追加します。

    重要:プレイブックが正常に実行されるまで待機し、一時停止タスクに到達します。プレイブックのこの段階で、Oracle Linuxのインストールが完了し、インスタンスの準備ができました。前の再生に注意してください。これは、デプロイするノードのパブリックIPアドレスとプライベートIPアドレス、および演習の実行中に必要なその他のデプロイメント情報を出力します。

Oracle Linux Automation Engine制御ノードのインストール

制御ノードは、Oracle Linux Automation Engineプレイブックが実行されるシステムです。プレイブックを実行する前に、Oracle Linux Automation Engineパッケージをインストールする必要があります。

  1. 新しいターミナルを開き、SSHを介してol-control-nodeシステムに接続します。

    ssh oracle@<ip_address_of_instance>
    
  2. Oracle Linux Automation Engineパッケージおよび依存関係をインストールします。

    sudo dnf install -y ansible-core
    

    ansible-coreパッケージは、ol8_appstreamリポジトリで使用できます。

  3. パッケージのインストールをテストします。

    ansible --version
    

    出力を確認し、Python Oracle Linux Automation Managerのデフォルト・バージョンを探します。これは、Oracle Cloud Infrastructure (OCI) SDK for Pythonをインストールする必要がある環境です。

    ノート:出力にERROR: Ansibleでは、ロケール・エンコーディングをUTF-8、検出なしにする必要があります。これは、ansibleのロケール設定が正しくないことを示します。次の2つの環境変数を設定して問題を修正します。

    export LC_ALL="en_US.UTF-8"
    export LC_CTYPE="en_US.UTF-8"
    

Oracle Cloud Infrastructure SDK for Pythonの設定

OCI動的インベントリ・プラグインには、制御ノード上で動作するOCI SDK for Python構成が必要です。OCI SDKは、Python用のパッケージ・インストーラであるOracle Linux RPMまたはPIPを使用してインストールできます。

  1. PIPを使用してOCI SDK for Pythonをインストールします。

    1. PIPのパッケージと依存関係をインストールします。

      sudo dnf install -y python3.12-pip python3.12-setuptools
      
    2. Pythonパッケージのインストール

      /usr/bin/python3.12 -m pip install oci
      

      プロキシを使用している場合は、--proxyオプションを追加します。詳細は、コマンドpython3.12 -m pip help installを実行してヘルプを参照してください。

  2. バージョンを出力して、OCI SDK for Pythonインストールをテストします。

    python3.12 -c "import oci;print(oci.__version__)"
    
  3. OCI SDKのデフォルト構成ディレクトリを作成します。

    mkdir -p ~/.oci
    
  4. SDKのデフォルト構成ファイルの作成

    無料のラボでは、事前生成されたSDK構成が提供されており、scpを使用してol-control-nodeシステムにコピーできます。

    1. デスクトップ環境から新しい端末を開きます。

    2. すべてのSDK構成ファイルをol-control-nodeシステムにコピーします。

      scp ~/.oci/* oracle@<ip_address_of_instance>:~/.oci/.
      
      exit
      

    無料の演習環境以外でこのチュートリアルに従う場合は、OCI構成ファイルを生成するために、OCIドキュメントのSDKおよびCLI構成ファイルおよび必要なキーおよびOCIDsの項に記載されている手順を参照してください。

  5. ol-control-nodeシステムに接続されている端末ウィンドウに切り替えます。

  6. SDK構成ファイルのkey_fileの場所を更新します。

    SDK構成ファイルをデスクトップ環境からコピーする場合は、key_fileのユーザーのホーム・ディレクトリ部分を変更する必要があります。

    sed -i 's/luna.user/oracle/g' ~/.oci/config
    
  7. SDKが機能していることを確認するテストPythonスクリプトを作成します。

    cat << EOF | tee test.py > /dev/null
    import oci
    object_storage_client = oci.object_storage.ObjectStorageClient(oci.config.from_file())
    result = object_storage_client.get_namespace()
    print("Current object storage namespace: {}".format(result.data))
    EOF
    

    test.pyスクリプトは、構成されたOCIテナンシおよびコンパートメントのオブジェクト・ストレージ・ネームスペースを表示します。

  8. スクリプトの実行

    python3.12 test.py
    

    テスト・スクリプトは、構成されたテナンシの一意のネームスペースを正常に出力します。

Oracle Cloud Infrastructure Ansibleコレクションのインストール

OCI Ansibleコレクションには、クラウド・インフラストラクチャのプロビジョニングと構成、複雑な運用プロセスのオーケストレーション、ソフトウェア・アセットのデプロイメントと更新を自動化する一連のモジュールが含まれています。

  1. プロジェクト・ディレクトリを作成します。

    mkdir ~/myproject
    
  2. 要件ファイルを作成します。

    cat << EOF | tee ~/myproject/requirements.yml > /dev/null
    ---
    collections:
      - name: oracle.oci
    EOF
    
  3. OCI Ansibleコレクションをインストールします。

    ansible-galaxy collection install -r ~/myproject/requirements.yml
    

    以前のバージョンをインストールした場合は、--forceオプションを指定してコマンドを実行して最新リリースを取得します。

    ansible-galaxy collection install --force oracle.oci
    

OCI動的インベントリの操作

Oracleでは、OCI Ansibleコレクションに動的なインベントリ・プラグインが含まれています。

  1. YAML構成ソースを作成してインベントリ・プラグインを構成します。

    ソース・ファイル名は、<filename>.oci.ymlまたは<filename>.oci.yamlである必要があります。ここで、<filename>はユーザー定義の有用な識別子です。

    cat << EOF | tee ~/myproject/myproject.oci.yml > /dev/null
    ---
    plugin: oracle.oci.oci
    
    # Optional fields to specify oci connection config:
    config_file: ~/.oci/config
    config_profile: DEFAULT
    EOF
    
  2. インベントリ・グラフを作成してインベントリ・プラグインをテストします。

    ansible-inventory -i ~/myproject/myproject.oci.yml --graph
    

    出力には、一連の警告とエラーが表示されます。では、何が間違っていたのか。

    プラグインでコンパートメントOCIDを認識する必要があるため、エラーが発生します。コンパートメントOCIDではなくテナンシOCIDを指定し、適切な権限を持っている場合、プラグインはテナンシ全体のインベントリを生成します。

    プラグインはSDK構成ファイルからコンパートメントOCID情報を直接読み取れないため、プラグイン構成ソース・ファイルに追加します。

  3. SDK構成ファイルからコンパートメントOCIDを取得し、変数comp_ocidに割り当てます。

    comp_ocid=$(grep -i compartment ~/.oci/config | sed -e 's/compartment-id=//g')
    
  4. プラグイン・ソース・ファイルにコンパートメント・パラメータを追加します。

    cat << EOF | tee -a ~/myproject/myproject.oci.yml > /dev/null
    
    compartments:
      - compartment_ocid: "$comp_ocid"
        fetch_compute_hosts: true
    EOF
    

    fetch_compute_hoststrueに設定すると、インベントリではコンピュート・ホスト上の情報のみが収集され、コンパートメント内にデプロイされている他のインスタンス・タイプは無視されます。

  5. テストを再実行

    ansible-inventory -i ~/myproject/myproject.oci.yml --graph
    

    この例では、@文字で指定されたインベントリ・グループのリストとしてコンパートメント内で使用可能なコンピュート・インスタンスを示し、インスタンスのパブリックIPアドレスを表示します。

    プライベートIPアドレスが必要な場合はどうすればよいですか。

    プライベートIPアドレスの取得は、コントローラ・ノードの物理的な場所またはクラウド・インフラストラクチャ内で構成されたネットワーク・トポロジに基づいて必要です。プライベートIPアドレスを取得するもう1つの理由は、リクエストされたコンピュート・インスタンスにプライベートIPアドレスのみがある場合です。

  6. プラグイン構成ソースファイルを更新して、プラグインのホスト名形式パラメータを変更します。

    cat << EOF | tee -a ~/myproject/myproject.oci.yml > /dev/null
    
    hostname_format_preferences:
      - "private_ip"
      - "public_ip"
    EOF
    

    前述の形式の例では、システムのプライベートIPアドレスがパブリックIPアドレスよりも優先されます。この構成の詳細は、ドキュメントのホスト名書式プリファレンスを参照してください。

  7. プラグインを再テストします。

    ansible-inventory -i ~/myproject/myproject.oci.yml --graph
    

    出力にプライベートIPアドレスが表示されます。

プレイブックの実行

動的なインベントリの設定と構成により、簡単なプレイブックを実行することができます。制御ノードとリモート間のSSHアクセスを有効にしてください。これは、インスタンスの初期デプロイメント中にパスワードなしのSSHログインを使用して構成しました。

  1. ホストをpingするプレイブックを作成します。

    cat << EOF | tee ~/myproject/ping.yml > /dev/null
    ---
    - hosts: all,!$(hostname -i)
      tasks:
      - name: Ansible ping test
        ansible.builtin.ping:
    EOF
    

    Oracle Linux Automation Engineでは、- hosts:エントリの後にホストまたはグループのカンマ区切りリストが想定され、!はそれらのエントリを除外する必要があることを示します。allエントリは、インベントリに表示される各ホストを最上位グループ内の@allとしてpingします。このプレイブックを変更して、名前から@文字を削除し、その名前を- hosts:エントリに入力することで、グラフ出力とは異なるグループを使用できます。

  2. プレイブックを実行します。

    ansible-playbook -u opc -i ~/myproject/myproject.oci.yml ~/myproject/ping.yml
    

    プロンプトが表示されたら、ECDSAキー・フィンガープリントを受け入れます。

    -iオプションは、使用される動的インベントリ・ファイルを設定します。

    -uオプションは、接続を試行するときにリモートSSHユーザーを設定します。

次のステップ

okステータスで実行されたプレイブックを完了すると、Oracle Linux Automation EngineがOCI動的インベントリを正常に使用して、コンパートメント内で検出したリモート・インスタンスと通信することが確認されます。引き続き学習し、この機能を使用して、OCIインスタンスのフリートを管理し、Oracle Linuxで日常的な管理タスクを実行します。

その他の学習リソース

docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。