😋

Ansibleのfileモジュール、copyモジュール、templateモジュール

2021/04/07に公開

はじめに

くーばねてすを倒すために今回は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