読者です 読者をやめる 読者になる 読者になる

池の上にも

平均以下の理解力で、色々アウトプットしてみるブログ

Ansible でノート PC を構築するときの備忘

前情報

うちのノート PC は、OS に Lubuntu を使っています。壊れたりして、初期化が必要になったら、Lubuntu インストール後に Ansible を使って初期設定するようにしてます。

なお、初期化に必要な設定ファイル(.vimrcとか、.tmux.confとか)は、bitbucketに置いています。Ansible playbook も bitbucket に置いてます。

bitbucket.org

今回試した環境(2017/5/1)

  • Lubuntu 16.04.2 LTS
  • ansible 2.3.0.0

Ansible を実行するために

Lubuntu をインストール後に、Ansible を実行するまでの手順が必要です。そこは、自動化できないので、備忘として記載しておきます。

SSHD インストール

Lubuntu には openssh-server が入っていないので、インストールします。

$ sudo apt install openssh-server

Ansible インストール

まずは、どのversionがインストールされるか確認

$ sudo apt show ansible

バージョンが2.1.0以上であることを確認します。 2.1.0より低かったり、パッケージが見つからない場合は、リポジトリを追加します。

$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt update

その後、インストールして、バージョンを確認します。

$ sudo apt install ansible
$ ansible --version

bitbucket の SSH key 作成

Ansible playbook 内で設定ファイルをgit cloneするときに必要なため、SSH鍵を作成して bitbucket に登録しておきます。bitbucket専用の鍵にしたいので、鍵の移動と名前も変更しておきます。

$ ssh-keygen
$ mkdir ~/.ssh/bitbucket/
$ mv ~/.ssh/id_rsa* ~/.ssh/bitbucket/
$ cd ~/.ssh/bitbucket/
$ mv id_rsa bitbucket.id_rsa
$ mv id_rsa.pub bitbucket.id_rsa.pub 

bitbucket.id_rsa.pubをbitbucketのSSH keyとして登録します。その後、~/.ssh/configにコンフィグを記載しておきます。

Host bitbucket.org
  HostName bitbucket.org
  IdentityFile ~/.ssh/bitbucket/bitbucket.id_rsa
  User git

Ansible playbook ダウンロード

構築用のAnsible playbookをどこかのディレクトリに適当に配置

SSH でのアクセス設定

SSH Agentを起動し、自ホスト向けの鍵を登録しておきます。

$ ssh-keygen
$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa

自ホストからのSSHアクセス用の公開鍵を登録します。

$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys

SSH鍵で自ホストにログインできることを確認、うまく言っていればパスワードを聞かれずにログインできます。

$ ssh <user>@127.0.1.1

playbook 実行

playbookのディレクトリに移動し、以下を実行。site.ymlの設定を確認して、対象のホストに間違いがないかは見ておく必要ありです。

ansible-playbook -i production site.yml --ask-sudo-pass

Networkで使われているIP Addressをbashで調べる方法

Networkで使われているIP Addressをbashで調べる方法

nmapかarp-scanを入れたら簡単にできるらしいですが、bashで行けないかなと思いました。

pingを全IP Addressに送信して、arpを見ればいけそう。

# for i in `seq 1 254`; do ping -c1 192.168.10.${i} > /dev/null & done
# arp
アドレス               HWタイプ  HWアドレス         フラグ マスク インタフェース
192.168.10.1              ether  xx:xx:xx:xx:xx:xx   C             wlp1s0
192.168.10.2              ether  yy:yy:yy:yy:yy:yy   C             wlp1s0

自分のSSH 使い方変遷

自分がこれまでに辿った、SSHの使い方を整理してみる。

SSH 原始時代

愚直にパスワードを入力してログインしてた頃。-lでユーザを指定するより、@で指定するのが覚えやすかったため、@を使用する派。

$ ssh <user>@<remote-host>
Password: 

<remote-host> $ 

SSH 石器時代

前時代の方法だと、ログインするたびにパスワードを入力しないといけなくて、それだと手間なので、公開鍵認証を覚えた。

公開鍵認証では、公開鍵をリモートホストに事前に登録しておけば、以降はローカルホストの秘密鍵を指定して接続すればパスワードなしでログインできる。自分としては、公開鍵というより公開錠前と考えたほうがイメージし易かった。公開錠前を接続したいホストにコピーして配布して、秘密鍵で公開錠前を開けるイメージ。

