メニューを閉じる

テクノデジタルグループ

メニューを開く

2015.07.03

開発環境・ツール

AnsibleのPlaybookをいい感じに管理したい

こんにちは、KTです。

前回に引き続き、Ansibleの話題です。

タイトル通り、今回はAnsibleのPlaybookをどのようにまとめるかを備忘録がてらまとめていきたいと思います。

まずは前回もちょろっと書いた、Playbookについて。

---
 # main.yml

- hosts: all
  user: vagrant
  tasks:
    - name: install
      sudo: true
      yum: name=httpd state=present

このような形で、タスクを書けばAnsibleがそのタスクを実行してくれます。

タスクは縦にどんどん並べることができるので、例えば、Vimをインストールしたければ

---
 # main.yml

- hosts: all
 user: vagrant
 tasks:
   - name: requires install
     sudo: true
     yum: name={{ item }} state=present
     with_items:
      - gcc
      - git
      - mercurial
      - ncurses-devel
      - lua
      - lua-devel
      - perl
      - perl-devel
      - perl-ExtUtils-Embed
      - python
      - python-devel
   - name: hg clone vim
     sudo: true
     shell: hg clone https://vim.googlecode.com/hg/ vim chdir=/usr/local/src

   - name: install vim
     sudo: true
     shell: ./configure --enable-multibyte --with-features=huge --disable-selinux --prefix=/usr/local --enable-luainterp=yes --with-lua-prefix=/usr --enable-perlinterp=yes --enable-rubyinterp=yes --enable-pythoninterp=yes --with-python-config-dir=/usr/lib/python2.6/config && make && make install chdir=/usr/local/src/vim

このような感じになります。上から、それぞれ依存パッケージのインストールタスク、vimソースのcloneタスク、vimのインストールタスクとなっています。

では他にMySQLのインストールも追加しましょう。じゃあPHPも。っていう感じで、どんどんタスクを並べることも出来ますが、かなり長くなりそうですよね。パッと見も分かりづらいし。

 

AnsibleのRolesを使おう

そんな時はRolesというAnsibleの機能を使うことで、任意の単位でファイルごとに分割することが出来ます。

まずはansibleを利用するトップディレクトリ(main.ymlを置いていたディレクトリ)に、roles というディレクトリを作成し、その中に機能毎のディレクトリを作っていきまっしょい。

├ main.yml
└ roles
    ├ vim
    ├ mysql
    └ php

なお、機能毎のディレクトリ名は、tasksやvarsなど、Ansibleで使われる予約語は避けましょう。

 

お察しのとおり、各機能のタスク(これをロールと呼びます)はこのディレクトリの中に作っていくわけですが、まずは、Ansibleに「タスクをここに置いてるよ!」って伝える必要があります。そのために、まずはtasksというディレクトリを作成しましょう。これでAnsibleはtasksの中にあるファイルがタスクなんだって判断してくれるようになります。CoCっぽい感じですね。

tasksディレクトリの中に置くタスクのファイルは、main.ymlという名前にしましょう。それ以外は不可です(多分)

main.ymlに書く内容は、タスクを並べるだけでOKです。hostsとかtasksとかは不要です。

先ほどの例で、Vimのタスクを作る場合は

- name: requires install
 sudo: true
 yum: name={{ item }} state=present
 with_items:
  - gcc
  - git
  - mercurial
  - ncurses-devel
  - lua
  - lua-devel
  - perl
  - perl-devel
  - perl-ExtUtils-Embed
  - python
  - python-devel

- name: hg clone vim
 sudo: true
 shell: hg clone https://vim.googlecode.com/hg/ vim chdir=/usr/local/src

- name: install vim
 sudo: true
 shell: ./configure --enable-multibyte --with-features=huge --disable-selinux --prefix=/usr/local --enable-luainterp=yes --with-lua-prefix=/usr --enable-perlinterp=yes --enable-rubyinterp=yes --enable-pythoninterp=yes --with-python-config-dir=/usr/lib/python2.6/config && make && make install chdir=/usr/local/src/vim

のようになります。

同じように、MySQL、PHPのタスクを書くと、以下のようなディレクトリ構成になります。

├ main.yml
└ roles
    ├ vim
    │  └ tasks
    │     └ main.yml
    ├ mysql
    │  └ tasks
    │     └ main.yml
    └ php
        └ tasks
          └ main.yml

rolesディレクトリに各機能のディレクトリがあって、その中にtasks、さらにその中にmain.ymlという感じです。ちなみに、各機能のディレクトリは更に階層を持たせることが出来ます。

├ main.yml
└ roles
    └ editors
        ├ vim
        │  └ tasks
        │      └ main.yml
        └ emacs
            └ tasks
                └ main.yml

のような配置も可能です。要は、rolesの下にディレクトリがあって、その中にtasksがあればOKということです。

 

これで、各タスクをファイルに分割出来ましたね。

あとは、トップディレクトリのmain.ymlで、そのロールを使うよって宣言をすれば完了です。

---
 # main.yml

- hosts: all
  user: vagrant
  roles:
    - vim
    - mysql
    - php

はい。これだけです。tasks: 〜 と書いてあった部分を、roles: に変更して、使いたいロールの名称(ディレクトリ名)を並べるだけです。トップディレクトリのmain.ymlがかなりスッキリわかりやすくなりましたね。機能を追加したり、削除したりも非常に簡単になりました。

なお、ロールがディレクトリ階層を持つ場合は、/ 区切りで書きます。先ほど例で挙げた、editorsの下にvimとemacsがある場合は、

