ノート:

Oracle Linux Automation Engineを使用したOracle Linuxタスクの実行

イントロダクション

Oracle Linux Automation Engineを使用すると、管理者は、一連のプレイブックおよびタスクを通じて、Infrastructure as Code (IaC)構成管理ツールを使用して、Oracle Linuxの初期設定を自動化し、その他の管理ジョブを実行できます。

目的

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

前提条件

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"
    use_olae_only: true
    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では、これらの変数を複数の場所で定義でき、それぞれに優先順位があります。Playbookレベルの変数は、varsまたは vars_filesディレクティブを使用して、プレイブック内で定義されます。varsディレクティブは変数を再生の一部として指定します。一方、vars_filesディレクティブは変数を含む外部ファイルを含みます。開発者は、プレイブックを実行する前にシステム構成を定義するこの例のように、これらの変数を別のプレイから動的にまたは静的に作成できます。

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

    ssh oracle@<ip_address_of_instance>
    
  2. Oracle Linux Automation Engineコマンドが使用可能であることを確認します。

    ansible --version
    
  3. 作業プロジェクト・ディレクトリを作成します。

    mkdir -p ~/ol-playbook
    
  4. プロジェクトの変数ディレクトリとファイルを作成します。

    mkdir ~/ol-playbook/vars
    
    touch ~/ol-playbook/vars/defaults.yml
    
  5. 変数と値をファイルに追加します。

       
    cat << EOF | tee ~/ol-playbook/vars/defaults.yml > /dev/null
    ---
    username: oracle
    user_default_password: oracle
    ssh_key_file: id_rsa
    ssh_private_key_file: "{{ lookup('file', lookup('env','HOME') + '/.ssh/' + ssh_key_file + '.pub') }}"
    additional_packages: ['git']
    EOF
       
    

    この情報では、各変数とその使用方法について説明します。

    • username: プレイブックの実行時に作成されたsudoユーザーの名前。この例では、ユーザーの名前はoracleになります。
    • user_default_password: 作成時のoracleユーザーのデフォルト・パスワード。パスワードは、sudoコマンドの実行時に必要です。
    • ssh_key_file: ユーザーのSSHキー・ペアの名前を設定します。
    • ssh_private_key_file: ユーザーのSSH公開キーを、指定されたパスのリモート・ユーザーのauthorized_keyファイルにコピーします。この例では、lookupプラグインを使用して、ローカルユーザー $HOME/.ssh/ディレクトリ内の公開鍵 id_rsa.pubを検索します。
    • additional_packages: 配列形式でインストールする追加パッケージの名前を追加します。配列内の各パッケージは、一重引用符で囲み、カンマで区切る必要があります。container-toolsなどのappstreamモジュールをインストールする場合、配列は['git',' @container-tools:ol8']のようになります。
  6. プレイブックファイルを作成します。

       
    cat << EOF | tee ~/ol-playbook/setup.yml > /dev/null
    ---
    - hosts: all
      become: yes
      vars_files:
        - vars/defaults.yml
    
      tasks:
    
      - name: Generate new ssh keypair
        community.crypto.openssh_keypair:
          path: "~/.ssh/{{ ssh_key_file }}"
          size: 2048
          comment: olam ssh keypair
        become: true
        become_user: "{{ username }}"
        delegate_to: localhost
    
      - name: Add a user account with access to sudo
        ansible.builtin.user:
          name: "{{ username }}"
          password: "{{ user_default_password | password_hash('sha512') }}"
          comment: Default Oracle user
          groups: wheel
          append: yes
          update_password: on_create
    
      - name: Set the authorized key for the user using a local public key file
        ansible.posix.authorized_key:
          user: "{{ username }}"
          state: present
          key: "{{ ssh_private_key_file }}"
    
      - name: install additional packages
        ansible.builtin.dnf:
          name: "{{ additional_packages }}"
          state: latest
    EOF
       
    

    プレイブックの特定のタスクとモジュール名は、プレイブックの自己文書化を目指しています。次の項目は、プレイの実行場所と実行者を示します。

    • hosts: all: この行は、インベントリからタスクを実行するホストを指定します。
    • become: yes: デフォルトでsudo権限で実行するように、このセクション内のタスクに指示します。
    • vars_files"このディレクティブは、このチュートリアルのプレイブック構成を含む変数ファイルをロードします。

