VTRyo Blog

一歩ずつ前に進むブログ

Ansibleでファイルの存在有無で条件分岐させる

f:id:vtryo:20180714235526p:plain

ども。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)というプロパティを指しています。

Ansible statモジュールで取得できる内容

これで実行すると、「ファイルがなければ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 で見れている状態です。

existsTrueになっているので、この場合ファイルは存在しているということがわかります。

おわりに

簡単な話でしたが、意外と使えるので良かったら試してみてください!