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だが、だからこそ正確な処理を実行できるといえそうだ。
以上、最低限のルールを投稿したが、さらに細かなルールについては適宜更新していくことにする。
次回投稿では実際にいろいろなモジュールを使ってサーバの設定を行ってみることにする。