ノート:

Oracle Linux Automation Engineを使用したPodmanコンテナの構成

イントロダクション

Oracle Linux Automation Engineを使用すると、ユーザーはPodmanをインストールするためのプレイブックを作成し、containers.podmanコレクションを使用してコンテナを実行および管理できます。

プレイブックを実行する場合、Oracle Linux Automation Engineは、プレイブックのhosts:ディレクティブに一致するマシンでタスクを実行します。これらのホストは通常、インベントリ・ファイルで定義され、リモートまたはローカルのいずれかになります。このチュートリアルでは、プレイブックをローカルで実行する方法を説明します。

目的

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

前提条件

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"
    olam_type: olae
    EOF
    
  6. インベントリファイルを作成します。

    cat << EOF | tee hosts > /dev/null
    localhost ansible_connection=local ansible_connection=local ansible_python_interpreter=/usr/bin/python3.6
    EOF
    
  7. 演習環境をデプロイします。

    ansible-playbook create_instance.yml -i hosts -e "@instances.yml"
    

    無料のラボ環境では、Oracle Cloud Infrastructure SDK for Python用のRPMパッケージをインストールするため、localhostに追加変数ansible_python_interpreterが必要です。このパッケージをインストールする場所は、使用しているOracle Linuxのバージョンに基づくシステムのデフォルトのPythonモジュールの下にあります。インベントリ変数を使用すると、localhost以外のホストで実行されている再生に影響を与えません。

    デフォルトのデプロイメント・シェイプでは、AMD CPUが使用されます。コマンドラインで新しいシェイプ変数定義を渡すことで、インスタンスのシェイプを変更できます。

    たとえば: -e instance_shape="VM.Standard3.Flex"

    同様に、Oracle Linuxイメージのデフォルト・バージョンでは、default_vars.ymlファイルに定義されている変数os_versionが使用されます。この値は、コマンドラインでOracle Linuxメジャー・バージョンを渡すことによって変更できます。

    たとえば: -e os_version="9"

    重要:プレイブックが正常に実行されるまで待機し、一時停止タスクに到達します。プレイブックのこの段階では、Oracle Linuxのインストールが完了し、インスタンスの準備ができました。前回の再生は、デプロイするノードのパブリックIPアドレスとプライベートIPアドレスを出力します。

コレクション

コレクションは、プレイブック、ロール、モジュールおよびプラグインを含むOracle Linux Automation Engineコンテンツの配布形式です。このチュートリアルでは、requirements.ymlファイルを使用してcontainers.podmanコレクションをインストールします。requirements.ymlファイルを使用すると、ファイル内で定義されたキーに基づいて、コレクション、ロールまたはその両方をインストールできます。

要件ファイルの作成

  1. 新しい端末を開き、SSH経由でol-control-nodeシステムに接続します。

    ssh oracle@<ip_address_of_instance>
    
  2. 作業ディレクトリを作成します。

    mkdir -p ~/podman-project
    
  3. 要件ファイルを作成します。

    cat << 'EOF' | tee ~/podman-project/requirements.yml > /dev/null
    ---
    collections:
      - name: containers.podman
    EOF
    
  4. コレクションをインストールします。

    ansible-galaxy collection install -r ~/podman-project/requirements.yml
    

    出力は、Galaxyサイトから圧縮アーカイブ・ファイルを取得して、.ansible/collections.の下のホーム・ディレクトリにインストールするプロセスを示しています。

    ノート:出力にERROR: Ansible requires the locale encoding to be UTF-8; Detected None.が表示されている場合、これはansibleのロケール設定が正しくないことを示します。この問題を修正するには、次の2つの環境変数を設定します。

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

Podmanのインストール

Oracle Linux Automation Engineプレイブックは、特定のホストにマップされたタスクで構成される再生で構成されます。これらのタスクは、主にべき等モジュールを実行します。冪等性により、プレイブックを1回実行するか複数回実行するかに関係なく、同じ結果が得られます。このチュートリアルでは、プレイブックを段階的に構築し、各変更の間に実行することで、冪等性を示します。

