備忘録　ChefのFile.joinと同じような事をAnsibleのYAMLでやりたい

Ansibleを初めて、基本的な動きはおおよそ理解できてきましたが、どうしても良く分からなかったことは、「ChefのFile.joinと同じような事をAnsibleのYAMLではどうやるのか？」ということ。

例えば、ChefでAttributeの値を複数並べてディレクトリパスを設定したい場合
attributesファイルに設定しておけば、

```
default['linuxos']['work_dir'] = '/work'
default['linuxos']['file_name'] = 'file.txt'
```

レシピの中で、以下のようにFile.joinメソッドを利用することで、/work/file.txtというパスを設定することができる。

```
file = File.join(node['linuxos']['work_dir'],node['linuxos']['file_name']) 
```

これと同じ事をAnsibleでもやりたかったのですが、意外とはまりました。。。。

#1. 失敗したyamlの内容

変数は、"{{ 変数名 }} "と囲むのであれば、"{{ 変数1 }}"/"{{ 変数2 }}" みたいな書き方でいいかと思っていました。

- 作成したコード

```install.yml
---

- hosts: web
  remote_user: ansible
  become: true
  tasks:
   - name: copy zaibbix install
     copy:
       src: "{{ files_dir}}"/"{{ zabbix_cl_mod }}"
       dest: "{{ dest_dir }}"

   - name: install zabbix agent
     yum:
       name: "{{dest_dir}}"/"{{zabbix_cl_mod}}"
       state: present
```

- 変数ファイル

```all.yml
---
files_dir: /home/ansible/playbooks/files
zabbix_cl_mod: zabbix-agent-3.2.11-1.el7.x86_64.rpm
dest_dir: /tmp
mode: 0644
```

- 実行結果

```
$ ansible-playbook -i hosts ./tasks/zabbix/install.yml  -K
SUDO password:
ERROR! Syntax Error while loading YAML.


The error appears to have been in '/home/ansible/playbooks/tasks/zabbix/install.yml': line 10, column 29, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

       src: "{{ files_dir}}"/"{{ zabbix_cl_mod }}"
                            ^ here
We could be wrong, but this one looks like it might be an issue with
missing quotes.  Always quote template expression brackets when they
start a value. For instance:

    with_items:
      - {{ foo }}

Should be written as:

    with_items:
      - "{{ foo }}"

exception type: <class 'yaml.parser.ParserError'>
exception: while parsing a block mapping
  in "<unicode string>", line 10, column 8
did not find expected key
  in "<unicode string>", line 10, column 29
```

変数と変数の間のスラッシュ（/）が問題なのか、エラーとなりました。


```
src: "{{ files_dir}}"/"{{ zabbix_cl_mod }}"
                     ^ here
```


どうやら、変数を2つつなげるときは、このやり方ではないようです。。。。

#2. 成功したyamlの内容

実は、"{{ files_dir}}"/"{{ zabbix_cl_mod }}"　ではなく
　　　"{{ files_dir}}/{{ zabbix_cl_mod }}"　
と、ダブルクォーテーションは変数ごとではなく変数の最初と、つなげたあとの変数の最後で囲めばよかったようです。

- 修正したplaybook

```install.yml
---

- hosts: web
  remote_user: ansible
  become: true
  tasks:
   - name: copy zaibbix install
     copy:
       src: "{{ files_dir}}/{{ zabbix_cl_mod }}"
       dest: "{{ dest_dir }}"

   - name: install zabbix agent
     yum:
       name: "{{dest_dir}}/{{zabbix_cl_mod}}"
       state: present
```

- 実行結果

```
$ ansible-playbook -i hosts ./tasks/zabbix/install.yml  -K
SUDO password:

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

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

TASK [copy zaibbix install] **********************************************************************
ok: [brighton002]

TASK [install zabbix agent] **********************************************************************
changed: [brighton002]

PLAY RECAP *****************************************************************************
brighton002                : ok=3    changed=1    unreachable=0    failed=0
```

エラー無く実行することができました！


時間がかかりましたが、なんとかうまくできてよかったです。
今回は、teraailで質問して解決できまいしたが、ちょっとした発想の転換がたりなかったようです。