てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] Playbook の書き出しを - hosts か hosts か迷ったら

■ はじめに

このツイートの詳細です。

サンプルの 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 というのはざっくりいうと、どのターゲットに対して、何をするかという処理の単位です。以下のようなイメージです。

f:id:akira6592:20191124111940p:plain
複数 Play をまとめる Playbook

ちなみに、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 をリスト化するのが正しい