Ansibleのコントロールノードを構築し、ターゲットノードにコマンドを実行するまでの手順を解説します。
Linux初心者でも再現できるように、構成・設定・確認方法をまとめてみました。
Ansibleの全体像
処理の指示を出すコントロールノードから、処理の対象となるターゲットノードにSSH経由でタスクを送信します。コントロールノードにAnsibleをインストールし、インベントリとプレイブックの2つのファイルを用意するだけで動作します。
Ansibleのコマンドは以下の書式で実行します。
$ ansible-playbook -i <インベントリ> <プレイブック>
$ ansible-playbook -i inventory.ini playbook.yml
インベントリはターゲットノードのリストファイルで、
プレイブックはターゲットノードに実行したい処理を記載したファイルです。
Ansibleの実行処理
Ansibleは内部で以下の実行処理が行われています。
- インベントリの中からホストパターンに合ったターゲットをリストアップ
- コントロールノードでプレイブックを"Python"の実行コードに変換
- コントロールノードからターゲットノードにSSH接続を確立し、Pythonの実行コードをターゲットノードにsftpで送信
- ターゲットノード側でPythonを実行する
ここで、ターゲットノードには以下の設定が必要になります。
- Pythonの実行環境
- タスクを実行する権限をもつユーザ
Ansibleのインストール
コントロールノードの利用要件は、以下のポイントを押さえると良いでしょう。
OS:Linux系が推奨。Macも可。Windowsは非推奨。
Python:3.9以上が推奨。
Ansible本体:pipまたはOSのパッケージマネージャーでインストール
SSHクライアント:ターゲットノードへの接続に使用。OpenSSHが一般的
メモリ/CPU:最低限は、vCPU: 2コア、メモリ: 4GB、ディスク: 30GB
私はvirtualbox上で構築しました。実際に以下の要領で構築しました。
1.AlmaLinuxを選択
vCPU: 2コア、メモリ: 4GB、ディスク: 30GBで構成
2.SSHクライアントのインストール
sudo dnf install -y openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
ついでに、必要であれば作業端末からこのサーバにSSH接続して操作できるように、以下設定もしておきます。この手順はターゲットノードでansible用のゲストユーザを作成するときにも必要になります。
①ゲストユーザの作成
sshでルートではなくゲストユーザでログインしたいので、ゲストユーザを作成しておきます。
sudo useradd -m guestuser # -mでホームディレクトリを自動作成
sudo passwd guestuser # guestuserのログイン用パスワードを設定
getent passwd # guestuserが作成されているか確認
②sshd_configの確認と編集
編集する前にバックアップを取ってから編集しましょう。
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo vi /etc/ssh/sshd_config
以下の項目を確認します。コメントアウトを外すか追記します。
PermitRootLogin no
PasswordAuthentication yes
AllowUsers guestuser # デフォルトでは記述されていない場合はファイル末尾などに追記
Port 22
③sshpassのインストール
SSH接続のパスワード認証では、対話的にパスワードを入力しますが、Ansibleでパスワード認証を使う場合は、パスワードを一文に埋め込んで非対話的に接続できるようにする必要があります。
sshpassを使うことでパスワードを一文にまとめて渡すことができます。
sudo dnf install -y sshpass
④sshdのサービス再起動
設定が終わったら構文チェックをして、問題なければサービスを再起動しましょう。
sudo sshd -t
sudo systemctl restart sshd
3.Pythonのインストール
Pythonのインストールに進みます。
sudo dnf -y update
sudo dnf -y install python3 python3-pip python3-virtualenv git jq sshpass
python3 -m venv /opt/ansible
source /opt/ansible/bin/activate
pip install --upgrade pip wheel setuptools
コマンドを解説します。
-
sudo dnf -y update
既存システムのパッケージを最新状態に更新する。(これからインストールするツールの依存ライブラリが不足しないようにとか、脆弱性が残らないようにとか、諸々の理由) -
sudo dnf -y install python3 python3-pip python3-virtualenv git jq sshpass
Ansible運用に必要なツール群を一括インストール-
python3:Ansibleの動作に必須 -
python3-pip:Pythonパッケージ管理 -
python3-virtualenv:仮想環境を構築して実行環境を分離・管理
※Python3.3以降は標準ライブラリとしてvenvが含まれるため追加インストール不要。 -
git:コード管理やAnsibleリポジトリ取得 -
jp:JSON整形・抽出 -
sshpass:パスワード認証の自動化用コマンドラインツール
-
-
python3 -m venv /opt/ansible
Python仮想環境を/opt/ansibleに構築 -
source /opt/ansible/bin/activate
仮想環境をアクティベート(有効化) -
pip install --upgrade pip wheel setuptools
Pythonパッケージ管理ツールのアップグレード
4.Ansibleのインストール
ここから、Ansibleをインストールします。
Ansibleのインストール方法には、Pythonのパッケージマネージャ(pip)でインストールする方法とOSのパッケージマネージャ(dnf/yum)でインストールする方法の2種類あります。
基本的にはpipでインストールした方が良いでしょう。理由は大きく2つあります。
- Ansibleのバージョンが最新のものが入る
- Python仮想環境に対応している
先ほどの"source /opt/ansible/bin/activate"コマンドで、仮想環境をアクティベート化した状態で、以下コマンドを投入します。
# Ansibleのインストール
pip install ansible
# インストール確認
ansible --version
無事にインストールされていれば、ansibleのバージョンが表示されます。
これでインストールは完了です。
5.ターゲットノードの準備
ターゲットノードの設定もしておきます。
必要な設定は大きく2つあります。
- Ansible運用ユーザーの作成
対象サーバーにAnsible実行専用ユーザーを作成します。
一般ユーザ権限で作成し、特権ユーザ権限が必要なタスクを実行する場合、一時的に特権を与えるのがよいでしょう。
ansibleuserというユーザを作成していきます。
# ansibleuserを作成
sudo useradd -m ansibleuser
sudo passwd ansibleuser
# sudo権限を与える
echo 'ansibleuser ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/ansibleuser
# 構文チェック
visudo -cf /etc/sudoers.d/ansibleuser
- SSH接続の設定
作成したansibleuserでssh接続できるようにします。
# ファイル編集
sudo vi /etc/ssh/sshd_config
# SSH接続を許可するユーザー(Ansible用含む)
AllowUsers ansibleuser
# 構文チェックと再起動
sudo sshd -t
sudo systemctl restart sshd
Ansibleの動作確認
Ansibleを利用する前に、事前に以下の設定をしておいた方がよいでしょう。
- 作業ディレクトリの作成
仮想環境にプレイブックを配置するディレクトリを作成します。
mkdir -p /opt/ansible/workspace
ついでに、ログ出力先のディレクトリも作成しておきましょう。
mkdir -p /opt/ansible/workspace/logs
- ansible.cfgの設定
ansible.cfgはAnsibleの動作を細かく制御するための設定ファイルです。
OSのパッケージマネージャでインストールした場合、設定ファイルは/etc/ansible/ディレクトリ配下に配備させますが、pipでインストールした場合は設定ファイルが存在しません。
設定ファイルが存在しない場合は先ほど作った作業ディレクトリに作成しましょう。
cd /opt/ansible/workspace
touch ansible.cfg
いろいろ制御できますが、私は以下内容を設定しました。
[defaults]
inventory = /opt/ansible/workspace/inventory.ini
log_path = /opt/ansible/workspace/logs/ansible.log
host_key_checking = False
retry_files_enabled = False
timeout = 10
[ssh_connection]
pipelining = True
-
inventory = ./inventory.ini
インベントリファイルの場所を指定 -
log_path = /opt/ansible/workspace/logs/ansible.log
ログ出力先を指定 -
host_key_checking = False
SSH初回接続時の「yes/no」確認を無効化 -
retry_files_enabled = False
リトライファイルの生成を無効化 -
timeout = 10
SSH接続のタイムアウト秒数 -
pipelining = True
SSH接続のパイプライン処理を有効化
設定したら、ansible --versionコマンドで設定が正しく読み込まれているか確認しましょう。
config file = /opt/ansible/workspace/ansible.cfgと表示されれば成功です。
Ansibleコマンドの実行
まずは、先ほど作成した作業ディレクトリにインベントリファイルを配置します。
cd /opt/ansible/workspace
touch inventory.ini
inventory.iniというインベントリファイルに、ターゲットノードの情報を記載していきます。
[localhost]はコントロールノード自身
[test_server]はターゲットノードの情報を記載します。ご自身の環境に合わせてIPアドレスを記載してください。
[localhost]
localhost ansible_connection=local # コントロールノード自身
[test_servers]
192.168.0.10 ansible_user=ansibleuser ansible_ssh_pass="Ansibleuserを作成した時のパスワード" ansible_become=true
次に、ターゲットノードにAnsibleコマンドを実行します。
Ansibleコマンドは、プレイブックを用意せずに直接モジュールを指定するコマンドです。
Ansibleには標準で多数のモジュールが組み込まれているので、さまざまなAnsibleコマンドを実行できます。
Ansibleコマンドの基本書式は以下のとおりです。
ansible <ホストパターン> -m <モジュール名> -a "<モジュール引数>" -i <インベントリファイル>
実際に、"source /opt/ansible/bin/activate"コマンドで、仮想環境をアクティベート化した状態で、自分自身にpingモジュールでコマンドを投入してみましょう。
ansible localhost -m ping
すると、以下のような結果が表示されると思います。
localhost | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
冒頭に、"localhost | SUCCESS"と表示されれば、接続に成功しています。
次に、ターゲットノードに対してもコマンドを実行してみます。
ansible 192.168.0.10 -m ping
同様に、"localhost | SUCCESS"と表示されれば、接続に成功しています。
これで、Ansibleでコマンドを実行することができました。
プレイブックを使ったコマンド実行
Ansibleでは、"プレイブック"と呼ばれるファイルを使って、決まった処理をひとまとめにして、ターゲットノードに実行させることができます。
Ansibleの本領ともいえる部分ですが、こちらの内容は別の記事でまとめたいと思います。