http://blakesmith.me/images/public_private_many.png *1

ssh-keygenコマンドで作成される~/.ssh/id_rsa秘密鍵、~/.ssh/id_rsa.pubが公開鍵。パスフレーズの入力が求められるが、これは秘密鍵を使うためのもので、リモートとのやり取りには関与しないらしい。zipにかけるパスワードのようなものなので、なくても良いはず。

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 

公開鍵のリモートホストへの登録は、公開鍵(~/.ssh/id_rsa.pub)の内容を、リモートホストの~/.ssh/authorized_keysに追記することで実施する。~/.ssh/authorized_keysがない時は、新規作成して、パーミッションを600に設定する。このあたりの処理はssh-copy-idを使うと、リモートホストのauthorized_keysへの書き込みを自動で実施してくれる。

$ ssh-copy-id <user>@<remote-host>
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/<user>/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
<user>@<remote-host>'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '<user>@<remote-host>'"
and check to make sure that only the key(s) you wanted were added.

SSH 青銅器時代

前時代の方法だと、ログインするときに秘密鍵を指定しないといけない。それに、ユーザ名とリモートホストを入力するのも面倒になってきた。

$ ssh -i ~/.ssh/id_rsa <user>@<remote-host>

それだと手間なので、~/.ssh/configに設定を書くことを覚えた。

Host remote-host
  HostName <remote-host>
  IdentityFile ~/.ssh/id_rsa
  User <user>

これでタイプする量が減って、かなり楽になった。

$ ssh remote-host

SSH 鉄器時代

秘密鍵に設定できるパスフレーズもあったほうが良い気がしてきた。かと言って、接続のたびにパスフレーズを打つ気にはならない。

なので、ssh-agentを使うことを覚えた。

ssh-agentを起動して、ssh-agentに秘密鍵を渡しておくと、以降の秘密鍵を使用する際にパスフレーズを入れる必要がなくなる。

まずは、ssh-agentを起動する。

$ eval `ssh-agent`

ssh-agentに秘密鍵を追加、それと秘密鍵を持っているかを確認する。

$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /home/<user>/.ssh/id_rsa: 
Identity added: /home/<user>/.ssh/id_rsa (/home/<user>/.ssh/id_rsa)
$ ssh-add -l
2048 SHA256:f4l2f1eJfZnICjvpEfmV3KsiE2Xat7eYn3leJOnLGv1 /home/<user>/.ssh/id_rsa (RSA)

さらにssh-agentが強力なのが、リモートホスト秘密鍵を持ってきてくれる機能。ssh-agentが秘密鍵を持ってきてくれるので、踏み台サーバの先にいる目的のリモートホストに公開鍵を登録しておけば、パスワードなしでログインできる。

ssh利用時に-Aオプションを付けると、ssh-agentがリモートホスト秘密鍵を持ってきてくれる。なお、-Aオプションを入れるのが億劫な場合は、.ssh/configにForwardAgent yesを追加しておくと良い。

$ ssh -A remote-host
remote-host$ ssh-add -l
2048 SHA256:f4l2f1eJfZnICjvpEfmV3KsiE2Xat7eYn3leJOnLGv1 /home/<user>/.ssh/id_rsa (RSA)

ssh-agent起動は、.bashrcに書いておいて自動実行すると良いらしい。なお、ssh-agentは、OS起動時に既に起動している場合があるので、その場合ssh-agentの起動は実行不要。

# start SSH agent
ssh-add -l &>/dev/null
if [ "$?" == 1 ]; then
  test -r ~/.ssh-agent && \
    eval "$(<~/.ssh-agent)" >/dev/null

  ssh-add -l &>/dev/null
  if [ "$?" == 1 ]; then
    (umask 066; ssh-agent > ~/.ssh-agent)
    eval "$(<~/.ssh-agent)" >/dev/null
  fi
fi

あと、以下のaliasを書いておけば、初回のssh実行時にのみssh-addを実行できるので便利。

# add ssh-add to SSH command
alias ssh='ssh-add -l &>/dev/null || ssh-add && unalias ssh; ssh'

おわりに

SSHについては、まだまだ知らないだけで進化の余地ありそう。暇があれば調査してみたいと思う。