Ansibleのfileモジュール、copyモジュール、templateモジュール
はじめに
くーばねてすを倒すために今回はNode.jsをやっつけないといけなくなったのでNode.jsの設定をデーモン化したものをAnsibleで自動化するために色々調べた(^^)/!自動化するにはAnsibleのモジュールを倒さなければならないことが分かったのでモジュールを勉強する!
概要
■fileモジュール
■copyモジュール
■templateモジュール
をまとめた(^^)/!
■fileモジュール
fileモジュール公式ドキュメント
ファイル、シンボリックリンク、またはディレクトリを設定や削除をする。
|パラメータ|意味|
| --- | --- | --- |
|path|※必須項目。ファイルパスを指定する。|
|src|コントロールノードのファイルパスを指定する(state=linkの場合のみ)。sourceの略。|
|dest|destinationの略。宛先。srcを置く送信先であるターゲットノードの絶対パスを指定する。|
|attributes|ファイルまたはディレクトリの属性を指定する。|
|group|ファイル/ディレクトリを所有するグループを指定する。|
|mode|ファイル/ディレクトリに権限を付与する。8進数の指定(0644や'644')とシンボリックモード(u=rw,g=r,o=r)での指定が可能。|
|follow|既にファイルが存在する場合置き換えない。(要確認)|
|force |シンボリックリンクを作成する。pathファイルのリンクを解除し、代わりにsrcでファイルへのシンボリックリンクを作成する|
|recurse|再帰的にファイル属性を変更するか(state=directory/state=hardの場合のみ)。。|
|state|file: 既存のファイルを操作する場合に指定する。link: シンボリックリンクとして指定する。directory: path に指定されたパス名のディレクトリを作成する。パス名の途中のディレクトリが存在しない場合はサブディレクトリも一緒に作成する。hard: ハードリンクとして指定する。touch: pathで指定したファイルが存在しない場合、空ファイルを作成する。既にファイルが存在する場合、タイムスタンプが更新される。absent: ディレクトリやファイル、シンボリックリンクを削除する。|
- name: ディレクトリのシンボリックリンクを作成
- file:
src: /file/to/link/to
dest: /path/to/symlink
state=link
- name: ファイルの所有権、グループ、およびアクセス許可を変更する
file:
path: /etc/foo.conf
owner: foo
group: foo
mode: '0644'
- name: ハードリンクを作成する
file:
src: '/tmp/{{ item.src }}'
dest: '{{ item.dest }}'
state: hard
loop:
- { src: x, dest: y }
- { src: z, dest: k }
- name: シンボリックモードでファイルを作成、0644の権限を付与する
file:
path: /etc/foo.conf
state: touch
mode: u=rw,g=r,o=r
■copyモジュール
copyモジュール公式ドキュメント
copyモジュールはコントローラノードに存在するファイルを、ターゲットノードに送信することができます。
ディレクトリごとファイルをコピーすることはできるが、空のディレクトリだけコピーできない。
remote_srcパラメータによりリモートからリモートの別パスへのコピーができる。
srcの代わりにcontentを指定することで実ファイルを用意せずに直接ファイルの内容を記載できる。
|パラメータ|意味|
| --- | --- | --- |
|dest|※必須項目。コピー先のターゲットノードの絶対パス。srcがディレクトリの場合、これもディレクトリである必要がある。|
|src|コピー元を指定する。|
|attributes|ファイルの属性を指定する。|
|backup|yesの場合、上書きされるファイルのバックアップを作成する。バックアップはコピー先のファイルが存在するディレクトリと同じディレクトリに作成される。|
|content|srcの代わりに使用するとコピー先ファイルに記述する内容を指定する。|
|decrypt|暗号化されたファイルを復号化する。デフォルトはyes|
|directory_mode|ディレクトリのパーミッションを指定する|
|follow|yesの場合、destで指定した内容に従うことを示す。既にファイルが存在する場合置き換えない。(要確認)デフォルトはno|
|force|yesを指定すれば、コピー先に既にファイルが存在する場合、ファイルの中身を比較して差分がある場合はコピーを実施する。noを指定した場合、コピー先にファイルが存在しない場合にのみ、コピーを実施する。デフォルトはyes。|
|group|グループ名を指定する。|
|mode|chmodコマンドで設定できる権限設定|
|owner|chownコマンドで設定できる所有者ユーザの設定。|
|validate|所定の位置にコピーする前に実行する検証コマンド。検証するファイルへのパスは、「%s」を介して渡されます。shellは利用できない。|
|remote_src|ターゲットノード内でのファイルコピーyes/noで指定する。src/destのパスはターゲットノードになる|
- name: 所有者と権限を設定しファイルをコピーする
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: '0644'
- name: ntp.confファイルコピーし、元のファイルをバックアップする
copy:
src: /mine/ntp.conf
dest: /etc/ntp.conf
owner: root
group: root
mode: '0644'
backup: yes
- name: visudoによる検証に合格した後、ファイルをコピーする
copy:
src: /mine/sudoers
dest: /etc/sudoers
validate: /usr/sbin/visudo -csf %s
- name: contentの内容を対象ファイルにコピーする
copy:
content: '# This file was moved to /etc/other.conf'
dest: /etc/mine.conf
- name: ターゲットノード内でhello.txtをコピーする。
copy:
src: /tmp/hello.txt
dest: /tmp/hello2.txt
mode: 0644
remote_src: yes
■templateモジュール
templateモジュール公式ドキュメント
ファイルをターゲットノードにテンプレート化して送信する。
テンプレートは、Jinja2によってテンプレートファイル内でifやforなどのプログラムっぽい記述ができる。
|パラメータ|意味|
| --- | --- | --- |
|dest|コピー先の絶対パスの指定。|
|src|ローカルにあるJinja2テンプレートのパス。絶対パス、相対パスでの指定が可能。|
|group|chownコマンドで設定できる所有者グループの設定。|
|mode|chmodコマンドで設定できる権限設定。8進数の指定とシンボリックモードでの指定が可能。|
|owner| chownコマンドで設定できる所有者ユーザの設定。|
|validate|コピー前に実行される検証コマンド。検証するファイルのパスは『%s』で指定することが可能。|
|force|・yes ⇒ dest の内容と、内容が異なればファイルを置換。・no ⇒ ファイルは宛先が存在しない場合にのみ転送される|
|newline_sequence|ファイルのテンプレートに使用する改行シーケンスを指定する。デフォルトは\ n |
- name: ファイルをテンプレート化して/etc/files.confに送信する
template:
src: /mytemplates/foo.j2
dest: /etc/file.conf
owner: bin
group: wheel
mode: '0644'
- name: テンプレートからDOSスタイルのテキストファイルを作成する
template:
src: config.ini.j2
dest: /share/windows/config.ini
newline_sequence: '\r\n'
- name: visudoによる検証に合格した後、新しいファイルを所定の場所にコピーする
template:
src: /mine/sudoers
dest: /etc/sudoers
validate: /usr/sbin/visudo -cf %s
- name: sshd_configを更新し、バックアップを作成する
template:
src: etc/ssh/sshd_config.j2
dest: /etc/ssh/sshd_config
owner: root
group: root
mode: '0600'
validate: /usr/sbin/sshd -t -f %s
backup: yes
templateモジュールはモジュール内で元のファイルを加工してサーバに配置するため設定ミスが発生しやすい。なので意図していない箇所がJinja2のフォーマットとして認識されてしまい処理されてしまう可能性もある。
なれていない人はできるだけcopyモジュールを使用したり、コピー前に実行される検証コマンドvalidateをパラメータを利用して事前確認する。
まとめ
モジュールとすこし仲良くなれた気がする!(^^)!
Discussion