備忘録
目的
以下の動作がさせたかった。
- AnsibleのPlaybookで各サーバのservice(今回はsnmpdとする)のstatusを確認
 - 出力結果をローカルサーバのディレクトリに保存
 
出力結果をローカルサーバに保存する方法を調べてもなかなか直接的な回答がなかったので、試行錯誤して完成させました。
ので、備忘録として置いておきます。
Playbook内容
全体
---
- name: service check snmpd Playbook
  vars:
    output_dir: "/home/ansible/snmpd_status/{{ inventory_hostname }}"
    output_file: "snmpdStatus.json"
    host_name: all
  hosts: "{{ host_name }}"
  sudo: yes
  gather_facts: false
  tasks:
    - name: snmpd check
      shell: service snmpd status
      register: check_service
      ignore_errors: yes
      
    - name: result stdout
      debug: var=check_service
      
    - name: create dir
      local_action: file path={{ output_dir }} state=directory owner=root group=root mode=0755
    
    - name: output file
      local_action: copy content={{ check_service }} dest={{ output_dir }}/{{ output_file }}
詳細説明
ざっくりですが、上から解説していきます。
  vars:
    output_dir: "/home/ansible/snmpd_status/{{ inventory_hostname }}"
    output_file: "snmpdStatus.json"
    host_name: all
変数宣言です。
今回は出力するディレクトリとファイル名、あとはインベントリのどのサーバを利用するかを格納する変数を用意しました。
今回はallなので、インベントリに登録されているすべてのサーバに対して実行するようにしています。
  hosts: "{{ host_name }}"
  sudo: yes
  gather_facts: false
hostsでさっき宣言したサーバを指定。
あとはsnmpdのstatusをとるにはrootである必要があるためsudo: yesを指定。
今回はファクト変数を使用しないのでgather_facts: falseを記述。
ファクト変数ってなんぞや?はググってください。
  tasks:
    - name: snmpd check
      shell: service snmpd status
      register: check_service
      ignore_errors: yes
タスクに入っていきます。
まずは各サーバのsnmpdのステータスを取得する部分です。
shellモジュールで実行したいコマンドを記載。
結果をregisterで変数に保存します。
あと、もしsnmpdを起動していなったらエラー(3)がかえってそこで処理が終了してしまうので、ignore_errors: yesをつけておいて、エラーが返っても処理を続けるようにしています。
    - name: result stdout
      debug: var=check_service
変数をdebugしているだけです。
うまく結果が挿入できていたら、出力結果が標準出力されます。
    - name: create dir
      local_action: file path={{ output_dir }} state=directory owner=root group=root mode=0755
ここからが肝です。
Ansibleにてリモートサーバではなく、ローカルサーバを操作する場合、
local_action
というモジュールを利用します。
local_action内でfileモジュールにてoutput_dirの作成を実行することで、ローカルサーバにディレクトリを作成することができます。
    - name: output file
      local_action: copy content={{ check_service }} dest={{ output_dir }}/{{ output_file }}
同じように、local_actionを利用して、copyモジュールにより変数の内容をファイルに出力しています。
まとめ
ローカルをごちゃごちゃ操作するにはlocal_actionを使えばいいということを学びました。
Ansibleってリモートサーバへの操作モジュールは結構多いけど、ローカルをいじれるのってそんなないんだな、ってイメージです。
使いこなせればこれ以上ない構成管理ツールなので、頑張って使いこなしたいと思います。

  
  
  
  

コメント