こんにちは!
BFT名古屋支店の佐野です。
今回もAnsibleを使用する例および方法についてお送りいたします。
以前の記事ではテキストファイルに文字列を追加・編集するモジュールについて扱いましたが、その際に管理対象のテキストファイルを管理する方法としてcopyモジュールを使用する方法についても挙げましたため、今回はこのcopyモジュールに観点を絞った解説をいたします。
はじめに:Ansibleでのファイル配置とCopyモジュール
まずAnsibleにおけるcopyモジュールは、cpコマンドと同じように指定のファイルをコピーするものです。
Ansibleサーバーに存在するローカルファイル、および管理対象となるクライアントに存在するファイルを、別のクライアントにコピーすることができます。
ディレクトリごとファイルをコピーすることも可能ですが、中身が空となるディレクトリだけをコピーするといったことはできません。
ちなみに「クライアントのファイルをAnsibleサーバーにコピーする」という処理は、このcopyモジュールでは行なうことができません。
その場合はfetchモジュールを使用することになります。
またこのcopyモジュールはWindowsの管理対象には使用できません。その場合は、Windows用のcopyモジュールである「win_copyモジュール」を使用します。
win_copyモジュールはcopyモジュールと比べ設定できるオプションが少ないという点はありますが、ほぼcopyモジュールと同じように使用できるため、ここでの解説は割愛します。
Ansible公式のcopyモジュールのドキュメントについてはこちらから確認できます。
このcopyモジュールですが、何に使うことが一番多いかというと、業務経験上では同一仕様のクローンVMをAnsibleで作成した場合などで、後から設定ファイルを一気に配布したいといった時になります。
また管理対象に同名のファイルがあり、その内容が異なる場合、copyモジュールはデフォルトでは「置き換え」を行ないますので、ファイル名や内容が同一となるものを一斉に更新したい場合にも使用されます。
内容が異なるテキストファイルを編集したいといった場合には、以前紹介したlineinfileモジュールやblockinfileモジュールの使用を検討することになるかと思います。
管理対象にファイルをコピーするPlaybook
例として、yumコマンドの動作を決定する設定ファイルである/etc/yum.confを管理対象にcopyモジュールで配布するPlaybookを紹介します。
先述した通りcopy モジュールはコピー先に同名のファイルがある場合、その内容がコピー元と異なる場合はデフォルトで置き換えを行ないます。
今回の例はプロキシー情報など設定を加えたyum.confを用意し、管理対象にあるyum.confを上書き・更新することを想定しています。
なおコピー元を示すsrc:のパスは一例となります。
- hosts: all tasks: - name: put yum.conf copy: src: "yum.conf" dest: "/etc/yum.conf" mode: "644"
「dest:」はコピー先となるディレクトリを指定するもので、「mode:」はコピーしたファイルの権限設定を行なうもので、chmodコマンドと同様の形式で指定することができます。
さいごに:copyモジュールを利用する上での留意点
copyモジュールは管理対象にファイルを追加する場合にまず候補として挙げられるモジュールであり、また更新においても最初の選択肢として挙げられるものであると筆者は考えております。
ただしcopyモジュールはひとつのファイルまたはディレクトリをそのまま管理対象に配置するものですので、例えば配置場所を間違えた上で多くの管理対象に送ってしまうと元に戻すのが大変でありますし、例えば複数の管理対象のファイルを更新するという場合に、いずれかの管理対象の更新対象ファイルが何らかの理由で他とは異なる更新を行なっていた場合、容易にデグレが生じてしまいます。
簡易的で便利なcopyモジュールではありますが、ある意味“大雑把”とも言え、検討せずに使用するにはいささか危ないものでもあります。
(これはどのモジュールについても言えることではありますが)
copyモジュールは使用頻度の高い基本的なモジュールであると言えますので、是非使いこなしていただきたいと思います。
以上、お読みいただきありがとうございました。