必要なコレクションのインストール

ansible-coreパッケージには、ansible.builtinコレクションと呼ばれるホストを管理するための最小限のモジュール・セットが含まれています。コレクションは、ターゲット・タスクを実行するプレイブック、ロール、モジュールまたはプラグインを配布する方法です。ansible-coreでは、組込み外で必要なモジュールまたはコレクションをダウンロードしてインストールする必要があります。

上のプレイブックでは ansible.posixコレクションを使用しているため、このコレクションなどをインストールする必要があります。これを行う最も簡単な方法は、すべての依存関係を含む要件ファイルを作成することです。

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

    cat << 'EOF' | tee ~/ol-playbook/requirements.yml > /dev/null
    ---
    collections:
      - name: ansible.posix
      - name: community.crypto
    EOF
    
  2. コレクションをインストールします。

    ansible-galaxy collection install -r ~/ol-playbook/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"
    

Playbookの実行

プレイブックを実行する前に、管理する予定のリモートOracle Linuxインスタンスを指すこのプロジェクトのインベントリ・ファイルを作成する必要があります。

  1. ol-hostのIPアドレスをリモート・システムの変数に割り当てます。

    この変数を使用すると、インベントリ・ファイルの作成を簡単にスクリプト化できます。

    export REMOTE=<ip_address_of_instance>
    
  2. 新しいインベントリ・ファイル・プロジェクト・ディレクトリを作成します。

    cat << EOF | tee ~/ol-playbook/inventory > /dev/null
    [production]
    ol-host ansible_host=$REMOTE
    EOF
    
  3. プロジェクトの作業ディレクトリに移動します。

    cd ~/ol-playbook
    
  4. 非定型pingコマンドを使用して接続をテストします。

    ansible ol-host -i ~/ol-playbook/inventory -m ping -u opc
    
    • -u: ssh接続のユーザー名を渡します。無料のラボ環境では、opcユーザー(Oracle Cloud Infrastructure (OCI)のOracle Linuxインスタンスで提供されているデフォルト・ユーザー)を使用します。プロンプトでyesと入力してECDSAキー・フィンガープリントを承認し、続行します。

    コマンドは正常に実行され、結果は次のようになります。

    出力例:

    ol-host | SUCCESS => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": false,
        "ping": "pong"
    }
    
  5. プレイブックを実行します。

    ansible-playbook -i inventory setup.yml -u opc
    

    コマンドは正常に実行され、各プレイの変更された結果が表示されます。

リモート・ホストに接続

プレイブックが正常に実行されると、username変数で定義されているユーザーを使用してリモートシステムに接続できます。

  1. SSHを介してOLホスト・システムに接続します。

    ssh oracle@$REMOTE
    

    ssh_key_file変数の値を変更した場合は、指定されたペアの秘密キー・ファイルを指して、sshに'-i'オプションを渡す必要があります。

    次に例を示します:

    ssh -i ~/.ssh/<local_ssh_private_key> <username>@<ip_address_of_host>
    
  2. 要求されたパッケージのインストールを確認します。

    ログイン後、プレイブックにgitパッケージがインストールされていることを確認できます。

    git --version
    
  3. リモート・ホストから切断します。

    exit
    

リポジトリの追加

Oracle Linuxは、ミッションクリティカルなアプリケーションを導入できる、安全でスケーラブルで信頼性の高いプラットフォームを提供します。追加のリポジトリの追加は、新しいOracle製品またはサード・パーティ・アプリケーションのインストールに使用されます。Oracle Linuxには、これらの追加リポジトリのプロビジョニングを処理するサプリメンタル・パッケージが用意されています。

