ノート:
- このチュートリアルは、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" use_olae_only: true EOF
-
演習環境をデプロイします。
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ディレクティブは変数を含む外部ファイルを含みます。開発者は、プレイブックを実行する前にシステム構成を定義するこの例のように、これらの変数を別のプレイから動的にまたは静的に作成できます。
-
新しいターミナルを開き、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ホスト・システムに接続します。
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: 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
: 現在のタスクの期間中のみ、特定のリポジトリ(無効の場合)を有効にします。
-
プレイブックを再実行して、追加のタスクを実行します。
ansible-playbook -i inventory setup.yml -u opc
プレイブックが正常に終了し、無視できるいくつかの警告が表示されます。プレイブックは、適切に完了したタスクを okまたは changedステータスで報告します。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つのディレクトリにアトミック操作として複数のファイルを作成できます。
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 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出力の特定の部分のみに出力を制限する方法を示しています。
-
-
プレイブックを実行して、追加のタスクを実行します。
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では、ファイルおよびディレクトリの作成およびテキストの追加に加えて、これらの項目も削除できます。このプレイブックが作成したディレクトリとすべてのファイルを削除し、システムを起動したときと同じ状態のままにします。これらのタスクでは、最初に 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番目のタスクの方が効率的です。
-
プレイブックを実行して、追加のタスクを実行します。
ansible-playbook -i inventory setup.yml -u opc
-
指定したディレクトリの削除を確認します。
ssh oracle@$REMOTE ls
出力不足により、指定されたディレクトリと、このチュートリアル中に作成されたファイルが消失したことが確認されます。
次のステップ
ここまでやってきました。このチュートリアルでは、パッケージのインストール、ファイルおよびディレクトリの作成、更新および削除、Oracle Linuxへのユーザー・アカウントの追加など、自動化によって、Oracle Linux Automation EngineがOracle Linuxでルーチン・タスクを実行できるいくつかの方法を紹介しました。また、Oracle Linux Automation Engineのansible.builtin.debug
モジュールを使用して、Playbookの実行中に情報を端末に戻す方法も示しました。これらのスキルにより、前向きに冒険し、独自のプレイブックを書くことができます。
関連リンク
- 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-05
Copyright ©2021, Oracle and/or its affiliates.