■ はじめに
Ansible には、ファイル属性の設定やディレクトリの作成などができる file モジュール があります。
この記事では、 file モジュールの公式ドキュメントに記載されている使用例をベースにして、使い方を説明します。
なお、公式ドキュメントの使用例は、Playbook 単位ではなくtask 単位で記載されています。この記事では Playbook 単位で例示します。
動作確認環境
- Ansible 2.3.0, 2.7.8
- CentOS 7.6 (Ansible 側、管理対象ホスト側とも)
目次
■ [例1] 所有者やパーミッションを設定する
Playbook
既存のファイル /etc/foo.conf の所有者、所有グループ、パーミッションを設定する Playbook です。
- hosts: linux gather_facts: no become: yes tasks: - file: path: /etc/foo.conf owner: kingyo group: kingyo # when specifying mode using octal numbers, add a leading 0 mode: 0644
pathオプション- 対象ファイルのパスを指定します。(必須)
- 本タスクの場合、
stateオプションは指定していないため(デフォルトのstate: file扱い)、ここで指定したファイルは あらかじめ存在している必要があります 。 - もし空のファイルを作成する場合は、
state: touchを併用します。その場合も、パスの途中に含まれるディレクトリは存在している必要があります。
onwerオプション- 対象ファイルの所有者を指定します。
groupオプション- 対象ファイルの所有グループを指定します。
modeオプション- 対象ファイルの mode を指定します。
- 8進数で指定する場合は、
0644のように0から始めるか、'644'のようにクォーテーションで囲う必要があります。 u=rw,g=r,o=rのような指定もできます。
本タスクで指定していないその他のオプション例
実行ログ
ここでは、/etc/foo.conf が 所有者 root、所有者グループ root、パーミッション 664 の状態で Playbook を実行します。
- リモート側の事前確認
$ sudo ls -al /etc/foo.conf -rw-rw-r--. 1 root root 6 Mar 3 06:57 /etc/foo.conf
- Ansible 側
$ ansible-playbook -i inventory file_attr.yml PLAY [linux] ****************************************************************************************** TASK [file] ******************************************************************************************* changed: [linux1] PLAY RECAP ******************************************************************************************** linux1 : ok=1 changed=1 unreachable=0 failed=0
- リモート上の事後確認
$ sudo ls -al /etc/foo.conf -rw-r--r--. 1 kingyo kingyo 6 Mar 3 06:57 /etc/foo.conf
無事に /etc/foo.conf が指定通りの所有者、パーミッションになりました。
■ [例2] ファイルやディレクトリを削除する
Playbook
ファイル /etc/foo.conf をファイルを削除する Playbook です。
公式ドキュメントの資料には載っていませんが、使用する頻度はそこそこあるのではないかと思います。
- hosts: linux gather_facts: no become: yes tasks: - file: path: /etc/foo.conf state: absent
pathオプション- 対象(ここではファイル名)のパスを指定します。(必須)
stateオプション- 対象の種類を指定します。ここでは削除するため
state: absentを指定しています。
- 対象の種類を指定します。ここでは削除するため
実行ログ
ここでは、/etc/foo.conf がある状態で Playbook を実行します。
- Ansible 側
$ ansible-playbook -i inventory file_absent.yml PLAY [linux] *************************************************************************** TASK [file] **************************************************************************** changed: [linux1] PLAY RECAP ***************************************************************************** linux1 : ok=1 changed=1 unreachable=0 failed=0
- リモート上の事後確認
$ sudo ls /etc/foo.conf ls: cannot access /etc/foo.conf: No such file or directory
無事に /etc/foo.conf が削除されました。
■ [例3] ディレクトリを作成する
Playbook
ディレクトリ /etc/some_directory を作成する Playbook です。
- hosts: linux gather_facts: no become: yes tasks: - file: path: /etc/some_directory state: directory mode: 0755
pathオプション- 対象(ここではディレクトリ名)のパスを指定します。(必須)
stateオプションmodeオプション- 対象ファイルの mode を指定します。
実行ログ
ここでは、/etc/some_directory がない状態で Playbook を実行します。
- Ansible 側
$ ansible-playbook -i inventory file_dir.yml PLAY [linux] ****************************************************************************************** TASK [file] ******************************************************************************************* changed: [linux1] PLAY RECAP ******************************************************************************************** linux1 : ok=1 changed=1 unreachable=0 failed=0
- リモート上の事後確認
$ ls -al /etc/some_directory/ total 8 drwxr-xr-x. 2 root root 4096 Mar 3 07:14 . drwxr-xr-x. 88 root root 4096 Mar 3 07:14 .
無事に /etc/some_directory ディレクトリが作成されました。すでにこのディレクトリがあって、パーミッションも 755 だった場合は特に何もしません。
■ まとめ
公式ドキュメントの使用例をベースにして、file モジュール の使い方を説明しました。
他に「こんなことできるかな?」と気になる事がありましたら、公式ドキュメントで詳細をご確認ください。
また、file モジュールは Files modules に分類されています。Files modules
には、他にも、指定した正規表現にマッチするすべての文字列を置換する replace や、行単位で編集する lineinfile などのモジュールがあります。詳細は Files modules の一覧からご確認ください。