roles:
  - editors/vim
  - editors/emacs

というふうに書きましょう。

 

変数を使いたい

さて、ここで先ほどのVimの例のタスクを見てみましょう。

- name: requires install
 sudo: true
 yum: name={{ item }} state=present
 with_items:
  - gcc
  - git
  - mercurial
  - ncurses-devel
  - lua
  - lua-devel
  - perl
  - perl-devel
  - perl-ExtUtils-Embed
  - python
  - python-devel

- name: hg clone vim
 sudo: true
 shell: hg clone https://vim.googlecode.com/hg/ vim chdir=/usr/local/src

- name: install vim
 sudo: true
 shell: ./configure --enable-multibyte --with-features=huge --disable-selinux --prefix=/usr/local --enable-luainterp=yes --with-lua-prefix=/usr --enable-perlinterp=yes --enable-rubyinterp=yes --enable-pythoninterp=yes --with-python-config-dir=/usr/lib/python2.6/config && make && make install chdir=/usr/local/src/vim

うーん。まだ長い&分かりづらいですね。まだまだ改善の余地はありそうです。

手始めに、後で変更する可能性のある requires install の with_items の中身を別ファイルに追い出してみましょう。

まずは、roles/vim の下に vars というディレクトリを作成しましょう。そうすることで Ansible が「ここに変数がある」って理解してくれます。もちろん、vars の下に置くファイルも、main.yml です。

├ main.yml
└ roles
    ├ vim
    │  ├ tasks
    │  │ └ main.yml
    │  └ vars
    │     └ main.yml
    ├ mysql
    │  └ tasks
    │     └ main.yml
    └ php
        └ tasks
          └ main.yml

こんなかんじですね。あとは、vars/main.yaml に使いたい変数を書くだけです。

---
# vim/vars/main.yml

vim_requires:
  - gcc
  - git
  - mercurial
  - ncurses-devel
  - lua
  - lua-devel
  - perl
  - perl-devel
  - perl-ExtUtils-Embed
  - python
  - python-devel
---
# vim/tasks/main.yml

- name: requires install
 sudo: true
 yum: name={{ item }} state=present
 with_items:
  - "{{ vim_requires }}"

- name: hg clone vim
 sudo: true
 shell: hg clone https://vim.googlecode.com/hg/ vim chdir=/usr/local/src

- name: install vim
 sudo: true
 shell: ./configure --enable-multibyte --with-features=huge --disable-selinux --prefix=/usr/local --enable-luainterp=yes --with-lua-prefix=/usr --enable-perlinterp=yes --enable-rubyinterp=yes --enable-pythoninterp=yes --with-python-config-dir=/usr/lib/python2.6/config && make && make install chdir=/usr/local/src/vim

このように、tasks側からは {{ 変数名 }} で呼び出すことが出来ます。with_itemsの場合は””で囲う必要がありますが、その辺はまだ良くわかってないです汗

 

最後に、install vim の設定オプションも変数に追い出しちゃいましょう。

---
# vim/vars/main.yml

vim_requires:
  - gcc
  - git
  - mercurial
  - ncurses-devel
  - lua
  - lua-devel
  - perl
  - perl-devel
  - perl-ExtUtils-Embed
  - python
  - python-devel

vim_configure_options: --enable-multibyte --with-features=huge --disable-selinux --prefix=/usr/local --enable-luainterp=yes --with-lua-prefix=/usr --enable-perlinterp=yes --enable-rubyinterp=yes --enable-pythoninterp=yes --with-python-config-dir=/usr/lib/python2.6/config
---
# vim/tasks/main.yml

- name: requires install
 sudo: true
 yum: name={{ item }} state=present
 with_items:
  - "{{ vim_requires }}"

- name: hg clone vim
 sudo: true
 shell: hg clone https://vim.googlecode.com/hg/ vim chdir=/usr/local/src

- name: install vim
 sudo: true
 shell: ./configure {{ vim_configure_options }} && make && make install chdir=/usr/local/src/vim

これでタスクの記述がかなりスッキリしましたね!何をしているかが明確に分かるようになりました!

 

他にも・・・

tasks、vars ディレクトリを作ると、Ansibleが勝手に「タスクだ!」「変数だ!」って理解してくれるって話をしましたが、もちろん他にもAnsibleが理解してくれるディレクトリが幾つかあります。今回の例では使いませんでしたが、使ったことがあるディレクトリを紹介しておきます。

・files

タスク内で copy コマンドで使用するファイルを格納します。

・templates

タスク内で template コマンドで使用するファイルを格納します。

・meta

タスクの依存関係を定義します。

 

以上!でわでわ

 

 


【記事への感想募集中!】

記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!
  • こんな記事が読んでみたい、こんなことが知りたい、調べてほしい!という意見も募集中!
  • いただいた感想は今後の記事に活かしたいと思います!

感想フォームはこちら


【テクノデジタルではエンジニア/デザイナーを積極採用中です!】

下記項目に1つでも当てはまる方は是非、詳細ページへ!
  • 自分でアプリを作ってみたい
  • ITで世の中にワクワクを生み出したい
  • 使いやすさ、デザインにこだわったWebサイトを開発したい

採用情報の詳細はこちら


Qangaroo(カンガルー)

  • 徹底した見やすさと優れた操作性で、テストの「見える化」を実現。
  • テストの進捗が見える。開発がスマートに進む。
  • クラウド型テスト管理ツール『Qangaroo(カンガルー)』

【テクノデジタルのインフラサービス】

当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。

https://www.tcdigital.jp/infrastructure/

最近の記事