もりはやメモφ(・ω・ )

ITとか読書感想文とか

Ansibleの fetch と copy で複数台サーバの特定ファイルを一括整理する

小ネタです。AnsibleでPlaybookを使わず、 ansible コマンドを使ってアドホックに以下をしました。

  • ファイルを一括収集
  • ファイルを一括配布

経緯としては以下です。

  • 10台以上ある開発用サーバがあり、誰もが比較的自由に使えるのでカオスな状況になっている(当然 playbook での構成管理無し)
  • 最低限のデプロイ処理を追加したいので、デプロイ用のユーザにssh鍵を追加したい
  • この際だからせめてデプロイユーザの authorize_keys くらいは統一したい

やり方

ansible の fetch module で一括で集める

ファイルの収集はfetchモジュールが便利です。ポイントとしては

  • flat=yes でディレクトリの階層を手元に再現しない
  • {{ inventory_hostname }} を使用してサーバ名を収集してきたファイルの末尾へ付与
#作業用ディレクトリ作成
mkdir fetched_files

#対象のサーバたちをinventoryへ記載
vi hosts

#回収
ansible -i hosts 'test_servers' -m fetch -a 'src=/home/deployuser/.ssh/authorized_keys dest=fetched_files/authorized_keys-{{ inventory_hostname }} flat=yes' -b

接続や権限に問題がなければ以下のようなファイルが手元に回収されます。

$ ll fetched_files
-rw-r--r-- 1 morihaya wheel  404 Jan 22 16:22 authorized_keys-test_server01
-rw-r--r-- 1 morihaya wheel  404 Jan 22 16:22 authorized_keys-test_server02
-rw-r--r-- 1 morihaya wheel  404 Jan 22 16:22 authorized_keys-test_server03
-rw-r--r-- 1 morihaya wheel  404 Jan 22 16:22 authorized_keys-test_server04
-rw-r--r-- 1 morihaya wheel  404 Jan 22 16:22 authorized_keys-test_server05
-rw-r--r-- 1 morihaya wheel  404 Jan 22 16:22 authorized_keys-test_server06
-rw-r--r-- 1 morihaya wheel  404 Jan 22 16:22 authorized_keys-test_server07

配布用ファイルの作成

今回はauthorized_keysに含まれる鍵は増えても良いけど減らすと事故る可能性があるケースでしたので、全てのファイルを統合したものである必要がありました。そのため差分などを確認しながら配布用のファイルを準備しました。

#回収したファイル郡を確認して、必要ならまとめる
cd fetched_files
md5sum *
diff authorized_keys-xxx authorized_keys-yyy

#収集したどれかのファイルをベースに、都合の良い配布用ファイルを作成
cp  authorized_keys-xxx  authorized_keys-new
vim authorized_keys-new

ansible の fetch module で一括で配布する

配布はcopyモジュールで行います。copyはAnsibleの入門時でもお世話になる大人気モジュールですね。ポイントは

  • -bsudo 権限で実行しています。対象がユーザのhome配下のファイルだからです
  • --check --diff で初回時には実行して動作を確認しましょう
#配布の前に差分確認
ansible -i hosts 'test_servers' -m copy -a 'dest=/home/deployuser/.ssh/authorized_keys src=fetched_files/authorized_keys-new backup=yes' -b --check --diff

#配布
ansible -i hosts 'test_servers' -m copy -a 'dest=/home/deployuser/.ssh/authorized_keys src=fetched_files/authorized_keys-new backup=yes' -b --check --diff

以上、簡単にファイルを複数台のサーバから集めて、ファイルを配布し直す技でした。 そもそもちゃんと構成管理していれば良いのですが、今ある問題に立ち向かうときに役立つかもしれませんね。。。