SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Ansible】入門③ PlaybookとYAMLについて


今回は、初めてAnsibleを学ぶ上では最重要になると思われるPlaybookの基本的な記述方法の中のYAML記述について確認していきます。

Playbook

PlaybookはAnsibleにおける指示書の役割を果たします。
つまりはターゲットノードに対して行いたい処理(作業)の内容を記述していくことになります。

Ansibleを初めて学習する場合には、最初の学習の中心になるのではないかと思っています。

YAML

Playbookの記述にはYAML形式という記述方法が採用されています。

・Playbookの例

---
- hosts: webservers
  remote_user: root

  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf

- hosts: databases
  remote_user: root

  tasks:
  - name: ensure postgresql is at the latest version
    yum:
      name: postgresql
      state: latest
  - name: ensure that postgresql is started
    service:
      name: postgresql
      state: started

引用元:Playbook の概要 — Ansible Documentation


一般的に可読性が高く、学習コストが低いと言われてはいますが、それでもこれまであまり触れてこなかった場合には読みはまだしも書きに不自由を感じる気がするのでここではYAMLの基本の基本を軽く確認していきたいと思います。
恐らくすっ飛ばしも問題はないと思いますが、今後のAnsible学習を少しでもスムーズにするために。

また、ここでは一般的なYAMLの文法を確認していくのでPlaybook独自の文法は扱いません。

なおここではYAMLの構造確認のために以下のpythonファイルを実行します。

・test.py

import yaml

with open('input.yml') as file:
    obj = yaml.safe_load(file)
    print(obj)

実行時の様子。

[ansusr@ctl-node ymlplay]$ python test.py
{'y': 100, 'x': 'XXX', 'z': 200}

YAMLファイルであるinput.ymlの方をいじって遊びます。

■インデント

YAMLではインデントによって階層構造の制御を行います。
インデントのみで階層構造を記述できるのは可読性が高いと言われるゆえんの一つですかね。
なお、YAMLではインデントはスペースで記述し、tabは受け付けないそうです。

・input.yml

x: 000
y: 100
z: 200
{'y': 100, 'x': 0, 'z': 200}

このことからPlaybookでも見かける以下のような記述方法はネストを表していることが分かります。

・input.yml

x: 000
y: 100
z:
 a: 200
 b: 201
 c: 202
{'y': 100, 'x': 0, 'z': {'a': 200, 'c': 202, 'b': 201}}

■-(ハイフン)

Playbookの記述ではハイフンが使用されているところをよく見ますが、これは配列を表しています。
以下の記述で、xからzまでで配列の一つの要素とみなされます。

・input.yml

- x: 000
  y: 100
  z: 200
[{'y': 100, 'x': 0, 'z': 200}]

少し書き方を変えて以下のように記述するとそれぞれが配列の一つの要素として認識されます。

・input.yml

- x: 000
- y: 100
- z: 200
[{'x': 0}, {'y': 100}, {'z': 200}]

特定の要素に配列値を持たせるには以下のように記述することができます。

・input.yml

x: 000
y: 100
z:
 - 200
 - 201
 - 202
{'y': 100, 'x': 0, 'z': [200, 201, 202]}

■Playbookの構造確認

冒頭のPlaybookの例の一部の構造を確認すると以下のようになります。
なんとなく意味は分かるようになった気がしますね。

・input.yml

- hosts: webservers
  remote_user: root

  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf
[
	{
		'tasks': [
			{
				'yum': {
					'state': 'latest', 'name': 'httpd'
				}, 
				'name': 'ensure apache is at the latest version'
			}, 
			{
				'name': 'write the apache config file', 'template': {
					'dest': '/etc/httpd.conf', 'src': '/srv/httpd.j2'
				}
			}
		], 
		'hosts': 'webservers', 'remote_user': 'root'
	}
]

※出力は適当に手動整形しています。

少し長くなりそうなので一旦区切ります。

・前回
www.wantanblog.com

・次回
www.wantanblog.com

■参考書籍