Ansible の template ファイルで item を利用する方法


## 前書き

1つだけの単語の違いだけで template ファイルを複数用意して使うのは格好が悪いと思っていました。item を template ファイルで使えないのかと試したところ、以外と単純で簡単に使えることが最近分かりました。結果を先に言うと、with_items を用意し、template ファイルの配置したい箇所で変数 item を使うだけです。  
Vagrant を使って簡単な例を紹介します。


## 準備

### ディレクトリ構造

```tree
.
├── Vagrantfile
├── example.j2   # template ファイル
└── playbook.yml # playbook
```

### Vagrantfile

```txt:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.provision "ansible" do |ansible|                                                                                                                                                                                                                                
    ansible.playbook = "playbook.yml"                                                                                                                                                                                                                                           
  end                                                                                                                                                                                                                                                                       
end 
```

## template ファイルで item を利用する

template ファイル ( example.j2 ) を ゲスト OS の ~/ ( /home/vagrant ) 以下に配置する例です。

### 配列

```yaml:playbook.yml
- hosts: all
  user: vagrant
  tasks:
  - template: src=example.j2 dest=~/{{ item }}
    with_items:
      - John
      - Alice
```

```jinja:example.j2
{{ item }}
```

```bash:ansible-playbook
$ vagrant provision
==> default: Running provisioner: ansible...

PLAY [all] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [default]

TASK: [template src=example.j2 dest=~/{{ item }}] ***************************** 
changed: [default] => (item=John)
changed: [default] => (item=Alice)

PLAY RECAP ******************************************************************** 
default                    : ok=2    changed=1    unreachable=0    failed=0
```

```bash:ssh
$ vagrant ssh
```

```bash:結果
$ cat John 
John
$ cat Alice 
Alice
```

## 連想配列

```yaml:playbook.yml
- hosts: all
  user: vagrant
  tasks:
  - template: src=example.j2 dest=~/{{ item.name }}
    with_items:
      - {name: John, message: "Hello John!"}
      - {name: Alice, message: "Hello Alice!"}
```

```jinja:example.j2
{{ item.name }}
{{ item.message }}
```

```bash:ansible-playbook
$ vagrant provision
==> default: Running provisioner: ansible...

PLAY [all] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [default]

TASK: [template src=example.j2 dest=~/{{ item.name }}] ************************ 
changed: [default] => (item={'message': 'Hello John!', 'name': 'John'})
changed: [default] => (item={'message': 'Hello Alice!', 'name': 'Alice'})

PLAY RECAP ******************************************************************** 
default                    : ok=2    changed=1    unreachable=0    failed=0
```

```bash:ssh
$ vagrant ssh
```

```bash:結果
$ cat John 
John
Hello John!
$ cat Alice 
Alice
Hello Alice!
```