AnsibleのYMAL文法の紹介とplaybookの詳細:

8657 ワード

1.YAML紹介
YAMLは可読性の高いデータ系列を表すフォーマットです.YAMLは、XML、C言語、Python、Perl、電子メールフォーマットRFC 2822など、他の多くの言語を参照しています.Clark Evansは2001年に初めてこの言語を発表した.またIngy dt NetとOren Ben-Kikiもこの言語の共同設計者である.
YAML Ain't Markup Language、すなわちYAMLはXMLではない.しかし、このような言語を開発した場合、YAMLの意味は「Yet Another Markup Language」(依然としてマーク言語)である.機能:
YAMLの読みやすさが良い
YAMLとスクリプト言語のインタラクティビティが良い
YAML実装言語を使用したデータ型
YAMLには一貫した情報モデルがあります
YAMLの実現が容易
YAMLはストリームに基づいて処理できる
YAMLは表現力が強く、拡張性が良い
詳細および仕様については、http://www.yaml.org.
YAML構文
YAMLの構文は他の高次言語と類似しており,リスト,ハッシュリスト,スカラーなどのデータ構造を簡単に表現できる.その構造(Structure)はスペースで示され、シーケンス(Sequence)の項目は「-」で表され、Mapのキー値ペアは「:」で区切られている.次に例を示します.
name: John Smith
age: 41
gender: Male
spouse:
    name: Jane Smith
    age: 37
    gender: Female

children:
    -   name: Jimmy Smith
        age: 17
        gender: Male
    -   name: Jenny Smith
        age 13
        gender: Female

