読者です 読者をやめる 読者になる 読者になる

新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。気づけば社会人3年目に突入。

学習記録:Ansible

[学習記録] Ansible

参考書籍

入門Ansible

3章:複雑なplaybookを作ってみよう

繰り返し
  • with_items

一つのモジュールを何度も繰り返したいときに使用。
当てはめたいところに変数itemを使う。

tasks:
  - name: /opt/foo以下にvar, hoge, hugaディレクトリ作成
  file: path=/opt/foo{{ item }} state=directory
  with_items:
    - var
    - hoge
    - huga
  • with_nested

入れ子構造を表現する。変数にはitem[X]を使う。
例)すべてのDBに指定した複数のユーザを作る。

tasks:
  - name: 各DBにユーザを設定
    postgresql_user: db={{ item[0] }} name={{ item[1] }}
    with_nested:
      - [ 'customerdb', 'shopdb', 'productdb']
      - [ 'master', 'tenar' ]
  • with_fileglob

管理ホスト側のファイルを正規表現で指定できる。
対象ホスト側のファイルではないことに注意。

tasks:
  - copy: src={{ item }} dest=/opt/app/conf/ owner=root mode=600
    with_fileglob:
      - /opt/app/conf/*
出力を保存して後で使う
  • register

モジュールの出力を保存しておいて後で使える。

tasks:
  - name: 日付を得る
    command: date +"%Y%m%d"
    register: date
  - name: 日付が名前のファイルを作成
    file: path=/tmp/{{ date.stdout }}.log state=touch

registerに登録される内容はモジュールによって異なるので、debugモジュールでregisterの内容を見た方が良い。
基本的に標準出力を得たい場合はstdout

- debug: var=date
条件付き実行
  • when

taskを実行する条件を指定できる。

- name: gitのインストール(debian)
  apt: name=git state=installed
  when: ansible_os_family == "Debian"
- name: gitのインストール(redhat)
  yum: name=git state=installed
  when: ansible_os_family == "RedHat"

ansible_os_familyはsetupというansibleが自動で実行するモジュールによって自動で設定される変数。
registerと組み合わせたり、Jinja2の文法であるandやorをもちいて複雑な条件も指定できる。

成功するまで繰り返す
  • until

registerとuntilを使うことで、taskが終了あるいは任意の状態になるまでリトライできる。

tasks:
  - shell: /usr/bin/check
    register: result
    until: result.stdout.find ("all ok") != 1
    retries: 5
    delay: 10

/usr/bin/checkを実行し、標準出力にall okという文字列が出てくるまで10秒間隔でリトライする。

外部情報の参照
  • lookup

変数の参照に{{ }}を使ってきたが、この囲みの中に入れられるのは変数だけではない。
lookup('動作', '引数')を入れると、そのlookupの動作結果を{{}}が書かれている箇所に挿入できる。

- name: 環境変数JAVA_HOMEを表示
  debug: msg="{{ lookup('env', 'JAVA_HOME') }}
変数を処理する
  • filter

Jinja2の機能として、{{ }}の中で渡した変数に対して色々な処理が可能。
下の例はごく一部。

vars:
  filepath: /usr/bin/java
tasks:
  - name: ファイル名を取り出す
    debug: msg="{{ filepath | basename }}"
  - name: ディレクトリ名を取り出す
    debug: msg="{{ filepath | dirname }}"
キーボードから入力する
  • vars_prompt

以下のようにすると、変数usernameに入力した値が入る。
default: でデフォルトの値が設定できる。また、provate: yesで入力した文字が画面に表示されない。

vars_prompt:
  username: "ユーザ名を入力してください"
管理ホストで実行する
  • local_action

事前に送るファイルをtarで圧縮するなど、管理ホストで実行するtaskを定義。
AWS EC2との連携時などにも使う。

tasks:
  - name: ~/projectを固めておく
    local_action: command tar cvfz project.tar.gz project chdir=~/
実行モジュールを変数で変更する
  • action

今はあまり使われない。ansible_pkg_mgrを使うとapt/yumを自動指定してくれるので便利。

- name: gitをインストール
  action: "{{ ansible_pkg_mgr }} name=git"
環境変数を設定する
  • environment

HTTP_PROXYなど実行時に環境変数を設定したい場合。

tasks:
  - apt: name=git state=installed
    environment:
      http_proxy: http://hoge.example.com:8080
失敗しても無視する
  • ignore_errors

ignore_erros: yesを指定することで、失敗しても処理を続行する。
Ansibleはデフォルトで終了コードが0以外を失敗とみなすので、正常時に0以外を返すコマンドを使用する際にも使える。

非同期でtask実行
  • async

通常はplaybookを実行している間ssh接続を継続する。
しかし、taskの実行に長時間かかる場合、sshのコネクションがタイムアウトする可能性も。
asyncを使うことでいったん接続を切って非同期に動作させることが可能。

- name: ずっとスリープ
  command: sleep 60
  async: 100 # 終了を待ち受ける最大時間(sec)
  poll: 5        # task終了を確認する感覚(sec) デフォは10

pollを0にすると、終了をまたずにすぐ次のtaskを実行するような設定にできる。
高速化を図るなら非同期より--forkオプションで並列数を上げるほうが良い。