noharaのブログ

興味のあることについてゆる~く書きます

ブロードキャストコマンドとしてのansible

複数のホストに入って同じコマンドの結果が欲しいシチュエーションは多いと思います。
Tera Termのブロードキャストコマンドやシェルスクリプトでがんばってもいいのですが、今回はansibleでやってみます。

構成としては、ansible対象ホストにubuntucentosを一台ずつ用意しています。
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を利用することで柔軟な書き方ができる