YAMLファイルの拡張子は通常.义齿yaml.
2.Ansible基礎要素
変数をrolesで渡す
ホストにロールを適用するときに変数を渡し、次に例を示します.
- hosts: webservers
  roles:
    - common
    - { role: foo_app_instance, dir: '/web/htdocs/a.com',  port: 8080

変数をrolesで渡す
ホストにロールを適用するときに変数を渡し、次に例を示します.
- hosts: webservers
  roles:
    - common
    - { role: foo_app_instance, dir: '/web/htdocs/a.com',  port: 8080

 
Inventory
ansibleの主な機能は、バッチホスト操作であり、一部のホストを容易に使用するためにinventory fileでグループ化して名前を付けることができます.デフォルトのinventory fileは/etc/ansible/hostsです.
inventory fileは複数あってもよく、Dynamic Inventoryで動的に生成してもよい.
inventoryファイルフォーマット
inventoryファイルはINIファイルスタイルに従い、中括弧の文字はグループ名です.同じホストを複数の異なるグループに同時に集計できます.また、ターゲットホストがデフォルト以外のSSHポートを使用している場合は、ホスト名の後にコロンとポート番号を使用して表記することもできます.
ntp.magedu.com
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com

ホスト名が類似したネーミング・モードに従う場合は、リストを使用してホストを識別することもできます.たとえば、次のようにします.
[webservers]
www[01:50].example.com
[databases]
db-[a:f].example.com

3.ansible playbooks
Playbookの構成構造:
    Inventory
    Modules
     Ad Hoc Commands
    Playbooks
Tasks:タスク、すなわちモジュールが完了したアクションを呼び出す
Variables:変数
Templates:テンプレート
Handlers:プロセッサ、イベントによって実行されるアクション
Roles:ロール
基本構造:
- host: websrvs
 remote_user:
 tasks: 
 - task1
  module_name: module_args
 - task 2
例1:
- hosts: webservs
  remote_user: root
  tasks:
  - name: create nginx group
    group: name=nginx system=yes gid=208
  - name: create nginx user
    user: name=nginx uid=208 group=nginx system=yes
- hosts: dbservs
  remote_user: root
  tasks:
  - name: copy file to dbservs
    copy: src=/etc/inittab dest=/tmp/inittab.ansible

例2:
- hosts: webservs
  remote_user: root
  tasks:
  - name: install httpd package
    yum: name=httpd state=latest
  - name: install configuration file for httpd
    copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/httpd.conf
  - name: start httpd service
    service: enabled=true name=httpd state=started

handlers
注目するリソースが変化した場合に一定の操作を行うために使用されます.
「notify」というactionは、各プレイの最後にトリガーされるために使用することができ、これにより、複数回の変更が発生した場合に毎回指定された操作を実行することを回避し、代わりに、すべての変更が完了した後に一度に指定された操作を実行することができる.notifyにリストされる操作をhandler、すなわちnotifyでhandlerで定義された操作を呼び出す.
- name: template configuration file
 template: src=template.j2 dest=/etc/foo.conf
 notify:
    - restart memcached
    - restart apache
handlerはtaskリストであり、これらのtaskは前述のtaskと本質的に異なるものではない.
handlers:
    - name: restart memcached
      service:  name=memcached state=restarted
    - name: restart apache
      service: name=apache state=restarted

例:
- hosts: webservs
  remote_user: root
  tasks:
  - name: install httpd package
    yum: name=httpd state=latest
  - name: install configuration file for httpd
    copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart httpd
  - name: start httpd service
    service: enabled=true name=httpd state=started
  handlers:
  - name: restart httpd
    service: name=httpd state=restarted

スクリプトで変数を定義するには、次の手順に従います.
- hosts: webservs
  remote_user: root
  vars:
  - package: httpd
  - service: httpd
  tasks:
  - name: install httpd package
    yum: name={{ package }} state=latest
  - name: install configuration file for httpd
    copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart httpd
  - name: start httpd service
    service: enabled=true name={{ service }} state=started
  handlers:
  - name: restart httpd
    service: name=httpd state=restarted

when 
簡単な例:
- hosts: all
  remote_user: root
  vars:
  - username: user10
  tasks:
  - name: create {{ username }} user
    user: name={{ username }}
    when: ansible_fqdn == "node2.magedu.com"

task後にwhen句を追加すると条件テストが使用できます.when文はJinja 2式構文をサポートします.例:
tasks:
  - name: "shutdown Debian flavored systems"
    command: /sbin/shutdown -h now
    when: ansible_os_family == "Debian"

when文では、Jinja 2のほとんどの「filter」も使用できます.たとえば、以前の文のエラーを無視し、結果(failedまたはsucess)に基づいて後で指定した文を実行するには、次のような形式を使用します.
tasks:
  - command: /bin/false
    register: result
    ignore_errors: True
  - command: /bin/something
    when: result|failed
  - command: /bin/something_else
    when: result|success
  - command: /bin/still/something_else
    when: result|skipped

また、when文ではfactsまたはplaybookで定義された変数を使用することもできます.
反復
反復メカニズムは、繰り返し実行が必要なタスクがある場合に使用できます.反復が必要なコンテンツをitem変数参照として定義し、with_items文は反復の要素リストを指定すればよい.例:
- name: add several users
  user: name={{ item }} state=present groups=wheel
  with_items:
     - testuser1
     - testuser2

上の文の機能は次の文と同じです.
- name: add user testuser1
  user: name=testuser1 state=present groups=wheel
- name: add user testuser2
  user: name=testuser2 state=present groups=wheel

反復:クラスtaskを繰り返す場合に使用
呼び出し:item
ループリストの定義:with_items
- apache
- php
- mysql-server
注意:with_itemsのリスト値は辞書でもよいが、参照にはitemを使用する.KEY
- {name: apache, conf: conffiles/httpd.conf}
- {name: php, conf: conffiles/php.ini}
- {name: mysql-server, conf: conffiles/my.cnf}

tags:
Playbookでは、あるタスクまたはいくつかのタスクに「ラベル」を定義できます.このPlaybookを実行するときに、ansible-playbookコマンドに--tagsオプションを使用することで、指定したtasksのみを実行し、すべてではなく、指定したtasksのみを実行できます.
- name: install configuration file for httpd
template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
tags:
- conf

特殊tags:always
roles
ansilbeは1.2バージョンから導入された新しい特性で、playbookを階層的かつ構造的に組織するために使用されています.rolesは、階層型構造に基づいて変数ファイル、tasks、handlersなどを自動的にロードできます.rolesを使用するにはplaybookでincludeコマンドを使用するだけです.簡単に言えば、rolesは、変数、ファイル、タスク、モジュール、プロセッサを個別のディレクトリに配置し、cludeを容易にincludeできるメカニズムです.ロールは、通常、ホストベースのサービスを構築するシーンで使用されますが、デーモンプロセスなどのシーンでも使用できます.
rolesの例は次のとおりです.
site.yml
webservers.yml
fooservers.yml
roles/
  common/
    files/
    templates/
    tasks/
    handlers/
    vars/
    meta/
  webservers/
    files/
    templates/
    tasks/
    handlers/
    vars/
    meta/
Playbookではrolesをこのように使用できます.
---
- hosts: webservers
 roles:
    - common
    - webservers
rolesにパラメータを渡すこともできます.たとえば、次のようにします.
---
- hosts: webservers
  roles:
    - common
    - { role: foo_app_instance, dir: '/opt/a',  port: 5000 }
    - { role: foo_app_instance, dir: '/opt/b',  port: 5001 }

条件付きでrolesを使用することもできます.たとえば、次のようにします.
---
- hosts: webservers
 roles:
   - { role: some_role, when: "ansible_os_family == 'RedHat'"}
例:
[root@hzm ~]# tree ansible_playbooks/
ansible_playbooks/
└── roles
    ├── dvsrvs
    │   ├── files #   copy script        ;
    │   ├── handlers  #          main.yml  ,           handler; handler   include      handler           ;
    │   ├── meta  #      main.yml  ,                  ;ansible 1.3          ;
    │   ├── tasks    #          main.yml   ,            ;       include            task  ;
    │   ├── templates  #template            Jinja2    ;
    │   └── vars  #      main.yml  ,            
    └── websrvs
        ├── files
        ├── handlers
        ├── meta
        ├── tasks
        ├── templates
        └── vars