Ansibleの結果をsedを使って整形する
使用シーン:複数サーバ内にある特定のファイルの情報を取り出し、活用したい
1. debugモジュールで情報取得
playbook (grep_get.yml)
- hosts: all
tasks:
- name: grep
shell: grep -v "\#" /work/file
register: result
- name: get result
debug: var=result.stdout_lines
整形に失敗するたびにplaybookを実行するのを避けるべく、
playbook実行時にteeコマンドで結果をファイルに出力しておく
実行:ansible-playbook -i hosts grep_get.yml | tee /tmp/result.txt
2. playbook実行結果
PLAY [all] *******************************************************
TASK [Gathering Facts] ********************************************
ok: [192.168.10.1]
ok: [192.168.10.2]
TASK [grep] *************************************************
changed: [192.168.10.1]
changed: [192.168.10.2]
TASK [get result] **************************************************
ok: [192.168.10.1] => {
"result.stdout_lines": {
"hoge",
"huga",
"foo"
]
}
}
ok: [192.168.10.2] => {
"result.stdout_lines": {
"piyo",
"foo",
"bar"
]
}
}
PLAY RECAP ******************************************************
192.168.10.1 : ok=3 changed=1 unreachable=0 failed=0
192.168.10.2 : ok=3 changed=1 unreachable=0 failed=0
3. 得られたファイルをsedを軸に整形
やりたいこと①: サーバごとの情報のみを取り出す
コマンド(不要行や記号を削除)
sed -e '/^PLAY\|^TASK\|stdout_lines\|changed/d' -e 's/ \+\|*\+\|\[\|\]\|{\|\}\|\"\|\:\|\,\|=\|>\|ok//g' result.txt |cat -s
※cat -sは複数行の改行を1つにする
結果:
192.168.10.1
192.168.10.2
192.168.10.1
hoge
huga
foo
192.168.10.2
piyo
foo
bar
やりたいこと②: 全てのサーバで使われている情報の一覧を作成する
コマンド(不要行や記号、重複を削除し、並び替える)
sed -e '/^PLAY\|^TASK\|^ok\|changed\|stdout_lines/d' -e 's/ \+\|*\+\|\[\|\]\|{\|\}\|\"\|\:\|\,\|=\|>//g' result.txt |sort|uniq`
結果:
bar
foo
hoge
huga
piyo
※sedでは -i オプションを付ければ元のファイルに上書き可能
※パイプで別コマンドとつないだ場合はリダイレクトして出力すればOK
もしかしたらちょっと回りくどいことをしているかもしれませんが、grep、sedあたりはいろんなことができて楽しいですね!