こんにちは!
BFT名古屋支店の佐野です。
Ansibleによる構成管理を行なう時、手持ちのスクリプトを利用したいと思ったことはないでしょうか?
パッケージ化されていないソフトウェアのインストールや、インターネットに接続したくないノードに特定のソフトウェアや設定を入れたい場合、またAnsibleでモジュール化されていない処理を行なおうとする時など、構成管理の一環として自前のスクリプトを流したいと考えるシチュエーションはあるかと思います。
そこで今回はAnsibleにおいて、ローカルのスクリプトを管理対象上で実行するためのモジュールについて解説いたします。
はじめに:Ansibleでスクリプト実行を含むPlaybookを使うことについて
Playbookの処理内でスクリプト実行を行なう手段はふたつあります。
ひとつはshellモジュールを使用し、管理対象上にあるスクリプトを直接実行するという方法。
もうひとつはscriptモジュールを使用し、ローカル上……つまりAnsibleサーバとなるコントロールノード上にあるスクリプトを管理対象上で実行するという方法です。
全ての管理対象上の同じ場所に同じスクリプトが存在している場合でもないかぎり、通常はこのscriptモジュールを使用します。
scriptモジュールを使った場合、管理対象上の任意の場所を指定してそこでスクリプトを実行できるため、構文に間違いがない限り意図しない場所で処理が行われるといったこともありません。
またこのモジュールはWindowsが管理対象の場合でも使用でき、LinuxとWindowsで共用できるスクリプトであるならば、実行場所を変更するだけで使いまわすことも可能です。
ただし注意点として、scriptモジュールは冪等性を担保していません。
同じく冪等性の担保がないshellモジュールと同じく、実行した場合は以前その管理対象で同スクリプトの実行が行われていようと、必ずスクリプトが実行され、実行結果もchangedとなってしまいます。
またAnsible公式ではscriptモジュールを使ってスクリプトを実行するよりも、そのスクリプトを元にAnsibleモジュールを作成することが推奨されています。
運用的な観点においても、わざわざスクリプトを作ってAnsibleで実行するだけであるのならば、そのスクリプトを管理対象全体に流し込むことが早いと言われることが多くあるためです。
本当にスクリプトで行なう必要があるのか、あわよくばモジュール化して後に役立てるようにできないかは、できれば検討しておきたいものです。
なお、scriptモジュールの公式ドキュメントについてはこちらから参照できます。
はじめに:scriptモジュールを使って管理対象上でスクリプトを実行するPlaybook
例として、scriptモジュールを使用してSymantec Endpoint Protectionをインストールするスクリプトを管理対象上で実行するためのPlaybookを紹介します。
scriptモジュールの性質上、実行するスクリプトは既に用意されている状態を前提とします。
- hosts: all tasks: - name: sep install script: cmd: /SymantecEndpointProtection/install.sh --some-argument 1234 chdir: /tmp
scriptモジュールで主に使用するオプションは「cmd」オプションと「chdir」です。
cmdオプションにより実行対象となるシェルスクリプトのパスを指定することで、そのスクリプトを実行することができます。
管理対象側でのスクリプトの実行場所を指定する場合、chdirオプションに実行先のディレクトリパスを記述します。
その場合はスクリプトの実行前にリモート上で指定した場所に移動してからスクリプトが実行されることになります。
さいごに
以上がローカルのスクリプトを管理対象上で実行するscriptモジュールの開設となります。
既存のモジュールに頼ることなく、スクリプトによって多彩な処理を実施できるものではありますが、その思想は分かりやすさや変更のしやすさという観点から、Ansibleが掲げる思想とはどうしてもズレてしまうと筆者は考えています。
可能であればそのスクリプトの内容がモジュールで行なえないか検討したり、いっそスクリプトをモジュール化してしまうことを考えるのもよいかと思います。
以上、お読みいただきありがとうございました。