ども。ansibleネタが続きますが今回は簡単に。
ファイルの存在有無で条件分岐したい
statモジュールで判定しましょう。
以下のようにstatモジュールを使います。
- path: 存在確認したいファイルパス
- register: 処理の内容を格納する変数を任意に書く(あとで分岐に使う)
- name: check file app.php stat: path: /home/tatoeba/app.php register: app_php
registerはansibleの処理結果を格納するモジュールです。
app_phpに格納された情報によって、条件分岐をします。
分岐させたいセクションの最後に、whenを使って指示します。
- name: template deploy to app.php template: src: "roles/xxx/template/{{ item.src }}" dest: "/home/tatoeba/{{ item.dest }}" with_items: - { src: app.php, dest: . } when: not app_php.stat.exists
stat.existsはstatモジュールのexists(ファイルが存在すればTrue)というプロパティを指しています。
これで実行すると、「ファイルがなければtemplate配布、あればSkip」という挙動になります。
registerの中身(おまけ)
処理結果が格納された変数には何が入っているのでしょう。
ansibleで確認するのに、debugモジュールが使えます。
- debug: var: app_php
実行してみます。
TASK [test : debug] ********************************************************* ok: [192.168.33.25] => { "app_php": { "changed": false, "failed": false, "stat": { "atime": 1523606799.0, "attr_flags": "", "attributes": [], "block_size": 4096, "blocks": 8, "charset": "utf-8", "checksum": "xxxxxxxxxxx", "ctime": 1523606799.0, "dev": 20, "device_type": 0, "executable": true, "exists": true, "gid": 500, "gr_name": "vagrant", "inode": 980, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "md5": "xxxxxxxxxxxxx", "mimetype": "text/x-php", "mode": "0777", "mtime": 1523606799.0, "nlink": 1, "path": "/home/tatoeba/app.php", "pw_name": "vagrant", "readable": true, "rgrp": true, "roth": true, "rusr": true, "size": 3863, "uid": 500, "version": null, "wgrp": true, "woth": true, "writeable": true, "wusr": true, "xgrp": true, "xoth": true, "xusr": true } } }
このファイルパスに対する様々なプロパティが取れているようです。
さきほど載せた、Ansible statモジュールで取得できる内容にあるプロパティをJSON で見れている状態です。
exists
はTrue
になっているので、この場合ファイルは存在しているということがわかります。
おわりに
簡単な話でしたが、意外と使えるので良かったら試してみてください!