ノート:
- このチュートリアルは、Oracle提供の無料ラボ環境で入手できます。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了するときに、これらの値をクラウド環境に固有の値に置き換えます。
Oracle Linux Automation Engineを使用したOracle Linuxタスクの実行
イントロダクション
Oracle Linux Automation Engineを使用すると、管理者は、一連のプレイブックおよびタスクを通じて、Infrastructure as Code (IaC)構成管理ツールを使用して、Oracle Linuxの初期設定を自動化し、その他の管理ジョブを実行できます。
目的
このチュートリアルでは、次の方法を学習します。
- 次のようなプレイブックを作成します。
- ユーザーを作成します
- sudoグループにユーザーを追加します
- ローカルSSH公開鍵をユーザーの authorized_keysファイルにコピーします
- DNFリポジトリを追加し、パッケージをインストールします。
- ファイルの操作
前提条件
-
次の構成を持つ2つ以上のOracle Linuxシステム:
- sudoアクセス権を持つroot以外のユーザー
- root以外のユーザーのsshキーペア
- パスワードなしのSSHログインを使用して、あるホストから別のホストにSSHを実行する機能
Oracle Linux Automation Engineのデプロイ
ノート:独自のテナンシで実行している場合は、linux-virt-labs
GitHubプロジェクトREADME.mdを読み、演習環境をデプロイする前に前提条件を完了してください。
-
Lunaデスクトップでターミナルを開きます。
-
linux-virt-labs
GitHubプロジェクトをクローニングします。git clone https://github.com/oracle-devrel/linux-virt-labs.git
-
作業ディレクトリに移動します。
cd linux-virt-labs/olam
-
必要なコレクションをインストールします。
ansible-galaxy collection install -r requirements.yml
-
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" olam_type: olae EOF
-
インベントリファイルを作成します。
cat << EOF | tee hosts > /dev/null localhost ansible_connection=local ansible_connection=local ansible_python_interpreter=/usr/bin/python3.6 EOF
-
演習環境をデプロイします。
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では、これらの変数を複数の場所に定義でき、それぞれが特定の優先順位を持ちます。プレイブック・レベルの変数は、varsまたはvars_filesディレクティブを使用してプレイブック内で定義されます。varsディレクティブは再生の一部として変数を指定し、vars_filesディレクティブは変数を含む外部ファイルを含みます。開発者は、プレイブックを実行する前にシステム構成を定義するこの例のように、これらの変数を別のプレイから動的にまたは静的に作成できます。
-
新しい端末を開き、SSH経由でol-control-nodeシステムに接続します。
ssh oracle@<ip_address_of_instance>
-
Oracle Linux Automation Engineコマンドが使用可能であることを確認します。
ansible --version
-
作業プロジェクト・ディレクトリを作成します。
mkdir -p ~/ol-playbook
-
プロジェクトの変数ディレクトリとファイルを作成します。
mkdir ~/ol-playbook/vars
touch ~/ol-playbook/vars/defaults.yml
-
変数と値をファイルに追加します。
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']
のようになります。
-
プレイブックファイルを作成します。
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
コレクションを使用しているため、このコレクションなどをインストールする必要があります。これを行う最も簡単な方法は、すべての依存関係を含む要件ファイルを作成することです。
-
要件ファイルを作成します。
cat << 'EOF' | tee ~/ol-playbook/requirements.yml > /dev/null --- collections: - name: ansible.posix - name: community.crypto EOF
-
コレクションをインストールします。
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インスタンスを指すこのプロジェクトのインベントリ・ファイルを作成する必要があります。
-
ol-hostのIPアドレスをリモート・システムの変数に割り当てます。
この変数を使用すると、インベントリ・ファイルの作成を簡単にスクリプト化できます。
export REMOTE=<ip_address_of_instance>
-
プロジェクト・ディレクトリ内に新しいインベントリ・ファイルを作成します。
cat << EOF | tee ~/ol-playbook/inventory > /dev/null [production] ol-host ansible_host=$REMOTE EOF
-
プロジェクトの作業ディレクトリに移動します。
cd ~/ol-playbook
-
非定型
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" }
-
プレイブックを実行します。
ansible-playbook -i inventory setup.yml -u opc
コマンドが正常に実行され、各再生の変更結果が表示されます。
リモート・ホストに接続
プレイブックが正常に実行されると、username変数で定義されているユーザーを使用してリモートシステムに接続できます。
-
SSHを介してol-hostシステムに接続します。
ssh oracle@$REMOTE
ssh_key_file
変数の値を変更した場合は、指定されたペアの秘密キー・ファイルを指して、sshに'-i'オプションを渡す必要があります。次に例を示します:
ssh -i ~/.ssh/<local_ssh_private_key> <username>@<ip_address_of_host>
-
要求されたパッケージのインストールを確認します。
ログイン後、プレイブックに
git
パッケージがインストールされていることを確認できます。git --version
-
リモート・ホストから切断します。
exit
リポジトリの追加
Oracle Linuxは、ミッションクリティカルなアプリケーションをデプロイするためのセキュアでスケーラブル、かつ信頼性の高いプラットフォームを提供します。追加のリポジトリの追加は、新しいOracle製品またはサード・パーティ・アプリケーションのインストールに使用されます。Oracle Linuxには、これらの追加リポジトリのプロビジョニングを処理するサプリメンタル・パッケージが用意されています。
Oracle Linux YUMサーバーでは、Oracleが提供する多数のリポジトリの詳細が提供されます。
-
これらの追加タスクを既存のプレイブックファイルに追加します。
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: Add the EPEL repository ansible.builtin.dnf: name: oracle-epel-release-el9 state: present when: - ansible_distribution == 'OracleLinux' - ansible_facts['distribution_major_version'] == '9' - 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' - name: Install the htop utility package ansible.builtin.dnf: name: htop enablerepo: ol9_developer_EPEL state: present when: - ansible_distribution == 'OracleLinux' - ansible_facts['distribution_major_version'] == '9' EOF
このプレイブックは、定義されたプレイ内に複数のタスクを追加します。最初のセットでは、EPELリポジトリがOracle Linuxインスタンスの既存のソフトウェア・リポジトリに追加されます。一方、2番目の再生セットでは、同じターゲットホストインスタンスに htopパッケージがインストールされます。
注目すべきパラメータ:
state: present
: 参照されるパッケージがすでにシステム上にあるか、dnf
を使用してインストールされていることを確認します。enablerepo
: 現在のタスクの期間中のみ、特定のリポジトリ(無効の場合)を有効にします。
-
プレイブックを再実行して、追加のタスクを実行します。
ansible-playbook -i inventory setup.yml -u opc
プレイブックが正常に終了し、実行中にいくつかの警告が表示されます。これらの警告は現在のプレイブックに影響しないため、今のところ無視できます。プレイブックは、「OK」または「変更済」ステータスで正しく完了したタスクをレポートします。changedステータスは、プレイブックが htopパッケージを追加するか、パッケージの最新バージョンを要求するときにdnfキャッシュを更新することによってホストを変更したことを示します。存在するかどうかをチェックするだけではありません。okはタスクの完了を示し、アクションは必要ありません。
-
リポジトリおよびパッケージのインストールを確認します。
ssh oracle@$REMOTE which htop
-
htop
コマンドを実行します。ssh oracle@$REMOTE -t htop
htopには対話型シェルが必要であるため、SSHコマンドの
-t
オプションはTTY割り当てを強制します。 -
q
と入力して、htopプログラムを終了します。
ファイルおよびディレクトリの追加、更新および削除
-
次のファイルを既存のプレイブックファイルに追加して、ディレクトリとファイルを作成します。
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モジュールでは、absent、directory、file、hard、linkおよび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ユーザーとして実行され、そのユーザーのデフォルトを継承します。
-
プレイブックを実行して、追加のタスクを実行します。
ansible-playbook -i inventory setup.yml -u opc
-
リモートホストに新しいディレクトリとファイルが存在することを確認します。
ssh oracle@$REMOTE ls -al example
出力によって、新しいディレクトリと空のファイルが作成されることが確認されます。test.txtファイルには0バイトがあり、oracleユーザーがそのファイルを所有していることに注意してください。
-
複数のファイルを追加します。
システム設定中に、ディレクトリ内に複数のファイルを作成する必要がある場合があります。個々のタスクを使用するかわりに、1つのディレクトリに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つのファイル名のみを使用していますが、必要に応じてリストを作成できます。
-
プレイブックを実行して、追加のタスクを実行します。
ansible-playbook -i inventory setup.yml -u opc
-
リモートホストに新しいディレクトリとファイルが存在することを確認します。
ssh oracle@$REMOTE ls -al example
出力には、元の test.txtファイルと新しいファイルが表示されます。
-
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 an additional test. 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出力の特定の部分に出力を制限する方法を示しています。
-
-
プレイブックを実行して、追加のタスクを実行します。
ansible-playbook -i inventory setup.yml -u opc
プレイブックの最後のタスクは、debugモジュールを使用してファイルの内容を出力します。
-
ファイルに複数のコンテンツ行を追加します。
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
-
プレイブックを実行して、追加のタスクを実行します。
ansible-playbook -i inventory setup.yml -u opc
-
ファイルに新しい行が2つ存在することを確認します。
ssh oracle@$REMOTE cat example/test.txt
出力には、追加されたコンテンツが表示され、実行時にリモート・ホストに対してプレイブックによって行われた自動ファクト収集に基づいて、タスクの変数値が解釈されます。
-
新しいファイルの作成、およびコンテンツの追加を確認します。
ssh oracle@$REMOTE cat example/testing.txt
-
ファイルおよびディレクトリを削除します。
Oracle Linux Automation Engineでは、ファイルおよびディレクトリの作成およびテキストの追加に加えて、これらの項目を削除することもできます。ディレクトリと、このプレイブックが作成するすべてのファイルを削除して、システムを起動したときと同じ状態にします。これらのタスクでは、まず state:パラメータを absentに設定して、ファイルのリストを削除してからディレクトリを削除します。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番目のタスクがより効率的です。
-
プレイブックを実行して、追加のタスクを実行します。
ansible-playbook -i inventory setup.yml -u opc
-
指定したディレクトリの削除を確認します。
ssh oracle@$REMOTE ls
出力がないと、このチュートリアルで作成した指定したディレクトリとファイルが存在しないことが確認されます。
次のステップ
コースのここまで何かとかきました。このチュートリアルでは、Oracle Linux Automation Engineが、パッケージのインストール、ファイルおよびディレクトリの作成、更新および削除、Oracle Linuxへのユーザー・アカウントの追加など、Oracle Linuxでのルーチン・タスクの自動化を可能にするいくつかの方法を紹介しました。また、プレイブックの実行中に、Oracle Linux Automation Engineのansible.builtin.debug
モジュールを使用して端末に情報を表示する方法も示しました。これらのスキルにより、先に進み、プレイブックを書くことができます。
関連リンク
- Oracle Linux Automation Managerドキュメント
- Oracle Linux Automation Managerトレーニング
- Oracle Linuxトレーニング・ステーション
その他の学習リソース
docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Run Oracle Linux Tasks with Oracle Linux Automation Engine
F49887-06
Copyright ©2021, Oracle and/or its affiliates.