■ はじめに
このツイートの詳細です。
めちゃくちゃわかります。Playbook は Play をまとめたもの、と意識するようになってから、 - hosts がぱっとでてくるようになりました。 https://t.co/E6VX3oRPF8
— よこち(yokochi) @ Ansible実践ガイド 第3版 (@akira6592) November 17, 2019
サンプルの Playbook をコピーして書いているときにはあまり気にならないものの、いざ1から Playbook を書くときに、Plybook の冒頭でいきなり悩んでしまう時期がありました。
- hosts
だったか、 hosts
だったか、という点です。
(1) こうだったか・・
- hosts: web gather_facth_no: no #...(略)...
(2) それともこうだっか・・・
hosts: web gather_facth_no: no #...(略)...
答えは (1) のハイフンありの - hosts
です。
この記事ではその理由を解説します。
- 環境
- Ansible 2.9.0
■ Playbook は Play をまとめるもの
Playbook は、1つまたは複数の Play をリスト形式でまとめるものです。
https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#playbook-language-example
Each playbook is composed of one or more ‘plays’ in a list.
おそらく、1つの Playbook の中に 複数の Play を書く機会があまりなくて、この点はあまり意識されないのかなと思います。
Play というのはざっくりいうと、どのターゲットに対して、何をするかという処理の単位です。以下のようなイメージです。
ちなみに、2つの Play を含む Playbook を実行すると、ログに 2箇所 PLAY
が出力されます、
- hosts: localhost # Play のはじまり gather_facts: no tasks: - name: task1-1 debug: msg: task1-1 - name: task1-2 debug: msg: task1-2 - hosts: localhost # Play のはじまり gather_facts: no tasks: - name: task2-1 debug: msg: task2-1 - name: task2-2 debug: msg: task2-2
- 実行ログ
$ ansible-playbook -i localhost, play.yml PLAY [localhost] ****************************************************************************** TASK [task1-1] ************************************************************************** ok: [localhost] => msg: task1-1 TASK [task1-2] ************************************************************************** ok: [localhost] => msg: task1-2 PLAY [localhost] ************************************************************************ TASK [task2-1] ************************************************************************** ok: [localhost] => msg: task2-1 TASK [task2-2] ************************************************************************** ok: [localhost] => msg: task2-2 PLAY RECAP ****************************************************************************** localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
■ 参考: PLAY にも名前を付けられる
Play の書き出しを - hosts
で始める例を見かけることが多いですが、PLAY に指定できる属性として、name
もあります。
- name: PLAY1 # Play のはじまり hosts: localhost gather_facts: no tasks: # ...(略)...
この場合は、以下のように実行ログに Play につけた name
が表示されます。
$ ansible-playbook -i localhost, play.yml PLAY [PLAY1] **************************************************************************** TASK [task1-1] ************************************************************************** ok: [localhost] => msg: task1-1
もっといってしまうと、こんなのも文法上はアリです。
- tasks: - name: task1-1 debug: msg: task1-1 name: PLAY1 hosts: localhost gather_facts: no
とにかく Play をリストで定義することが必須です。
■ まとめ
- Playbook は、1つまたは複数の Play をリスト形式でまとめるもの
- そのため
- hosts
のように-
をつけて Play をリスト化するのが正しい