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 パッケージリポジトリのキャッシュを更新します:
次に、次のコマンドで sshpass をインストールします:
これで sshpass がインストールされているはずです。
CentOS8/RHEL8でのsshpassのインストール
sshpass はCentOS 8/RHEL 8のEPELリポジトリで利用可能です。 sshpassをインストールするには、EPELレポジトリを有効にする必要があります。
まず、以下のコマンドでDNFパッケージのリポジトリキャッシュを更新します:
次に、以下のコマンドでEPELのリポジトリパッケージをインストールします。
これでEPELリポジトリパッケージがインストールされてEPELリポジトリが有効になったはずです。
以下のように、DNF パッケージのリポジトリキャッシュを再度更新します:
以下のコマンドで、sshpass をインストールします。
sshpass がインストールされているはずです。
Set Up an Ansible Project Directory
先に進む前に、プロジェクト ディレクトリ構造を作成し、少し整理しておくとよいでしょう。
プロジェクト ディレクトリ sshpass/ およびすべての必要なサブディレクトリを作成するには (現在の作業ディレクトリに)、次のコマンドを実行します:
以下のように、プロジェクトディレクトリに移動します。
以下のようにホスト目録ファイルを作成します。
インベントリファイルにホストIPまたはDNS名を追加してください。
この手順を終えたら、<Ctrl> + X、次にY、<Enter>でファイルを保存します。
プロジェクトディレクトリに次のようにAnsible設定ファイルを作成します:
ここで、ansible.cfg ファイルに次の行を入力します。
この手順を終えたら、<Ctrl> + X、次にY、<Enter>を押してファイルを保存してください。
Testing Password-Based SSH Login in Ansible
次に、次のように、インベントリ ファイル内のホストを ping してみます。
注: ここで -u オプションは ansible に対してどのユーザとしてログインするのか伝えるために使用します。 この場合、ユーザーshovonとなります。 このユーザー名を、今後、デモ全体を通じて、あなたのユーザー名に置き換えてください。
おわかりのように、ホストにログインしてコマンドを実行することができません。
Ansible にユーザー パスワードを要求させるには、次のように -ask-pass 引数を指定して ansible コマンドを実行します。
見てわかるように、Ansible はユーザーの SSH パスワードを求めています。 ここで、SSHパスワード(ユーザーのログインパスワード)を入力し、<Enter>を押します。
以下のように、ホストにpingを送信できます。
Ansible PlaybooksのパスワードベースのSSHログイン
Ansibleプレイブック実行時にパスワードベースのSSHログインが使用可能です。 例を見てみましょう。
まず、次のように playbooks/ ディレクトリに新しい playbook askpass1.yaml を作成します:
askpass1 に次の行をタイプしてください。yaml playbook file:
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 コマンドを -ask-pass オプション付きで実行しなかったためであることがわかります。
askpass1.playbookを実行します。yaml playbook を -ask-pass オプション付きで次のように実行します:
見ての通り、Ansible は SSH パスワードを求めています。 SSH パスワードを入力して <Enter> を押します。
playbook askpass1.yaml はこれで正常に実行されます。
Ansible sudo Password Login for Playbooks
-ask-pass オプションは SSH ログイン パスワードだけを尋ねるようになっています。 sudo パスワードも入力したい場合はどうすればよいでしょうか。
まず、次のように playbooks/ ディレクトリに新しい playbook askpass2.yaml を作成します:
以下の行を askpass2.yaml ファイルに入力します。
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 ファイルを保存します。
インデックスを作成し、そのインデックスにアクセスします。
index.htmlファイルに次の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 は SSH パスワードを要求します。
次に、Ansible は sudo パスワードを要求してきます。 sudo パスワードが SSH パスワードと同じである場合 (ほとんどの場合)、空白のまま <Enter> を押します。
ご覧のとおり、プレイブックは正常に実行されています。
パスワード ベースの SSH ログインと sudo パスワード ログインの自動設定
パスワード ベースの SSH と sudo ログインを使用したいが、playbook を実行するたびに SSH パスワードと sudo パスワードを入力するのは嫌な場合があるかもしれません。
パスワード ベースの SSH ログインと sudo ログインをパスワードのプロンプトなしで使用するには、インベントリ ファイルに ansible_ssh_pass と ansible_become_pass のホスト変数またはグループ変数を追加するだけでよいのです。
最初に、次のように 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 を次のように実行します。
このように、SSH パスワードや sudo パスワードは聞かれませんでしたが、playbook は正常に実行できました。
Ansible でパスワードベースの SSH と sudo ログインに sshpass を使用するにはこのようにすればよいでしょう。 この記事を読んでいただきありがとうございました!。