とりあえずAnsibleから鍵認証するための手順


はじめに

Ansible から対象ホストに対してSSHで接続するための手順です。
え?「それをAnsibleでやるべき」だって?そんなものは後だ!

とりあえず前提

  • Ansible側も対象ホスト側もRHELを使用
  • Ansibleはインストール済み

とりあえず準備手順

Ansible側の作業

と言ったもののAnsible側で特に何かやる必要は無く、普通に鍵認証が設定されていればOKです。
すでに鍵認証設定が完了している場合は、ページの下の方だけ見てください。


まずはAnsible側で公開鍵と秘密鍵を作成。
(ここでは"ansi-user"というユーザで進めます)

$ ssh-key -t rsa

Enter file in which to save the key:と聞かれるので、そのままEnter。
次にEnter pssphrase (empty for no passphrase):と聞かれるのでパスフレーズを入力
Enter same passphrase again:で、先程と同じパスフレーズを入力します。

上記のコマンドを実行すると、/home/ansi-user/.sshにid_rsa(秘密鍵)とid_rsa.pub(公開鍵)が作成されます。

秘密鍵はどこに配置しても良いので、今回は移動せずに使用します。
配置はどこでも良いのですが、パーミッションの変更は必要なので、以下のコマンドを実行します。

$ chmod 600 ~/.ssh/id_rsa

対象ホスト側の作業

その後、対象ホストにログインしてansi-userを作成します。

$ useradd ansi-user

そして、鍵認証に必要なディレクトリとファイルを用意

$ su ansi-user
$ mkdir -p /home/ansi-user/.ssh
$ chmod 700 /home/ansi-user/.ssh
$ touch /home/ansi-user/.ssh/authorized_keys
$ chmod 600 /home/ansi-user/.ssh/authorized_keys

.sshディレクトリが作成できたら、Ansible側のid_rsa.pubを対象ホストの/home/ansi-user/.sshにコピーして、authorized_keysの末尾に追加します。

$ cat /home/ansi-user/.ssh/id_rsa.pub >> /home/ansi-user/.ssh/authorized_keys

AnsibleではSudo権限も必要なので、対象ホスト側のvisudoを編集します。

# visudo

末尾に以下の文字列を追加。

ansi-user ALL=(ALL) NOPASSWD:ALL

疎通確認

ここまでやれば普通にSSHで接続できるので、試してみましょう。

$ ssh -l ansi-user -i /home/ansi-user/.ssh/id_rsa [対象ホスト名 or IPアドレス]

上記のコマンドでログインできれば準備は完了です。

AnsibleでSSH接続

疎通確認

まずはAnsibleでも疎通確認をしてみましょう。
(hostsはInventoryファイルです。別名で利用している場合は適宜変更してください)

$ ansible [対象ホストのIPアドレス] -m ping -i hosts -u ansi-user --private-key="/home/ansi-user/.ssh/id_rsa"

下記のようなメッセージが返ってこれば疎通確認も完了です。

[対象ホストのIPアドレス] | SUCCESS => {
    ・・・(ここに何か記述されるかも知れません)
    "changed": false,
    "ping": "pong"

playbookコマンドを投げる

それでは遂にplaybookコマンドを投げてみます。
(playbook.ymlはplaybookファイルです。別名で利用している場合は適宜変更してください)

$ ansible-playbook -i hosts playbook.yml -u ansi-user --private-key="/home/ansi-user/.ssh/id-rsa"

上記のコマンドで問題なくplaybookコマンドが実行されれば完了です。

ssh-agentに秘密鍵を登録する

上記のコマンドだと、発行毎に毎回パスフレーズを入力する必要がありますが、そんな事してられない方はssh-agentに秘密鍵を登録してください。

$ ssh-add ~/.ssh/id_rsa

上記のコマンドを入力するとパスフレーズを聞かれますので、入力してください。
注意:再起動する毎に、初回接続時にパスフレーズを聞かれます

Could not open a connection to your authentication agent.と怒られる場合

ssh-agentを起動してやる必要があります。

$ ssh-agent

または(↑だと失敗する場合は)

$ eval `ssh-agent`

と入力してください。
その後、ssh-addを実行すれば行けると思います。

秘密鍵を登録した後は

$ ssh [対象ホスト]

$ ansible-playbook -i hosts playbook.yml

のみでSSH接続する事が可能です。多分。

初回ログイン時に「The authenticity of host ...」と言われたく無い人向け

段々脱線してきてますな。

それはさておき、sshで ~/.ssh/known_hosts にないマシンにアクセスする場合

The authenticity of host '[対象ホスト] (IPアドレス)' can't be established.
RSA key fingerprint is (略).
Are you sure you want to continue connecting (yes/no)?

と聞かれる事があります。
このメッセージが表示されるのが煩わしい時は、~/.ssh/configに下記の設定を書くことで抑制できます。

~/.ssh.config
host [対象ホストのIPアドレス]
  StrictHostKeyChecking no

また、~/.ssh/configはパーミッション600にしてやる必要があります。

$ chmod 600 ~/.ssh/config

以上。お目汚し失礼しました。