Podmanコンテナを実行する前に、PodmanパッケージをOracle LinuxのAppStreamリポジトリからインストールする必要があります。

  1. playbookファイルを作成します。

    cat << 'EOF' | tee ~/podman-project/podman-playbook.yml > /dev/null
    ---
    - hosts: localhost
      connection: local
    
      tasks:
    
      - name: Install podman
        ansible.builtin.dnf:
          name: '@container-tools:ol8'
          state: present
        become: yes
        when:
          - ansible_distribution == 'OracleLinux'
          - ansible_facts['distribution_major_version'] == '8'
    
      - name: Install podman
        ansible.builtin.dnf:
          name: 'container-tools'
          state: present
        become: yes
        when:
          - ansible_distribution == 'OracleLinux'
          - ansible_facts['distribution_major_version'] == '9'
    EOF
    

    プレイブックとタスクの名前は、プレイブックを自己文書化することを目的としています。次の情報では、いくつかの重要な項目について詳しく説明します。

    • hosts: localhost: localhostに対して実行するようにタスクに指示します。
    • connection: local: リンクがローカルのままであり、SSHを介して実行されないようにします。
    • become: yes: このプレイブック・セクション内のタスクを、デフォルトでsudo権限で実行するように昇格します。
  2. プレイブックを実行します。

    このプレイブックをローカルホストに対して実行するため、インベントリファイルを明示的に作成または参照する理由はありません。ただし、リモート・ホストに対してこれを実行する場合は、hosts:エントリを更新し、プレイブック内のconnection:行を削除してから、インベントリ・ファイルを作成して参照する必要があります。このプロセスに慣れていない場合は、このチュートリアルの最後にあるOracle Linuxトレーニング・ステーションにリンクされている他のチュートリアルを参照できます。

    ansible-playbook ~/podman-project/podman-playbook.yml
    

    このコマンドの出力には、localhostに対して正常に実行され、podmanのインストール・タスクの変更が報告されていることが示されます。このステータスは、container-toolsモジュールのインストールが適切に完了したことを示します。

  3. バージョンを表示して、インストールされているPodmanパッケージを確認します。

    podman --version
    

イメージのプル

Podmanをインストールすると、選択したレジストリからイメージをプルし、ローカルにステージングできます。このステップでは、GitHubコンテナ・レジストリからOracle Linuxイメージをプルします。

Oracle Linux Developerイメージに関する追加情報は、ここから入手できます。

  1. プレイブックにコンテナ・イメージをプルするタスクを追加します。

    cat << EOF | tee -a ~/podman-project/podman-playbook.yml > /dev/null
    
      - name: Pull oraclelinux:9 from GitHub
        containers.podman.podman_image:
          name: ghcr.io/oracle/oraclelinux:9
    EOF
    
  2. プレイブックを実行します。

    ansible-playbook ~/podman-project/podman-playbook.yml
    
  3. Podmanがイメージをプルしたことを確認します。

    podman images
    

    出力例:

    REPOSITORY                  TAG         IMAGE ID      CREATED       SIZE
    ghcr.io/oracle/oraclelinux  9           97e22ab49eea  20 hours ago  254 MB
    

コンテナ・イメージの実行

イメージをプルするだけでなく、イメージに基づいてコンテナを1つのステップでプルおよび実行することもできます。Oracle Linux NGINX開発者イメージをプルして実行します。

  1. Playbookファイルを更新します。

    cat << EOF | tee -a ~/podman-project/podman-playbook.yml > /dev/null
    
      - name: Run image
        containers.podman.podman_container:
          name: nginx
          image: ghcr.io/oracle/oraclelinux9-nginx:1.20
          state: started
          detach: yes
          expose:
            - '80'
            - '443'
          publish:
            - '8080:80'
    EOF
    

    説明:

    • name: コンテナの名前。
    • image: コンテナの作成に使用されるリポジトリ・パス(またはイメージ名)およびタグ。
    • state: 名前と構成に一致する実行中のコンテナをチェックします。Podmanは、一致が見つからない場合に新しいコンテナを作成して起動します。
    • detach: コンテナをデタッチ・モードで実行します。
    • expose: ポートまたはポート範囲を公開します。
    • publish: コンテナの港またはポートの範囲をホストに公開します。
  2. プレイブックを実行します。

    ansible-playbook ~/podman-project/podman-playbook.yml
    
  3. コンテナが実行中であることを確認します。

    podman ps
    

    出力例:

    [oracle@ol-server podman-project]$ podman ps
    CONTAINER ID  IMAGE                                   COMMAND               CREATED         STATUS             PORTS                 NAMES
    5f7a28cc4c6b  ghcr.io/oracle/oraclelinux9-nginx:1.20  nginx -g daemon o...  2 minutes ago   Up 2 minutes ago   0.0.0.0:8080->80/tcp  nginx
    

    出力には、コンテナが2分間稼働していることが示されます。

  4. コンテナを停止します。

    前述の出力のCONTAINER IDを使用して、次を実行します:

    podman stop $(podman ps -q -f name=nginx)
    

    このコマンドは、nginxコンテナを停止するための参照として CONTAINER IDを使用します。

