はじめに
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に下記の設定を書くことで抑制できます。
host [対象ホストのIPアドレス]
StrictHostKeyChecking no
また、~/.ssh/configはパーミッション600にしてやる必要があります。
$ chmod 600 ~/.ssh/config
以上。お目汚し失礼しました。