Oracle Linux YUMサーバーには、Oracleが提供する様々なリポジトリの詳細が表示されます。

  1. これらの追加タスクを既存のプレイブックファイルに追加します。

    cat << EOF | tee -a setup.yml > /dev/null
      - name: Add the EPEL repository
        ansible.builtin.dnf:
          name: oracle-epel-release-el8
          state: present
        when:
          - ansible_distribution == 'OracleLinux'
          - ansible_facts['distribution_major_version'] == '8'
    
      - name: Install the htop utility package
        ansible.builtin.dnf:
          name: htop
          enablerepo: ol8_developer_EPEL
          state: present
        when:
          - ansible_distribution == 'OracleLinux'
          - ansible_facts['distribution_major_version'] == '8'
    EOF
    

    このプレイブックは、定義されたプレイ内に2つのタスクを追加します。1つ目は、Oracle Linuxインスタンス上の既存のソフトウェア・リポジトリにEPELリポジトリを追加します。一方、2回目の再生では、htopパッケージが同じターゲットホストインスタンスにインストールされます。

    注目すべきパラメータ:

    • state: present: 参照されるパッケージがすでにシステム上にあるか、dnfを使用してインストールされていることを確認します。
    • enablerepo: 現在のタスクの期間中のみ、特定のリポジトリ(無効の場合)を有効にします。
  2. プレイブックを再実行して、追加のタスクを実行します。

    ansible-playbook -i inventory setup.yml -u opc
    

    プレイブックが正常に終了し、無視できるいくつかの警告が表示されます。プレイブックは、適切に完了したタスクを okまたは changedステータスで報告します。changedステータスは、htopパッケージを追加するか、パッケージの最新バージョンを要求するときにdnfキャッシュを更新することによって、そのパッケージが存在するかどうかを確認するだけではなく、プレイブックがホストを変更したことを示します。okはタスクの完了を示し、アクションは必要ありません。

  3. リポジトリおよびパッケージのインストールを確認します。

    ssh oracle@$REMOTE which htop
    
  4. htopコマンドを実行します。

    ssh oracle@$REMOTE -t htop
    

    htopには対話型シェルが必要であるため、SSHコマンドの -tオプションはTTY割り当てを強制します。

  5. qと入力して、htopプログラムを終了します。

