registerで登録した処理結果の中を知る

## register 使用例

よく見かけるAnsibleの"register"。
使い方はだいたい以下の感じ。

```yaml:delete.yml
---
- hosts: "web"
  tasks:

  # /tmp/hoge配下のファイルリスト(*.txt)を取得
  - name: "get file list"
    find:
      paths: "/tmp/hoge"
      patterns: "*.txt"
    # 「f_list」に格納
    register: "f_list"

  # ファイルを削除
  - name: "file delete"
    file:
      # 「item」の中の「path」要素をfileモジュールのpathに入れる
      path: "{{ item.path }}"
      state: "absent"
    # 先程のファイルリストの「files」要素を「item」に入れる
    with_items: "{{ f_list.files }}"
```


## registerに登録された処理結果を知る

先の例では ```find``` モジュールの処理結果が ```f_list``` に ```register``` (登録)される。
削除処理では ```f_list``` の中に ```files``` という要素があることを示しており、 ```files``` には ```path``` という要素があるらしい。

って、本当に？を知りたい。
また他にどのような要素があるのかを知りたい。

```yaml:debug.yml
---
- hosts: "web"
  tasks:

  - name: "get file list"
    find:
      paths: "/tmp/hoge"
      patterns: "*.txt"
    register: "f_list"

  - name: "debug find"
    debug:
      msg: "{{ f_list }}"
```

```dubg: msg:``` に出すだけかーい！
で、その結果

```
# ansible-playbook -i hosts -l web debug.yml

PLAY [web] *****************************************************************

TASK [Gathering Facts] *****************************************************
ok: [192.168.200.230]

TASK [get file list] *******************************************************
ok: [192.168.200.230]

TASK [debug find] **********************************************************
ok: [192.168.200.230] => {
    "msg": {
        "changed": false,
        "examined": 3,
        "failed": false,
        "files": [
            {
                "atime": 1542122241.550976,
                "ctime": 1542123388.5329752,
                "dev": 64769,
                "gid": 0,
                "gr_name": "root",
                "inode": 1581397,
                "isblk": false,
                "ischr": false,
                "isdir": false,
                "isfifo": false,
                "isgid": false,
                "islnk": false,
                "isreg": true,
                "issock": false,
                "isuid": false,
                "mode": "0744",
                "mtime": 1541056298.0,
                "nlink": 1,
                "path": "/tmp/hoge/ccc.txt",
                "pw_name": "root",
                "rgrp": true,
                "roth": true,
                "rusr": true,
                "size": 630,
                "uid": 0,
                "wgrp": false,
                "woth": false,
                "wusr": true,
                "xgrp": false,
                "xoth": false,
                "xusr": true
            },
            {
                "atime": 1542122241.550976,
                "ctime": 1542123385.1549752,
                "dev": 64769,
                "gid": 0,
                "gr_name": "root",
                "inode": 1581396,
                "isblk": false,
                "ischr": false,
                "isdir": false,
                "isfifo": false,
                "isgid": false,
                "islnk": false,
                "isreg": true,
                "issock": false,
                "isuid": false,
                "mode": "0644",
                "mtime": 1414064490.0,
                "nlink": 1,
                "path": "/tmp/hoge/bbb.txt",
                "pw_name": "root",
                "rgrp": true,
                "roth": true,
                "rusr": true,
                "size": 647,
                "uid": 0,
                "wgrp": false,
                "woth": false,
                "wusr": true,
                "xgrp": false,
                "xoth": false,
                "xusr": false
            },
            {
                "atime": 1542122241.550976,
                "ctime": 1542123380.2449753,
                "dev": 64769,
                "gid": 0,
                "gr_name": "root",
                "inode": 1581394,
                "isblk": false,
                "ischr": false,
                "isdir": false,
                "isfifo": false,
                "isgid": false,
                "islnk": false,
                "isreg": true,
                "issock": false,
                "isuid": false,
                "mode": "0644",
                "mtime": 1414064490.0,
                "nlink": 1,
                "path": "/tmp/hoge/aaa.txt",
                "pw_name": "root",
                "rgrp": true,
                "roth": true,
                "rusr": true,
                "size": 1991,
                "uid": 0,
                "wgrp": false,
                "woth": false,
                "wusr": true,
                "xgrp": false,
                "xoth": false,
                "xusr": false
            }
        ],
        "matched": 3,
        "msg": ""
    }
}
PLAY RECAP *****************************************************************
192.168.200.230            : ok=3    changed=0    unreachable=0    failed=0
```

上記をみると ```find:``` の処理結果にはファイルのフルパスは含まれるけど ```basename``` や ```dirname``` といった要素が無いことがわかる。
特定のファイル名は削除したくない、という場合は ```when``` に ```path``` を渡しつつ正規表現でチェックするしかなさそうだ。

```is``` 系の要素を使えば ```when``` でファイルの種別判定ができそうだ。
「リンク以外を削除」であれば ```when: "{{ item.islnk }}" == false``` だろうか。

```rgrp``` 以降の要素がなんだろうと思ったけど、ファイルのパーミッションのようだ。
```aaa.txt``` は ```0644``` = ```-rw-r--r--``` なので ```rxxx``` は全部trueで、残りはユーザの書き込み権のみtrue。

ファイルがいくつ存在したのか、は ```"{{ f_list.matched }}"``` を見ればいいのかもしれない。

## 最終的には公式ドキュメントだけど

いきなり活字を読んでも眠くなるだけ。
ある程度、あたりをつけてからの方が効率的だろう。

ただ、「あたり」は必ず公式ドキュメントで裏を取るようにしないと「思い込み」になるので注意。
※ココに書いてあることはすべて「あたり」なので公式ドキュメントで裏をとってね！