2025.07.24
Log::info()が使えない!?Laravel.logのPermission denied エラーを解決する(Docker環境)
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も。っていう感じで、どんどんタスクを並べることも出来ますが、かなり長くなりそうですよね。パッと見も分かりづらいし。
そんな時は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つでも当てはまる方は是非、詳細ページへ!Qangaroo(カンガルー)
【テクノデジタルのインフラサービス】
当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。
最近の記事
タグ検索