複数のホストに入って同じコマンドの結果が欲しいシチュエーションは多いと思います。
Tera Termのブロードキャストコマンドやシェルスクリプトでがんばってもいいのですが、今回はansibleでやってみます。
構成としては、ansible対象ホストにubuntuとcentosを一台ずつ用意しています。
ansibleのバージョンは2.4で検証してます。
まずは簡単な例から、hostnameを出力するだけのパターン。 -mでモジュールを指定して、-aで引数を渡しています。
ansible -i hosts vagrant -u vagrant -k -m shell -a "hostname" SSH password: 192.168.33.11 | SUCCESS | rc=0 >> vagrant-centos 192.168.33.12 | SUCCESS | rc=0 >> vagrant-ubuntu-trusty-64
ちなみにplaybookとして書くとこう
$ ansible-playbook -i hosts hostname.yml -k -u vagrant
# hostname.yml --- - hosts: vagrant tasks: - name: echo hostname shell: hostname register: result - debug: var=result.stdout
次に、上記で書いたplaybookを実行したうえで値を別のplaybookで流用したい場合。
例として、ansible実行ホストのカレントディレクトリにtemp.logとして出力するplaybookを書いてみます。
ポイントは
- {{hostvars['192.168.33.1x']['result']['stdout']}}
で別のplaybookの値を参照している部分
- connection: localでローカルに対して実行している点
ansible-playbook -i hosts local.yml -k -u vagrant
# local.yml --- - import_playbook: hostname.yml - hosts: localhost connection: local tasks: - name: log export copy: mode: 0644 dest: "./temp.log" content: "{{hostvars['192.168.33.11']['result']['stdout']}}\n{{hostvars['192.168.33.12']['result']['stdout']}}/n"
出力結果
# temp.log vagrant-centos vagrant-ubuntu-trusty-64
まとめ
- ansibleはワンライナーとしての使い方もできる
hostvars
を利用することで柔軟な書き方ができる