Ansibleの結果をsedを使って整形する


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あたりはいろんなことができて楽しいですね!