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のキー値ペアは「:」で区切られている.次に例を示します.
children:
YAMLファイルの拡張子は通常.义齿yaml.
2.Ansible基礎要素
変数をrolesで渡す
ホストにロールを適用するときに変数を渡し、次に例を示します.
変数をrolesで渡す
ホストにロールを適用するときに変数を渡し、次に例を示します.
Inventory
ansibleの主な機能は、バッチホスト操作であり、一部のホストを容易に使用するためにinventory fileでグループ化して名前を付けることができます.デフォルトのinventory fileは/etc/ansible/hostsです.
inventory fileは複数あってもよく、Dynamic Inventoryで動的に生成してもよい.
inventoryファイルフォーマット
inventoryファイルはINIファイルスタイルに従い、中括弧の文字はグループ名です.同じホストを複数の異なるグループに同時に集計できます.また、ターゲットホストがデフォルト以外のSSHポートを使用している場合は、ホスト名の後にコロンとポート番号を使用して表記することもできます.
ホスト名が類似したネーミング・モードに従う場合は、リストを使用してホストを識別することもできます.たとえば、次のようにします.
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:
例2:
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と本質的に異なるものではない.
例:
スクリプトで変数を定義するには、次の手順に従います.
when
簡単な例:
task後にwhen句を追加すると条件テストが使用できます.when文はJinja 2式構文をサポートします.例:
when文では、Jinja 2のほとんどの「filter」も使用できます.たとえば、以前の文のエラーを無視し、結果(failedまたはsucess)に基づいて後で指定した文を実行するには、次のような形式を使用します.
また、when文ではfactsまたはplaybookで定義された変数を使用することもできます.
反復
反復メカニズムは、繰り返し実行が必要なタスクがある場合に使用できます.反復が必要なコンテンツをitem変数参照として定義し、with_items文は反復の要素リストを指定すればよい.例:
上の文の機能は次の文と同じです.
反復:クラスtaskを繰り返す場合に使用
呼び出し:item
ループリストの定義:with_items
- apache
- php
- mysql-server
注意:with_itemsのリスト値は辞書でもよいが、参照にはitemを使用する.KEY
tags:
Playbookでは、あるタスクまたはいくつかのタスクに「ラベル」を定義できます.このPlaybookを実行するときに、ansible-playbookコマンドに--tagsオプションを使用することで、指定したtasksのみを実行し、すべてではなく、指定したtasksのみを実行できます.
特殊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にパラメータを渡すこともできます.たとえば、次のようにします.
---
条件付きでrolesを使用することもできます.たとえば、次のようにします.
---
- hosts: webservers
roles:
- { role: some_role, when: "ansible_os_family == 'RedHat'"}
例:
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