ファイルおよびディレクトリの追加、更新および削除

  1. 次のファイルを既存のプレイブックファイルに追加して、ディレクトリとファイルを作成します。

       
    cat << EOF | tee -a setup.yml > /dev/null     
    
      - name: Create an example directory (if it does not already exist)
        ansible.builtin.file:
          path: "/home/{{ username }}/example"
          state: directory
          mode: '0755'
        become_user: "{{ username }}"
    
      - name: Create an empty file
        ansible.builtin.file:
          path: "/home/{{ username }}/example/test.txt"
          state: touch
          # mode: u=rw,g=r,o=r
        become_user: "{{ username }}"
    EOF
       
    

    このプレイブックは、定義されたプレイ内に2つのタスクを追加します。1つ目はリモートユーザーのホームディレクトリに exampleという新しいディレクトリを作成し、2つ目は新しく作成された exampleディレクトリに test.txtという空のファイルを作成します。

    注目すべき追加パラメータ:

    • state:: ansible.builtin.fileモジュールでは、absentdirectoryfilehardlinkおよびtouchの各パラメータがサポートされています。これらのタスクでは、ディレクトリパスがまだ存在しない場合は directoryを使用し、存在しない場合は空のファイルを作成する touchを使用します。
    • mode: 作成されたオブジェクトのファイルシステム権限を設定します。コマンド行を使用する場合、8進数の 0644またはシンボリック u=rw、g=r、o=rモードを使用できます。mode:パラメータを省略すると、システムのデフォルトモードが適用されます。
    • become_user: "": Oracle Linux Automation Engineの権限エスカレーション機能を使用してタスクを実行します。以前のチュートリアルでは、タスクをrootとして実行するためのbecome:権限エスカレーション機能を導入しました。次の例では、類似の機能を使用して、タスクを別のユーザーとして実行する方法を示します。ユーザーを変数""として設定します。この変数は、vars/defaults.ymlファイルでoracleユーザーとして事前定義されています。したがって、このタスクはoracleユーザーとして実行され、そのユーザーのデフォルトを継承します。
  2. プレイブックを実行して、追加のタスクを実行します。

    ansible-playbook -i inventory setup.yml -u opc
    
  3. リモートホストに新しいディレクトリとファイルが存在することを確認します。

    ssh oracle@$REMOTE ls -al example
    

    出力によって、新しいディレクトリと空のファイルが作成されることが確認されます。test.txtファイルには0バイトがあり、oracleユーザーがそのファイルを所有していることに注意してください。

  4. 複数のファイルを追加します。

    システムのセットアップ中に、ディレクトリ内に複数のファイルを作成する必要がある場合があります。個々のタスクを使用するのではなく、1つのディレクトリにアトミック操作として複数のファイルを作成できます。

       
    cat << EOF | tee -a setup.yml > /dev/null     
    
      - name: Add multiple files
        ansible.builtin.file:
          path: "/home/{{ username }}/example/{{ item }}"
          state: touch
        with_items:
        - file01.txt
        - file02.txt
        - file03.txt
        - file04.txt
        become_user: "{{ username }}"
    EOF
       
    

    このタスクでは、ループを使用してリストから複数の空のファイルを作成します。

    • path:: ファイルを書き込むリモート・システム上の場所を定義します。Oracle Linux Automation Engineは、実行時に``変数をwith_itemsパラメータの各itemに置き換えます。
    • with_items:: このパラメータは、このタスクの実行中にループするitemsのリストを示します。この例では4つのファイル名のみを使用していますが、必要なかぎりリストを作成できます。
  5. プレイブックを実行して、追加のタスクを実行します。

    ansible-playbook -i inventory setup.yml -u opc
    
  6. リモートホストに新しいディレクトリとファイルが存在することを確認します。

    ssh oracle@$REMOTE ls -al example
    

    出力には、元の test.txtファイルと新しいファイルが表示されます。

  7. 1行のコンテンツをファイルに追加します。

       
    cat << 'EOF' | tee -a setup.yml > /dev/null     
    
      - name: Insert some text into the test.txt file
        ansible.builtin.lineinfile:
          path: "/home/{{ username }}/example/test.txt"
          line: This is a test
          create: True
          owner: "{{ username }}"
          group: "{{ username }}"
          mode: '0644'
    
      - name: Add an extra line after the line just inserted
        ansible.builtin.lineinfile:
          path: "/home/{{ username }}/example/test.txt"
          regexp: '^a test'
          insertafter: 'This is a test'
          line: This is some updated text that was added later.
          create: True
          owner: "{{ username }}"
          group: "{{ username }}"
          mode: '0644'
    
      - name: Get the contents of the test.txt file
        ansible.builtin.command: cat ~/example/test.txt
        register: command_output
        become_user: "{{ username }}"
    
      - name: Print the results of the cat command
        ansible.builtin.debug:
          msg: "{{ command_output }}"
    
      - name: Print only the lines added to the text file
        ansible.builtin.debug:
          msg: "{{ command_output.stdout_lines }}"
    EOF
       
    
    • 最初の2つのタスクでは、ansible.builtin.lineinfileを使用してファイルの単一行を追加および更新します。

    • 残りのタスクは、変更を確認する方法を示しています。プレイブックは、最初にansible.builtin.commandを使用して、更新されたファイルの内容を標準出力に出力し、それをregister変数内のメモリーに保存します。次に、ansible.builtin.debugモジュールを使用して、そのコンテンツをプレイブック出力の一部として画面に出力します。2番目のデバッグ・タスクは、前のタスクからのJSON出力の特定の部分のみに出力を制限する方法を示しています。

  8. プレイブックを実行して、追加のタスクを実行します。

    ansible-playbook -i inventory setup.yml -u opc
    

    プレイブックの最後のタスクは、debugモジュールを使用してファイルの内容を出力します。

  9. ファイルに複数のコンテンツ行を追加します。

       
    cat << EOF | tee -a setup.yml > /dev/null     
    
      - name: Add two lines into test.txt
        ansible.builtin.blockinfile:
          path: "/home/{{ username }}/example/test.txt"
          insertafter: 'This is some updated text that was added later.'
          block: |
            "Welcome to {{ ansible_hostname }}"
            "Last updated on {{ ansible_date_time.iso8601 }}"
    
      - name: Create a new file and insert content into it
        ansible.builtin.copy:
          content: |
            === The text below was added by Oracle Linux Automation Engine ==========
    
            Hello from the ansible.builtin.copy module.
            This task is an example of inserting multiple lines into a text file.
            You can insert more lines if you want.
    
            === The text above was added by Oracle Linux Automation Engine ===========
          dest: "/home/{{ username }}/example/testing.txt"
          mode: '0644'
        become_user: "{{ username }}"
    EOF
       
    
  10. プレイブックを実行して、追加のタスクを実行します。

    ansible-playbook -i inventory setup.yml -u opc
    
  11. ファイルに新しい行が2つ存在することを確認します。

    ssh oracle@$REMOTE cat example/test.txt
    

    出力には、追加されたコンテンツが表示され、実行時にリモート・ホストに対してプレイブックによって行われた自動ファクト収集に基づいて、タスクの変数値が解釈されます。

  12. 新しいファイルの作成およびコンテンツの追加を確認します。

    ssh oracle@$REMOTE cat example/testing.txt
    
  13. ファイルおよびディレクトリを削除します。

    Oracle Linux Automation Engineでは、ファイルおよびディレクトリの作成およびテキストの追加に加えて、これらの項目も削除できます。このプレイブックが作成したディレクトリとすべてのファイルを削除し、システムを起動したときと同じ状態のままにします。これらのタスクでは、最初に absentに設定された state:パラメータを使用して、ファイルのリストを削除してからディレクトリを削除します。2番目のタスクでは、ディレクトリとともに1つのステップでファイルの削除を処理します。それでも、Oracle Linux Automation Engine機能の追加デモンストレーションの最初のタスクが含まれています。

        
    cat << EOF | tee -a setup.yml > /dev/null     
    
      - name: Delete multiple files
        ansible.builtin.file:
          path: '{{ item }}'
          state: absent
        with_items:
          - "/home/{{ username }}/example/test.txt"
          - "/home/{{ username }}/example/file01.txt"
          - "/home/{{ username }}/example/file02.txt"
          - "/home/{{ username }}/example/file03.txt"
          - "/home/{{ username }}/example/file04.txt"
          - "/home/{{ username }}/example/testing.txt"
    
      - name: Recursively remove directory
        ansible.builtin.file:
          path: "/home/{{ username }}/example"
          state: absent
    EOF
        
    

    表示されている2番目のタスクを使用して、ディレクトリおよびコンテンツを再帰的に削除できます。ファイルを削除するだけで済むように、ファイルを削除する最初のタスクがあります。ファイルとファイルとディレクトリの両方を削除する場合は、2番目のタスクの方が効率的です。

  14. プレイブックを実行して、追加のタスクを実行します。

    ansible-playbook -i inventory setup.yml -u opc
    
  15. 指定したディレクトリの削除を確認します。

    ssh oracle@$REMOTE ls
    

    出力不足により、指定されたディレクトリと、このチュートリアル中に作成されたファイルが消失したことが確認されます。

次のステップ

ここまでやってきました。このチュートリアルでは、パッケージのインストール、ファイルおよびディレクトリの作成、更新および削除、Oracle Linuxへのユーザー・アカウントの追加など、自動化によって、Oracle Linux Automation EngineがOracle Linuxでルーチン・タスクを実行できるいくつかの方法を紹介しました。また、Oracle Linux Automation Engineのansible.builtin.debugモジュールを使用して、Playbookの実行中に情報を端末に戻す方法も示しました。これらのスキルにより、前向きに冒険し、独自のプレイブックを書くことができます。

その他の学習リソース

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

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