【Ansible Tower】制限で実行hostを絞りたい

####はじめに
　Ansible Towerで実行hostを絞りたい場合がありますよね。
playbookのhostやインベントリで変更することも可能ですが、
Ansible Tower上で編集した方が早くて楽なので実際にやってみましょう。

#### 参考ファイル
**(1)インベントリ**
　参考として、hostを3台分作りました。
グループ「test_group」の中に「test_host1 ～ test_host3」という3台のhostがいます。

```text
[test_group]
test_host1
test_host2
test_host3
```

**(2)playbook(test_limit.yml)**
　設定方法は後述しますが、Ansible Towerで制限を設定すると「ansible_limit([マジック変数](https://docs.ansible.com/ansible/2.9_ja/reference_appendices/special_variables.html))」
に格納されます。
hostsに「test_group」と入力されているので、デフォルトでは3台に実行します。

```yml:test_limit.yml
---
- hosts: test_group
  gather_facts: false
  tasks:
    - name: "test debug"
      debug:
        var: ansible_limit
```

#### パターン1：複数のホスト(test_host1/test_host2)を入力
　ここからは制限への入力を色々と試していきます。
Ansible Towerでは、テンプレートの設定に以下のような制限欄があるので入力します。
複数のホストに実行する場合は、カンマで区切る必要があります。

![template.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/376f90c6-d51e-8136-21d7-d28adb33f1db.png)

テンプレートの実行画面では、以下のように制限が入力されていることが確認できます。

![tower_gui.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/8e158d1c-fcc3-50e1-9bc2-3aa52269e9a5.png)

指定されていないホスト(test_host3)は、実行結果にさえ出てこなくなります。

```text:出力
PLAY [test_group] **************************************************************
TASK [test debug] **************************************************************
ok: [test_host2] => {
    "ansible_limit": "test_host1,test_host2"
}
ok: [test_host1] => {
    "ansible_limit": "test_host1,test_host2"
}
PLAY RECAP *********************************************************************
test_host1                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_host2                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

#### パターン2：グループ名(test_group)を入力

実行結果では3台に対してplaybookが実行され、ansible_limitに変数が
格納されていることが確認できます。

```text:出力
PLAY [test_group] **************************************************************
TASK [test debug] **************************************************************
ok: [test_host2] => {
    "ansible_limit": "test_group"
}
ok: [test_host3] => {
    "ansible_limit": "test_group"
}
ok: [test_host1] => {
    "ansible_limit": "test_group"
}
PLAY RECAP *********************************************************************
test_host1                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_host2                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_host3                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
```

#### パターン3：存在しないホスト名(test_host4)を入力
存在しないホスト名(test_host4)を入力してみると、そのようなホストはいない
ということでエラーになりました。

```text:出力
[WARNING]: Could not match supplied host pattern, ignoring: test_host4
ERROR! Specified hosts and/or --limit does not match any hosts
```

#### パターン4：何も入力しない
制限に何も入力しないと、そもそも**「ansible_limit」という変数自体が存在しなくなります**。
空の文字列になるわけでないので注意が必要です

```text:出力
PLAY [test_group] **************************************************************
TASK [test debug] **************************************************************
ok: [test_host2] => {
    "ansible_limit": "VARIABLE IS NOT DEFINED!"
}
ok: [test_host1] => {
    "ansible_limit": "VARIABLE IS NOT DEFINED!"
}
ok: [test_host3] => {
    "ansible_limit": "VARIABLE IS NOT DEFINED!"
}
PLAY RECAP *********************************************************************
test_host1                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_host2                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
test_host3                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
```

#### まとめ
Ansible Towerの制限機能は実行グループやホストを簡単に変更できるので便利ですね。

#### 参考記事
[特別な変数 — Ansible Documentation](https://docs.ansible.com/ansible/2.9_ja/reference_appendices/special_variables.html)