How to Use SSH Password-Based Login in Ansible Using sshpass

この記事では、sshpassによるSSHパスワードベースのログインを使ってAnsibleプレイブックを実行する方法を紹介します。

前提条件

この記事で説明する例を試してみたい場合、

1) Ansible がコンピューターにインストールされている必要があります。
2) Ansible から接続できる Ubuntu/Debian ホストが少なくともある必要があります。

また、Ansible がインストールされているコンピュータに sshpass をインストールする必要があります。 この記事では、Ubuntu/Debian および CentOS/RHEL に sshpass をインストールする方法を説明します。 これらのプログラムがシステムにまだインストールされていなくても心配しないでください。

Ubuntu/Debian に sshpass をインストールする

プログラム sshpass は Ubuntu/Debian の公式パッケージリポジトリで利用可能です。 このプログラムは簡単にコンピュータにインストールすることができます。

まず、次のコマンドで APT パッケージリポジトリのキャッシュを更新します:

$ sudo apt update

次に、次のコマンドで sshpass をインストールします:

$ sudo apt install sshpass -y

これで sshpass がインストールされているはずです。

CentOS8/RHEL8でのsshpassのインストール

sshpass はCentOS 8/RHEL 8のEPELリポジトリで利用可能です。 sshpassをインストールするには、EPELレポジトリを有効にする必要があります。

まず、以下のコマンドでDNFパッケージのリポジトリキャッシュを更新します:

$ sudo dnf makecache

次に、以下のコマンドでEPELのリポジトリパッケージをインストールします。

$ sudo dnf install epel-release -y

これでEPELリポジトリパッケージがインストールされてEPELリポジトリが有効になったはずです。

以下のように、DNF パッケージのリポジトリキャッシュを再度更新します:

$ sudo dnf makecache

以下のコマンドで、sshpass をインストールします。

$ sudo dnf install sshpass -y

sshpass がインストールされているはずです。

Set Up an Ansible Project Directory

先に進む前に、プロジェクト ディレクトリ構造を作成し、少し整理しておくとよいでしょう。

プロジェクト ディレクトリ sshpass/ およびすべての必要なサブディレクトリを作成するには (現在の作業ディレクトリに)、次のコマンドを実行します:

$ mkdir -pv sshpass/{files,playbooks}…

以下のように、プロジェクトディレクトリに移動します。

$ cd sshpass/

以下のようにホスト目録ファイルを作成します。

$ nano hosts

インベントリファイルにホストIPまたはDNS名を追加してください。

この手順を終えたら、<Ctrl> + X、次にY、<Enter>でファイルを保存します。

プロジェクトディレクトリに次のようにAnsible設定ファイルを作成します:

$ nano ansible.cfg

ここで、ansible.cfg ファイルに次の行を入力します。

この手順を終えたら、<Ctrl> + X、次にY、<Enter>を押してファイルを保存してください。

Testing Password-Based SSH Login in Ansible

次に、次のように、インベントリ ファイル内のホストを ping してみます。

$ ansible all -u shovon -m ping

注: ここで -u オプションは ansible に対してどのユーザとしてログインするのか伝えるために使用します。 この場合、ユーザーshovonとなります。 このユーザー名を、今後、デモ全体を通じて、あなたのユーザー名に置き換えてください。

おわかりのように、ホストにログインしてコマンドを実行することができません。

Ansible にユーザー パスワードを要求させるには、次のように -ask-pass 引数を指定して ansible コマンドを実行します。

$ ansible all -u shovon –ask-pass -m ping

見てわかるように、Ansible はユーザーの SSH パスワードを求めています。 ここで、SSHパスワード(ユーザーのログインパスワード)を入力し、<Enter>を押します。

以下のように、ホストにpingを送信できます。

Ansible PlaybooksのパスワードベースのSSHログイン

Ansibleプレイブック実行時にパスワードベースのSSHログインが使用可能です。 例を見てみましょう。

まず、次のように playbooks/ ディレクトリに新しい playbook askpass1.yaml を作成します:

$ nano playbooks/askpass1.yaml

askpass1 に次の行をタイプしてください。yaml playbook file:

– hosts: all
user: shovon
tasks:
– name: Ping all hosts
ping:
– name: Print a message
debug:
msg: ‘All set’

この手順が終わったら、<Ctrl> + X、次にY、<Enter>を押してファイルを保存してください。

askpass1.yaml playbook を次のように実行します。

$ ansible-playbook playbooks/askpass1.yaml

ご覧のように、ホストへの接続はできていないことが分かります。 これは、ansible-playbook コマンドを -ask-pass オプション付きで実行しなかったためであることがわかります。

