■ はじめに
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
の一覧からご確認ください。