大体なんでもansibleでやる

ansibleのモジュールが便利で、一回こっきりの作業もスクリプトを書くよりもansibleのモジュールにぴったりとしたのがあれば、それでどうにかしたくなります。なんでもansibleでやっちゃうおじさん。

コマンドラインから「ホスト指定」と「変数の値」を渡して、Playbookを実行できると色々と定型処理が楽になるのでまとめ。

ホストの渡し方

localhost固定であれば、こんな感じでPlayのhostsにlocalhostあるいは127.0.0.1とでも書けば良い。

---
- hosts: 127.0.0.1
  tasks:
  - ...

そうでない場合は原則としてインベントリファイルに書かれているホストしかansibleは操作できない。

が、ansible-playbookコマンドの-iオプションにコンマ区切りでホストを書くと、インベントリファイルをつくらなくても、インベントリにそのホストが登録されているのと同じ扱いになる。 (Dynamic Inventoryというのもありますが今のところ使ってない。)

変数の渡し方。

変数については--extra-varsオプションの引数に、KEY=VALUEか、ちゃんとquoteしたJSONを書いて渡せば値が渡る。

http://docs.ansible.com/ansible/playbooks_variables.html#passing-variables-on-the-command-line

ssh周り

まだ鍵を入れて無くて、鍵認証が出来ないサーバーでも(root)パスワードがわかれば、ansible-playbookコマンドに--ask-pass -c paramikoを足して、パスワードでログインできる。 (自分の環境ではparamikoでなければ上手く動かなかった。)

鍵の配布自体はauthorized_keyモジュールで出来る。

hostname - Manage hostname — Ansible Documentation

例えばこんな感じのPlaybookを書いて、

---
# playbook.yml
- hosts: "{{ip}}"
  tasks:
  - hostname: "{{hostname}}"
  - authorized_key: user=charlie key="{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"

こんな感じのスクリプトで包めば、

#! /usr/bin/env ruby
# init_host.rb

ip = ARGV[0]
hostname = ARGV[1]

vars = %Q({"ip":"#{ip}","hostname":"#{hostname}"})
cmd = %W(ansible-playbook ./playbook.yml -i ,#{ip} --ask-pass -c paramiko --extra-vars)
cmd.push(vars)
system *cmd

こんな感じでスクリプトを叩いて、指定サーバーのホスト名の付け替えと、鍵の導入が出来たりする。便利。

$ ./init_host.rb 192.168.0.100 test-server