今回は、初めて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' } ]
※出力は適当に手動整形しています。
少し長くなりそうなので一旦区切ります。
■参考書籍