Ansible は、オーケストレーション、構成管理、展開、プロビジョニングなどの分野で使用される自動化プラットフォームです。ansibleを学びたい初心者、またはansible認定の取得を計画している人の場合は、ansibleを実践するためのホームラボのセットアップが必要です。 。ホームラボを手動で設定するのは時間のかかる作業です。 Dockerのような自動化されたソリューションがいくつかあります 、 Vagrant 、ansibleラボの構築に使用できるクラウドソリューション。このガイドでは、LinuxでVagrantとVirtualBoxを使用してAnsibleラボをセットアップする自動化された方法を学習します。
Vagrantは、開発環境をすばやくセットアップするための優れたツールです。 Vagrantを初めて使用する場合は、Vagrantガイドの概要をご覧になることをお勧めします。
- Vagrantチュートリアル-LinuxでVagrantを使い始める
このガイドでは、VagrantとVirtualBoxをプロバイダーとして使用して、Ansibleラボを構築します。 VirtualBoxの代わりにKVMを使用することもできます。 KVMをプロバイダーとして使用する場合は、KVMでvagrantを使用する方法について以下の記事を参照してください。
- LibvirtKVMプロバイダーでVagrantを使用する方法
Ansibleラボのセットアップ
前提条件として、LinuxマシンにVagrantとVirtualboxがインストールされている必要があります。 Vagrantをまだインストールしていない場合は、次のガイドを参照して、さまざまなLinuxディストリビューションにVagrantをインストールしてください。
- LinuxにVagrantをインストールする方法
3ノードのansibleラボセットアップを構築します。 1つのノードがマスター/コントローラーノードとして機能し、2つのノードが管理対象ノードとして機能します。デモンストレーションの目的で、私は ubuntu / focus64を使用しています 放浪者ボックス。
これが私のAnsibleラボのセットアップの詳細です。
ノードタイプ | ノード名 | IPアドレス | OSフレーバー |
コントロールノード | controller.anslab.com | 192.168.10.3 | ubuntu / focus64 |
管理対象ノード | managed1.anslab.com | 192.168.10.4 | ubuntu / focus64 |
管理対象ノード | managed2.anslab.com | 192.168.10.5 | ubuntu / focus64 |
ここでは、ラボ用に3つのノードのみを設定していますが、独自のラボを設定するときに、必要な数の管理対象ノードを追加できます。
クローンプロジェクトリポジトリ
GitHubリポジトリでAnsibleラボをセットアップするために必要なすべてのファイルをホストしました。次のコマンドを実行して、リポジトリをローカルに複製します。
$ git clone --recursive https://github.com/KarthickSudhakar/Ansible_lab_vagrant_virtualbox.git
プロジェクトディレクトリ内を移動して、どのファイルが存在するかを確認しましょう。
各ファイルの概要を簡単に説明します。
1。 Vagrantfile
VMに関連するすべての構成がこのファイルに保存されます。このファイルの内容は次のとおりです。
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.provider "virtualbox" do |rs| rs.memory = 2048 rs.cpus = 2 end # Will not check for box updates during every startup. config.vm.box_check_update = false # Master node where ansible will be installed config.vm.define "controller" do |controller| controller.vm.box = "ubuntu/focal64" controller.vm.hostname = "controller.anslab.com" controller.vm.network "private_network", ip: "192.168.10.3" controller.vm.provision "shell", path: "bootstrap.sh" controller.vm.provision "file", source: "key_gen.sh", destination: "/home/vagrant/" end # Managed node 1. config.vm.define "m1" do |m1| m1.vm.box = "ubuntu/focal64" m1.vm.hostname = "managed1.anslab.com" m1.vm.network "private_network", ip: "192.168.10.4" m1.vm.provision "shell", path: "bootstrap.sh" end # Managed node 2. config.vm.define "m2" do |m2| m2.vm.box = "ubuntu/focal64" m2.vm.hostname = "managed2.anslab.com" m2.vm.network "private_network", ip: "192.168.10.5" m2.vm.provision "shell", path: "bootstrap.sh" end end
2。 bootstrap.sh
これは、コントローラーノードでのansibleのセットアップ、パッケージのインストール、システム構成の変更を担当するシェルスクリプトです。
このファイルの内容を以下に示します:
#!/usr/bin/env bash # vagrant by default creates its own keypair for all the machines. Password based authentication will be disabled by default and enabling it so password based auth can be done. sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config sudo systemctl restart sshd # Supressing the banner message everytime you connect to the vagrant box. touch /home/vagrant/.hushlogin # Updating the hosts file for all the 3 nodes with the IP given in vagrantfile # 192.168.10.3 controller.ansible.com controller # 192.168.10.4 managed1.ansible.com managed1 # 192.168.10.5 managed2.ansible.com managed2 echo -e "192.168.10.3 controller.anslab.com controller\n192.168.10.4 managed1.anslab.com managed1\n192.168.10.5 managed2.anslab.com managed2" >> /etc/hosts # Installing necessary packages sudo apt update && sudo apt -y install curl wget net-tools iputils-ping python3-pip sshpass # Install ansible using pip only in controller node if [[ $(hostname) = "controller" ]]; then sudo pip3 install ansible fi
3。 key_gen.sh
3つのVMビルドがすべて完了したら、このスクリプトを手動でトリガーする必要があります。このスクリプトは、sshキーペアの生成を処理し、3つのノードすべてに分散します。また、検証のためにサンプルのansibleアドホックコマンドを実行します。
このファイルの内容は次のとおりです。
#!/usr/bin/env bash # THIS SCRIPT WILL CREATE SSH KEYPAIR AND DISTRIBUTE ACROSS ALL NODES ssh-keygen -b 2048 -t rsa -f /home/vagrant/.ssh/id_rsa -q -N "" # LOOPING THROUGH AND DISTRIBUTING THE KEY for val in controller managed1 managed2; do echo "-------------------- COPYING KEY TO ${val^^} NODE ------------------------------" sshpass -p 'vagrant' ssh-copy-id -o "StrictHostKeyChecking=no" [email protected]$val done # CREATE THE INVENTORY FILE PROJECT_DIRECTORY="/home/vagrant/ansible_project/" mkdir -p $PROJECT_DIRECTORY cd $PROJECT_DIRECTORY # Creating the inventory file for all 3 nodes to run some adhoc command. echo -e "controller\n\n[ubuntu1]\nmanaged1\n\n[ubuntu2]\nmanaged2" > inventory echo -e "[defaults]\ninventory = inventory" > ansible.cfg echo -e "-------------------- RUNNING ANSBILE ADHOC COMMAND - UPTIME ------------------------------" echo # running adhoc command to see if everything is fine ansible all -i inventory -m "shell" -a "uptime" echo
これら3つのファイルはすべて、私のGitHubリポジトリでホストされています。気軽に貢献して改善してください。
Vagrantfile構成について
Ansibleラボを構築する前に、Vagrantfileとシェルスクリプト内の構成を理解する必要があります。
1。メモリとVcoreの割り当て
3つのvagrantボックスすべてについて、メモリとCPUの値を設定する必要があります。ここでは、メモリは 2GBに設定されています CPUは2に設定されています 。制限を増減したい場合は、Vagrantfileで強調表示されているパラメータを調整するだけです。
2。 OSフレーバー
3つのノード(コントローラーと管理対象)はすべて、Ubuntu20.04LTSイメージを使用します。したがって、「vagrant up
」を実行すると "コマンドvagrantは次のパラメータを探し、ローカルで利用できない場合はイメージをプルしようとします。
3。ネットワーク設定
デフォルトでは、vagrantは最初のインターフェース(adapter1)でNATを使用します。 Vagrantは、NATを介したポート転送を使用して仮想マシンに接続します。ここでは、プライベートネットワーク上の3つのVMすべてのホスト名と静的IPアドレスを設定しています。
別のインターフェース(Adapter2)が作成され、静的IPアドレスが割り当てられます。プライベートネットワークの一部であるVMは相互に通信できます。
マルチVM環境では、vagrantはポートの衝突を自動的に修正します。
==> m2: Fixed port collision for 22 => 2222. Now on port 2201. ==> m2: Clearing any previously set network interfaces... ==> m2: Preparing network interfaces based on configuration... m2: Adapter 1: nat m2: Adapter 2: hostonly ==> m2: Forwarding ports... m2: 22 (guest) => 2201 (host) (adapter 1) ==> m2: Running 'pre-boot' VM customizations... ==> m2: Booting VM... ==> m2: Waiting for machine to boot. This may take a few minutes... m2: SSH address: 127.0.0.1:2201
4。ユーザー名とSSH通信
パスワード「vagrant」を持つ「vagrant」というデフォルトのユーザーがいます。 Vagrantユーザーには、デフォルトでvmにパスワードなしのsudo権限が設定されています。
デフォルトでは、パスワードベースの認証はVMに対して無効になっています。 「vagrant ssh
」を実行すると、Vagrantはsshキーのペアを作成し、秘密キーを使用してvmに接続します。 "コマンド。
$ vagrant ssh controller
$ vagrant ssh m1
$ vagrant ssh m2
パスワードベースの認証は、bootstrap.sh
を介して有効になります ファイルを使用して、キーベースの認証の代わりにIPアドレスとパスワードベースの認証を使用してノードに接続できるようにします。
5。ブートストラップスクリプト
スクリプトbootstrap.shが責任を負います
- パスワードベースの認証を有効にします。
-
.huhlogin
を作成します デフォルトのバナーメッセージを抑制するファイル。 -
/etc/hosts
にホストエントリを追加します 3つのノードすべてのファイル。 - 必要なパッケージをインストールします。
- pythonパッケージマネージャー(pip)を介してansibleをコントローラーノードにのみインストールします。
bootstrap.shが/tmp/
にコピーされるシェルプロビジョナーを使用しています 3つのVMすべての場所とスクリプトはroot権限で実行されます。
ヘッズアップ: RHELベースのラボを構築している場合は、bootstrap.sh
からパッケージインストールコマンドを編集する必要があります。 dnf
に従ったファイル またはrpm
。残りはすべて、すべてのディストリビューションで同様になります。
6。キーペアを生成する
AnsibleはSSHキーペアを使用して、管理対象ノードと通信し、タスクを実行します。新しいキーはコントローラーノードから生成され、すべての管理対象ノードと共有される必要があります。これにより、ansibleは毎回パスワードを要求せずに管理対象ノードと通信できます。
スクリプトkey_gen.sh
sshキーの作成と、すべてのノードへのキーの配布を処理します。スクリプトは、ansible.cfg
を使用してプロジェクトディレクトリも作成します ファイルとインベントリファイル。 アドホック コマンドは、接続を検証するためのスクリプトの一部としてトリガーされます。
ヘッズアップ: このスクリプトは、3つのVMがすべてプロビジョニングされたら、コントローラーノードから手動でトリガーする必要があります。
AnsibleLabセットアップの構築
プロジェクトディレクトリに移動して「vagrantup」コマンドを実行すると、残りはvagrantとブートストラップスクリプトによって処理されます。
$ cd Ansible_lab_vagrant_virtualbox
$ vagrant up
出力例:
Bringing machine 'controller' up with 'virtualbox' provider…
Bringing machine 'm1' up with 'virtualbox' provider…
Bringing machine 'm2' up with 'virtualbox' provider…
………
インストール後のスクリプト
3つのVMがすべてプロビジョニングされたら、コントローラーノードにログインして/home/vagrant/key_gen.sh
を実行します。 sshキーのペアを作成し、ansibleアドホックコマンドを実行して検証します。
$ vagrant ssh controller
$ cd /home/vagrant/
$ bash key_gen.sh
VMを管理するためのVagrantコマンド
次のコマンドは、放浪者のマシンのライフサイクルを維持するのに役立ちます。
仮想マシンの構築を開始するには、vagrantfileが配置されているディレクトリから次のコマンドを実行します。
$ vagrant up
1つのノードのみを起動する場合は、ホスト名を「vagrant up
」に追加できます。 "コマンド。
$ vagrant up controller
マシンの状態を確認するには、次のコマンドを実行します。
$ vagrant status Current machine states: controller running (virtualbox) m1 running (virtualbox) m2 running (virtualbox)
次のコマンドを使用して、VMに関する詳細情報を取得することもできます。
$ vagrant global-status --prune name provider state directory --------------------------------------------------------------------------------------------------------------------- 6095cc7 controller virtualbox running /home/karthick/Karthick_Root/Work/Vagrant/Lab/Ansible_lab_vagrant_virtualbox cf2e302 m1 virtualbox running /home/karthick/Karthick_Root/Work/Vagrant/Lab/Ansible_lab_vagrant_virtualbox af10f7d m2 virtualbox running /home/karthick/Karthick_Root/Work/Vagrant/Lab/Ansible_lab_vagrant_virtualbox
仮想マシンに接続するには、「vagrant ssh
」を実行できます "コマンド。vm名を渡す必要があります。渡さないと、次のエラーがスローされます。
$ vagrant ssh
This command requires a specific VM name to target in a multi-VM environment.
m1 VMにSSHで接続するには、コマンドは次のようになります。
$ vagrant ssh m1
または、
$ vagrant ssh cf2e302
パスワードベースの認証が有効になっている場合は、ユーザー名とパスワードを使用して接続することもできます。
$ ssh [email protected]
[email protected]'s password:
[email protected]:~$
特定の仮想マシンを停止するには、vm名を指定してhaltコマンドを実行します。
$ vagrant halt controller
すべての仮想マシンを停止するには、次のコマンドを実行します。
$ vagrant halt
==> m2: Attempting graceful shutdown of VM…
==> m1: Attempting graceful shutdown of VM…
==> controller: Attempting graceful shutdown of VM…
ディスクを含むすべてのVMを破棄するには、次のコマンドを実行します。
$ vagrant destroy -f
==> m2: Destroying VM and associated drives…
==> m1: Destroying VM and associated drives…
==> controller: Destroying VM and associated drives…
結論
この記事では、VagrantとVirtualBoxを使用してansibleラボをセットアップする自動化された方法を示しました。ラボはUbuntu20.04LTSスタックで作成されています。
Ansible認定を取得することを計画していて、ラボで練習したい場合は、ボックス名をRHELフレーバーにポイントするvagrantfileを編集し、apt
を置き換えることをお勧めします。 適切なdnf
へのコマンド / yum
bootstrap.sh
のコマンド ファイル。
次を読む:
- Ansibleインベントリおよび構成ファイル