<commit_before>---
layout: post
title: Playbookファイル
date: 2016-08-03
tags: ansible
category: プロビジョニング
---

### Playbookファイル

***YAML形式でアドホックタスクを記述するファイル***

[参照： Playbooks — Ansible Documentation](http://docs.ansible.com/ansible/playbooks.html)

例

```
- hosts: all          # 対象を指定
  become: yes           # sudoで実行
  remote_user: user   # 実行ユーザ名
  vars:               # 変数の指定
    username: newuser
  tasks:              # 実行タスクの指定
    - name: ユーザ追加  # 実行タスク名
      user: name={{ username }} group=admin shell=/bin/bash
```

#### targetセクション

 - 実行対象を設定するセクション。先の例では以下の部分。
 - hostsで対象を指定し、sudoの実行とログインユーザを指定している。
 - 最低限必要なのはhostsのみ。

```
- hosts: all         # 対象を指定
  become: yes        # sudoで実行
  remote_user: user  # 実行ユーザ名
```

#### varsセクション

 - 変数を設定するセクション。先の例では以下の部分。
 - 先の例ではusernameという変数にnewuserという値を入れている
 - varsは複数指定・入れ子構造が可能
 - 変数の使用時には{{ }}で囲む。入れ子の場合は.で子を指定する（shell.zshなど）
 - 変数を文の先頭で使用する場合は、文全体を""で囲む必要があるので注意
 - var_files: で別ファイルから読み込むことも可能

```
  vars:                       # 変数の指定
    username: newuser
```

#### tasksセクション

 - そのplaybookで実行するtaskを指定
 - taskは一つのモジュールとそれに対する引数で構成される、一つの動作を行う最小単位
 - 先の例（下）ではnameでタスク名を指定し、userモジュールとその引数からなるtaskを記述
 - name：必須ではないが、付けておくと後でわかりやすい
 - user：この例での実行モジュール。name, group, shellはuserモジュールの引数
 - もちろん複数のtaskを実行することも可能（インデントを揃える）
 
```
  tasks:                        # 実行タスクの指定
    - name: ユーザ追加  # 実行タスク名
      user: name={{ username }} group=admin shell=/bin/bash
#  - name: hogehoge
#    次のtaskを書くときはこんな風に書く
```
#### task
- taskの実行順序
   - hosts: allに対しtaskAとBの二つが定義されているymlファイルを実行すると、
   - １）全ホストでtask Aを実行
   - ２）全ホストでtask Aが終わるのを待ち、続いて全ホストでtask Bを実行
   - という順序になるため、動作の遅いホストがあるとplaybook全体の実行時間が遅くなる
   - あるホストでtask Aの実行が失敗した場合、そのホスト以外は次のtask Bから実行していく
 - taskごとの設定
   - 先の例ではtargetセクションでsudoなどを設定
   - tasks: の各task以下にsudo: などを書くことでtaskごとに設定をすることも可能
   - 両方設定がある場合、taskごとの設定が優先される

#### handler
 - 設定ファイルを書き換えた後に再起動したい
   -その場合、複数の設定ファイルを書き換えた後に再起動したくなる
   - このような場合にhandlerを使う
  - notifyが指定されたtaskが実行されうと、指定されたnameが付いているhandlerが実行される

```
---
- hosts: all
  tasks:
    - name: 設定ファイルをコピー
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify: reboot apache
    - name: ownerの設定
      file: dest=/etc/httpd/conf/httpd.conf owner=httpd state=file
      notify: reboot apache
  handlers:
    - name: reboot apache
      service: name=httpd state=restarted
```

 - 上の例
 - 設定ファイルをコピー後、ownerをhttpdに変更
 - 両方のタスクでapacheを再起動するhandlerのnotifyを設定
 - どちらかのタスクで変化があった場合、apacheの再起動が一度だけ実行される
 - 変化がなかった場合は再起動されない
 - handlerの書き方はtaskと同じだが、notifyで指定するのでnameが必須
 - notify: 以下にシーケンスを階層構造で複数配置することで複数のhandlerを起動できる

#### よく使うモジュール

 - 初期状態で200以上のモジュールが使用可能
    - 以下、よく使うモジュールを説明
    
 - script
    - 管理ホストにあるスクリプトを対象ホストに転送し、対象ホスト上で実行
    - 対象シェルスクリプトを指定。引数createsでファイルを指定すると、そのファイルがあった場合実行をスキップする
    - スクリプト内部で最後に作るファイルを指定すれば、べき等性も備えられる
 - command
    - 任意のコマンドを対象ホストで実行
    - 実行するコマンドを指定。同じく引数createsがある。またchdir引数はそのディレクトリに移動後コマンドを実行する。
    - リダイレクトやパイプは使用できない
 - shell
    - 任意のコマンドを実行
    - commandモジュールとの違いは、パイプやリダイレクトが使える
 - file
    - ファイルやディレクトリの作成、ownerやgroupの変更、シンボリックリンクの作成など
 - copy
    - 管理ホストのファイルを対象ホストにコピー
 - fetch
    - 対象ホストから管理ホストにファイルを転送
    - ログの収集などに便利
 - template
    - Jinja2というテンプレート言語を使用して対象ホストでファイルを生成する
 - get_url
    - 指定したURLからファイルをダウンロード
 - lineinfile
    - ファイル中の任意の一行を設定あるいは削除する
    - 設定する行は正規表現で指定
    - 複数行にマッチする置換を実行しても、最後の一つしか置換されない
    - 複数行の置換にはreplaceモジュールを使う
 - unarchive
    - 管理ホストのアーカイブファイルを対象ホストに転送し展開する
 - yum
    - yumコマンドを使ってパッケージをインストールする
 - service
    - serviceコマンドを使ってサービスを管理
    - 引数sleepでstopとstartの間に指定秒数だけ待つ
 - user
    - ユーザを追加・削除する
    - 引数passwordでパスワードを設定可能（ハッシュ可されている必要あり）
    - authorized_key
    - SSHのauthorized keyを追加、削除する
 - wait_for
    - 秒数ではなく、portが開くまで、あるいはファイルが作られるまで待つという動作を行う
    - 例えばsshが使えるようになるまで、あるいはログに"complete"が表示されるまで待つなど
    - 時間で待つならcommandモジュールでsleepを指定するのが簡単
 - debug
    - 任意の内容を表示
    - 引数msgに入力した内容を表示。変数の確認などに使えるが、日本語はNG
  
  
  
  
  
  
  
  
  
  
  
  
    mail.example.com

    [webservers]
    foo.example.com
    bar.example.com

    [dbservers]
    one.example.com
    two.example.com
    three.example.com

- ホストの設定
   - target-host: 任意のAnsible上でのターゲット・ホスト名。ansible_hostを指定しない場合、この名前が接続用の実ホスト名となる。
   - ansible_host: 実接続用のホスト名（vagrant ssh-configのホスト名に対応）
   - ansible_port: 接続用ポート番号
   - ansible_user: ログインユーザー名
   - ansible_connection: 接続形式


    [targets]

    localhost              ansible_connection=local
    other1.example.com     ansible_connection=ssh        ansible_user=mpdehaan
    other2.example.com     ansible_connection=ssh        ansible_user=mdehaan
    
> 
[パラメータ詳細は以下を参照  
List of Behavioral Inventory Parameters](http://docs.ansible.com/ansible/intro_inventory.html#list-of-behavioral-inventory-parameters)  

- 備考
  
 ***Note  
The become syntax deprecates the old sudo/su specific syntax beginning in 1.9.***

 ***New in version 2.1.  
ansible_shell_executable
This sets the shell the ansible controller will use on the target machine, overrides executable in ansible.cfg which defaults to /bin/sh. You should really only change it if is not possible to use /bin/sh (i.e. /bin/sh is not installed on the target machine or cannot be run from sudo.).***

 [※動的なInventory設定は以下を参照
 DynamicInventory](http://docs.ansible.com/ansible/intro_dynamic_inventory.html)<commit_msg>no message<commit_after>---
layout: post
title: Playbookファイル
date: 2016-08-03
tags: ansible
category: プロビジョニング
---

### Playbookファイル

***YAML形式でアドホックタスクを記述するファイル***

[参照： Playbooks — Ansible Documentation](http://docs.ansible.com/ansible/playbooks.html)

例

```
- hosts: all          # 対象を指定
  become: yes           # sudoで実行
  remote_user: user   # 実行ユーザ名
  vars:               # 変数の指定
    username: newuser
  tasks:              # 実行タスクの指定
    - name: ユーザ追加  # 実行タスク名
      user: name={{ username }} group=admin shell=/bin/bash
```

#### targetセクション

 - 実行対象を設定するセクション。先の例では以下の部分。
 - hostsで対象を指定し、sudoの実行とログインユーザを指定している。
 - 最低限必要なのはhostsのみ。

```
- hosts: all         # 対象を指定
  become: yes        # sudoで実行
  remote_user: user  # 実行ユーザ名
```

#### varsセクション

 - 変数を設定するセクション。先の例では以下の部分。
 - 先の例ではusernameという変数にnewuserという値を入れている
 - varsは複数指定・入れ子構造が可能
 - 変数の使用時には{{ }}で囲む。入れ子の場合は.で子を指定する（shell.zshなど）
 - 変数を文の先頭で使用する場合は、文全体を""で囲む必要があるので注意
 - var_files: で別ファイルから読み込むことも可能

```
  vars:                       # 変数の指定
    username: newuser
```

#### tasksセクション

 - そのplaybookで実行するtaskを指定
 - taskは一つのモジュールとそれに対する引数で構成される、一つの動作を行う最小単位
 - 先の例（下）ではnameでタスク名を指定し、userモジュールとその引数からなるtaskを記述
 - name：必須ではないが、付けておくと後でわかりやすい
 - user：この例での実行モジュール。name, group, shellはuserモジュールの引数
 - もちろん複数のtaskを実行することも可能（インデントを揃える）
 
```
  tasks:                        # 実行タスクの指定
    - name: ユーザ追加  # 実行タスク名
      user: name={{ username }} group=admin shell=/bin/bash
#  - name: hogehoge
#    次のtaskを書くときはこんな風に書く
```

#### task
- taskの実行順序
   - hosts: allに対しtaskAとBの二つが定義されているymlファイルを実行すると、
   - １）全ホストでtask Aを実行
   - ２）全ホストでtask Aが終わるのを待ち、続いて全ホストでtask Bを実行
   - という順序になるため、動作の遅いホストがあるとplaybook全体の実行時間が遅くなる
   - あるホストでtask Aの実行が失敗した場合、そのホスト以外は次のtask Bから実行していく
 - taskごとの設定
   - 先の例ではtargetセクションでsudoなどを設定
   - tasks: の各task以下にsudo: などを書くことでtaskごとに設定をすることも可能
   - 両方設定がある場合、taskごとの設定が優先される

#### handler
 - 設定ファイルを書き換えた後に再起動したい
   -その場合、複数の設定ファイルを書き換えた後に再起動したくなる
   - このような場合にhandlerを使う
  - notifyが指定されたtaskが実行されうと、指定されたnameが付いているhandlerが実行される

```
---
- hosts: all
  tasks:
    - name: 設定ファイルをコピー
      copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify: reboot apache
    - name: ownerの設定
      file: dest=/etc/httpd/conf/httpd.conf owner=httpd state=file
      notify: reboot apache
  handlers:
    - name: reboot apache
      service: name=httpd state=restarted
```

 - 上の例
 - 設定ファイルをコピー後、ownerをhttpdに変更
 - 両方のタスクでapacheを再起動するhandlerのnotifyを設定
 - どちらかのタスクで変化があった場合、apacheの再起動が一度だけ実行される
 - 変化がなかった場合は再起動されない
 - handlerの書き方はtaskと同じだが、notifyで指定するのでnameが必須
 - notify: 以下にシーケンスを階層構造で複数配置することで複数のhandlerを起動できる

#### よく使うモジュール

 - 初期状態で200以上のモジュールが使用可能
    - 以下、よく使うモジュールを説明
    
 - script
    - 管理ホストにあるスクリプトを対象ホストに転送し、対象ホスト上で実行
    - 対象シェルスクリプトを指定。引数createsでファイルを指定すると、そのファイルがあった場合実行をスキップする
    - スクリプト内部で最後に作るファイルを指定すれば、べき等性も備えられる
 - command
    - 任意のコマンドを対象ホストで実行
    - 実行するコマンドを指定。同じく引数createsがある。またchdir引数はそのディレクトリに移動後コマンドを実行する。
    - リダイレクトやパイプは使用できない
 - shell
    - 任意のコマンドを実行
    - commandモジュールとの違いは、パイプやリダイレクトが使える
 - file
    - ファイルやディレクトリの作成、ownerやgroupの変更、シンボリックリンクの作成など
 - copy
    - 管理ホストのファイルを対象ホストにコピー
 - fetch
    - 対象ホストから管理ホストにファイルを転送
    - ログの収集などに便利
 - template
    - Jinja2というテンプレート言語を使用して対象ホストでファイルを生成する
 - get_url
    - 指定したURLからファイルをダウンロード
 - lineinfile
    - ファイル中の任意の一行を設定あるいは削除する
    - 設定する行は正規表現で指定
    - 複数行にマッチする置換を実行しても、最後の一つしか置換されない
    - 複数行の置換にはreplaceモジュールを使う
 - unarchive
    - 管理ホストのアーカイブファイルを対象ホストに転送し展開する
 - yum
    - yumコマンドを使ってパッケージをインストールする
 - service
    - serviceコマンドを使ってサービスを管理
    - 引数sleepでstopとstartの間に指定秒数だけ待つ
 - user
    - ユーザを追加・削除する
    - 引数passwordでパスワードを設定可能（ハッシュ可されている必要あり）
    - authorized_key
    - SSHのauthorized keyを追加、削除する
 - wait_for
    - 秒数ではなく、portが開くまで、あるいはファイルが作られるまで待つという動作を行う
    - 例えばsshが使えるようになるまで、あるいはログに"complete"が表示されるまで待つなど
    - 時間で待つならcommandモジュールでsleepを指定するのが簡単
 - debug
    - 任意の内容を表示
    - 引数msgに入力した内容を表示。変数の確認などに使えるが、日本語はNG
  
- 備考
  
 ***Note  
The become syntax deprecates the old sudo/su specific syntax beginning in 1.9.***

{'fraction_non_alphanumeric': 0.08636363636363636, 'fraction_numerical': 0.003896103896103896, 'mean_word_length': 3.3283372365339576, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 4, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1437260', 'n_tokens_mistral': 5767, 'n_tokens_neox': 5518, 'n_words': 518}