ボリュームを使用したコンテナ・イメージの実行

Podmanは、コンテナ内のディレクトリにローカル・ディレクトリをマップするバインド・マウントを追加してボリュームを作成します。この機能をデモンストレーションするには、同じNGINXコンテナを実行し、デフォルトのindex.htmlページをカスタム・コンテナに置き換えます。

  1. Playbookファイルを更新します。

    ローカル・ディレクトリを作成します。コマンドラインからこのステップを効率的かつ手動で1回実行できますが、かわりに自動化しましょう。このステップを自動化すると、プレイブックが実行されるたびにディレクトリが存在することが保証されます。イメージを実行する前に、ディレクトリおよびindex.htmlファイルを作成するこれらのタスクを追加します。

    読みやすくするためにタスク間に空白行を残し、YAML構文ルールおよび整列のガイドラインに従ってください。sedを使用すると、テキストのブロックを特定の行のファイルに簡単に挿入できるため、このタスクを完了できます。

    sed -i -e '24 r '<(cat -<< EOF
      - name: Ensure the destination directory exists
        ansible.builtin.file:
          path: "/home/oracle/nginx/"
          state: directory
    
      - name: Create an empty file
        ansible.builtin.file:
          path: "/home/oracle/nginx/index.html"
          state: touch
          mode: '0755'
    
      - name: Create index.html
        ansible.builtin.copy:
          dest: "/home/oracle/nginx/index.html"
          content: |
            Hello! Welcome to Oracle Linux Containers.
    
    EOF
    ) ~/podman-project/podman-playbook.yml
    
  2. 次に、Run imageタスクの最後に次のオプションを追加します。

    cat << EOF | tee -a ~/podman-project/podman-playbook.yml > /dev/null
          volume: "/home/oracle/nginx:/usr/share/nginx/html:Z"
    EOF
    

    volumeオプションは、source:destinationディレクトリ間にバインド・マウントを作成します。:Zオプションは、バインド・マウントに関連するSELinux権限の問題に対処します。Podmanは、コンテナ内のラベルと一致するようにボリュームのコンテンツのラベルを変更することでこれを行います。

    ここは、参照用のプレイブックの完成版です。

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

    ansible-playbook ~/podman-project/podman-playbook.yml
    
  4. コンテナが実行中であることを確認します。

    podman ps
    

    出力例:

    CONTAINER ID  IMAGE                                   COMMAND               CREATED         STATUS             PORTS                 NAMES
    f74aa726d470  ghcr.io/oracle/oraclelinux9-nginx:1.20  nginx -g daemon o...  10 minutes ago  Up 10 minutes ago  0.0.0.0:8080->80/tcp  nginx
    
  5. index.htmlファイルが存在することを確認します。

    ls -l /home/oracle/nginx
    

    出力例:

    [oracle@ol-server podman-project]$ ls -l /home/oracle/nginx/
    total 4
    -rwxr-xr-x. 1 oracle oracle 41 Nov  5 16:46 index.html
    
  6. バインドマウントを確認します。

    cURLを使用して、コンテナのindex.htmlページおよび「ようこそ」メッセージを表示します。

    curl localhost:8080
    

    ここで、8080はコンテナ内のポート80へのローカル・ポート・マッピングです。

次のステップ

このチュートリアルを完了することで、Oracle Linux Automation Engineを使用してPodmanおよびコンテナでの作業を自動化する方法を理解する必要があります。containers.podmanコレクション内の他のモジュールを参照して、インフラストラクチャを自動化する追加のプレイブックを作成します。

その他の学習リソース

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

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