playbook

投稿者: | 2018年1月17日

ansible系コマンドを使う場合には、yml形式で記述したplaybookというものを指定する必要がある。

ymlの中身はこんな感じ↓

[root@ansible_sv ~]# vi sample.yml
- hosts: ldap_sv
  remote_user: root

  tasks:
  - name: yum install
    yum: name=openldap-clients,openldap-servers,openssh-ldap,nscd,nss-pam-ldapd,oddjob-mkhomedir state=present

  - name: logfile
    shell: date +'%Y%m%d'
    register: date
        :
        :

このplaybookがなかなかの曲者で、ansibleの構文チェックがかなりキビシめのため、最低限気をつけるべきルールを説明する。


①モジュール

上記のplaybookを例として説明すると、
hosts:
remote_user:
tasks:

のような、末尾に「:」で記述している文字列をモジュールという。モジュールにはたくさんの種類があり、ansibleのバージョンアップごとに使えるモジュールが増えていっているようだ。
一般的な例で言えば、playbookの冒頭にhosts:などの環境設定を記述し、その次にtasks:内で指定した処理の内容を記述する。変数を使用する場合はvars:で変数を宣言することもできる。


②階層的に記述

上記playbookの例だが、いくつかのルールに沿って記述されている。

[root@ansible_sv ~]# vi sample.yml
- hosts: ldap_sv
  remote_user: root

冒頭、「-」からはじまり空白1文字分のあと「hosts:」というモジュールが記述されている。
「-」はその階層の一番初めに指定するモジュールに付与する。yml形式の階層は空白文字をモジュールの前に入れて階層を作る。シェルスクリプトとの違いといえば、{}で処理の範囲を決める必要がない(というか{}を入れるとansibleコマンド実行したときにエラーになる)。その階層より下位の階層で記述した処理内容に対して、すべて適用される。図で書くと

階層1が先頭に記述されているので、階層1で指定したモジュールはそれ以下のすべての階層に対して有効となる。(赤枠が有効範囲)
階層2-1、2-2は同じレベルの階層だが、処理として独立しているため階層2-1のモジュールは階層2-2へ影響しない。またその逆もしかり。(青枠が有効範囲)

さらにyml形式のルールとして、階層的に記述する際にモジュールの前に入れる空白は「2文字」単位が定石。
・階層1の先頭行については、空白は入れない。
・階層1の2行目は、1行目「- hosts:」のhの位置と同じになるように空白を入れてモジュールを記述すると、そのモジュールは「- hosts:」と同じ階層になる。
・階層2-xの先頭行は、階層1の「- hosts:」のhと同じ位置から「-」を入れてモジュールを指定すれば、階層が変わったと判別される。
・階層2-xの2行目は、1行目「 – name:」のnと同じ位置になるように空白を入れてモジュールを記述すると、そのモジュールは「- name:」と同じ階層になる。
・・・といった感じ。言葉で説明するととても難しいので、以下の図を参考にしてほしい。

赤文字の部分は空白の数を表している。

このルールに沿ってplaybookを記述しない(例えば空白1文字や3文字など)と、ansible系コマンド実行したときにSyntax errorなどで往々にしてはじかれてしまう。一応動作確認として、階層1から階層2-xに移るときに空白を4文字入れる分には大丈夫そう。


③コマンド系モジュールは必ず「tasks:」を始めに記述

冒頭playbookの例にも記述されているが、4行目「tasks:」は、アクセス先のホストに対して実行する処理のスタートを表す。これがないとansible系コマンドを実行した際にエラーとなるので注意。

playbookのチェックはかなりシビアなansibleだが、だからこそ正確な処理を実行できるといえそうだ。


以上、最低限のルールを投稿したが、さらに細かなルールについては適宜更新していくことにする。

次回投稿では実際にいろいろなモジュールを使ってサーバの設定を行ってみることにする。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA