sanpobiyori.info

Ansible 小ネタ集 Prat1

今年に入ってから業務でAnsibleを触っていますが、個人的に地味に役立った小技的なものを備忘録ついでに紹介したいと思います。

スクリプトを実行する

小ネタという程ではないですが、「script」モジュールを紹介します。

基本、Ansibleの理念的にコマンドやスクリプト実行は冪等性の観点から非推奨ですが、稀にどうしてもAnsibleで使用可能なモジュールでは対応できない場合があります。
そういった中で、「shell」モジュールや「command」モジュールを使用する場合が多いですが、実行対象がスクリプト等の場合は「script」モジュールがおすすめです。

「script」モジュールの利点として、「files」に格納しておくことでスクリプトが実行可能な点や、Python2とPython3混在環境で明示的にPythonのバージョンを指定したりできるため、「shell」モジュールや「command」モジュールを使ってスクリプトを使用するよりもお手軽に実行できます。
ただし、スクリプト実行にAnsibleのvarsで管理しているパラメータをそれなり以上に使用する場合は、Pythonの自作モジュールとしてしまう方が色んな意味で楽ではあります。

一部タスクの対向先ホストを変更する

稀にですが、「タスク1」「タスク2」「タスク3」とあった場合、タスクの一部、例えば「タスク2」だけ別の対向先のサーバにしたいケースに出くわすことがあります。
こういったケースの場合、前後のタスクと紐づいていたりすることもあるため、そういった場合はなるべくtaskやroleはひとまとまりの方が解りやすかったりします。
そういったときに使えるのが「delegate_to」です。

使い方のイメージとしては、こんな感じです

---
- hosts: example
  tasks:
    - name: task1
      script: testpy1.py

    - name: task2
      delegate_to: localhost
      script: testpy2.py

    - name: task3
      script: testpy3.py

「delegate_to: <対向先>」の<対向先>には「ホスト名」または「IPアドレス」が指定できます。
また、対向先にlocalhostを指定したい場合で、「local_action:」が使えないモジュール、例えば上の例のような「script」モジュール等に対して使うことで、「local_action:」と同じような結果を得ることができます。

変数の中身をファイルに保存する

以前、Ansibleのタスク内で「register」に格納した値をファイルとして保存したい場合がありました。
そんなときに色々調べていて、「なるほど!」と思わず関心してしまったので紹介。

やり方としては至極簡単で「copy」モジュールを使用します。

---
- hosts: example
  tasks:
    - name: task1
      script: testpy1.py
      register: result

    - local_action:
        module: copy
        content: "{{ result }}"
        dest: /var/log/hoge/fuga.json

もしくは、「template」モジュールを使用して出力が行えます。

---
- hosts: example
  tasks:
    - name: task1
      script: testpy1.py
      register: result

    - local_action:
        module: template
        src: fuga.log.j2
        dest: /var/log/hoge/fuga.log

Ansibleでは「register」の中身はjsonなので、「copy」モジュールと「template」モジュールの使い分け方としては単純に、「register」の中身をjsonとして保存したい場合は「copy」モジュールになります。
「template」モジュールの場合は、「register」で格納している値を基に、情報を成形・加工・フィルターしたものを出力したい場合に有効です。

また、「copy」モジュール・「template」モジュールどちらの場合でも、先の「delegate_to」と組み合わせることで、サーバ間のデータファイルの横連携が簡単に行えそうな感じがして、ちょっとしたジョブ連携的なことができそうな感じがします。
あまりやりすぎると、構成が複雑化しすぎて改修が大変そうですが・・・


今回の小ネタ紹介は以上です。
まだ、幾つか紹介できそうなものがあるので、そのうちにでも紹介できればと考えています。

参考元


comments powered by Disqus