askpass1.playbookを実行します。yaml playbook を -ask-pass オプション付きで次のように実行します:

$ ansible-playbook -ask-pass playbooks/askpass1.yaml

見ての通り、Ansible は SSH パスワードを求めています。 SSH パスワードを入力して <Enter> を押します。

playbook askpass1.yaml はこれで正常に実行されます。

Ansible sudo Password Login for Playbooks

-ask-pass オプションは SSH ログイン パスワードだけを尋ねるようになっています。 sudo パスワードも入力したい場合はどうすればよいでしょうか。

まず、次のように playbooks/ ディレクトリに新しい playbook askpass2.yaml を作成します:

$ nano playbooks/askpass2.yaml

以下の行を askpass2.yaml ファイルに入力します。

– hosts: all
user: shovon
become: True
tasks:
– name: Install apache2 Package
apt:
name: apache2
state: latest
– name: Make sure apache2 service is running
service:
name: apache2
state: started
enabled.Backet:
name: apache2のインストールを開始します。 True
– name: サーバーに index.html ファイルをコピーする
copy:
src: ../files/index.html
dest: /var/www/html/index.html
mode: 0644
owner: www-data
group: www-data

ここで、コマンド become を使用しています。 True を使用して、Ansible に sudo 権限でこの playbook を実行するように指示します。 この手順が終了したら、<Ctrl> + X、次に Y、<Enter> を押して askpass2.yaml ファイルを保存します。

インデックスを作成し、そのインデックスにアクセスします。

$ nano files/index.html

index.htmlファイルに次のHTMLコードを入力します:

< !DOCTYPE html>
<html>
<head>
<title>Homepage</title>
</head>
<body>
<h1>Hello World</h1>
<p>It works</p>
</body>
</html>

<3234>この手順が終了しましたら、次に進みます。 <Ctrl> + X、Y、<Enter>でファイルを保存します。

askpass2.yaml playbook を以下のように -ask-pass オプションを付けて実行することができます。yaml

すると、先ほどと同様に SSH パスワードを尋ねられます。

しかし、SSH パスワードを提供してもプレイブックはまだ実行しないかもしれません。 この理由は、SSH パスワードと同様に sudo パスワードを求めるように Ansible に指示しなければならないからです。

次のように、playbook の実行中に -ask-become-pass オプションを使用して sudo パスワードを求めるように Ansible に指示できます:

$ ansible-playbook –ask-pass –ask-become-pass playbooks/askpass2.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXXyaml

ここで、Ansible は SSH パスワードを要求します。

次に、Ansible は sudo パスワードを要求してきます。 sudo パスワードが SSH パスワードと同じである場合 (ほとんどの場合)、空白のまま <Enter> を押します。

ご覧のとおり、プレイブックは正常に実行されています。

パスワード ベースの SSH ログインと sudo パスワード ログインの自動設定

パスワード ベースの SSH と sudo ログインを使用したいが、playbook を実行するたびに SSH パスワードと sudo パスワードを入力するのは嫌な場合があるかもしれません。

パスワード ベースの SSH ログインと sudo ログインをパスワードのプロンプトなしで使用するには、インベントリ ファイルに ansible_ssh_pass と ansible_become_pass のホスト変数またはグループ変数を追加するだけでよいのです。

最初に、次のように hosts インベントリ ファイルを開きます。

$ nano hosts

インベントリ ファイルに複数のホストがあり、各ホストが異なるパスワードを持つ場合、次のように ansible_ssh_pass と ansible_become_pass をホスト変数として追加(それぞれのホスト以降)してください。

必ず secret を SSH および sudo パスワードに置き換えてください。

すべてまたは一部のホストが同じパスワードを持つ場合、以下の例のように ansible_ssh_pass と ansible_become_pass 変数をグループ変数として追加できます。

ここでは、ホストが 1 台しかないので、all グループ (インベントリ ファイル内のすべてのホスト) に対して ansible_ssh_pass と ansible_become_pass 変数を追加しています。

hosts inventory ファイルに ansible_ssh_pass および ansible_become_pass 変数を追加し終えたら、<Ctrl> + X、次に Y、<Enter> で hosts inventory ファイルを保存してください。yaml playbook を次のように実行します。

$ ansible-playbook playbooks/askpass2.yaml

このように、SSH パスワードや sudo パスワードは聞かれませんでしたが、playbook は正常に実行できました。

Ansible でパスワードベースの SSH と sudo ログインに sshpass を使用するにはこのようにすればよいでしょう。 この記事を読んでいただきありがとうございました!。