Ansibleのオプションとシェルスクリプトに対する優位性

Ansibleを使うと、シェルスクリプトと比べて何がうれしいのでしょうか。 超基本ですが、あえて書いてみます。

Ansibleでは、Inventoryで対象ホストを指定し、Playbookと呼ばれるスクリプトに書いたタスクを実行します。 その際に、実行オプションを指定することで、内容確認や、タスク実行方法を変える事が出来ます。 つまり、シェルスクリプトより柔軟に作業を行う事ができます。

$ ansible-playbook (オプション) -i (Inventory) (Playbook)

以下に、具体的なオプションを挙げてみます。

確認

これから実行しようとしている作業を確認する事ができます。

オプション 意味
--list-hosts 実行対象ホストを確認する
--list-tasks 実行タスクを確認する
-C, --check タスクを実行せずに実行チェックのみ行う(ドライラン)

実行方法

タスクの実行方法を指定する事が可能です。

オプション 意味
--step タスクをステップ実行する
-t TAGS, --tags=TAGS 指定したタグが付いたタスクを実行する

対象ホストとタスクが分離されており、さらにオプションも充実しているので、シェルスクリプトのように、秘伝のタレ化する事を防ぐことができます。

ちなみに、Ansibleのオプションは、以下のコマンドで確認可能です。

$ ansible-playbook

システムエンジニアとしての逆境に対処すべく最近読んでいる3冊の本

システムエンジニアをしていると、技術にあまり関心がない上司や、システムをあまり理解していないユーザ要求とかで、エンジニアには理解し難い局面に遭遇することがある。その逆境に対処するための心の持ち方について書いてみる。

結局、理想通りには行かないので、その状況でベストを尽くし、次につなげるかかなと思う。 多少不満があるからといって、そのせいにしてパフォーマンスを落とすのは得策ではない。 少し迷った時に、最近これらの本を読んでいる。

そもそも、今の会社に勤めているのは自分の選択の結果であって、不満があるなら、より自分に合っている会社に転職すると良い。そのために転職できるだけの実力を身につければいい。だが、仕事の能力は、主に仕事を通じて身に付くので、現在置かれている状況で高いパフォーマンスを発揮する必要がある。

レジリエンスの鍛え方

国内外で企業の要職を担うビジネスリーダーを排出し続けている外資系企業P&Gに16年勤めた経験に基づく著作。 成功の鍵は責任にあり、著者が見てきた真のリーダーは責任を回避しなかった。そして、失敗してもすぐに立ち直り次の成功へ結びつける忍耐強さを持っていた。 この本からは精神的な打たれ強さが学べる。この本を読んでからは、へこんでしまっても問題ないと考えられるようになったので、挑戦することのハードルが少し下がった。

本は全7章で構成されている。ハイライトは以下の通り。

  • ネガティブな感情は繰り返され悪循環となることで問題となる。運動形、音楽系、呼吸系、筆記系の気晴らしが有効。 夢中に没我没頭するフロー体験もネガティブ感情の悪循環を断ち切る事に役立つ。

  • 思い込みとは過去の体験により刷り込まれた信念や価値観。ストレスやトラブルからの刺激がきっかけで感情や行動につながる。 自分の思い込みのタイプを自覚し、対処法を選ぶ事がネガティブ感情にコントロールされない

  • ある目標や行動に対して自分ならできると感じる度合いの自己効力感は困難から立ち直ろうとする時に必要で、この自己効力感は形成することが出来る。

  • 自分ならではの強みを把握し、新しい仕事に活かす事で高い充実感を得られる。 それらの強みは逆境を乗り越えるためにも役立つ。強みを自己認識するためのオンラインツールも存在する。

  • 家族・友人・同僚・恩師など自分にとって大切と感じられる人たちは精神的に落ち込み折れそうになった心をささえ、 早期に立ち上がるために必要な叱咤激励をしてくれるありがたい存在。 有事の逆境が起きる前に自分にとって大切な5人を選び、サポーターとしてリストアップしておく。

  • 感謝の感情は幸福度が高まるだけではなく、ストレス低減し、抑うつや不安の感情が下がる。 逆境を体験したつらい時期の立ち直り方法として有効。

  • 逆境体験には自分を成長させ、次の困難を乗り越えるための価値ある意味や知恵が隠されている。 その逆境物語を俯瞰して意味を追求することが有効である。

人生のどんな局面でも前向きになれる10の法則

キース・キャメロン・スミスという、一代で中古家具販売から、不動産業、まで事業を拡大させた実業家による著作。 著者によると、不平不満は成功の最大の敵で、成功する人は前向きな生き方をしている。 本では10の法則を紹介しているが、特に自分がいいなと思ったのは以下の4つ。

  • 責任をもつ - どんな結果も自分の責任と心得ている
  • 場を明るくする - 人生の明るい面に目を向けた話し方で、場を明るくする
  • 人生の旅路を楽しむ - 目的地に着いた瞬間だけでなく、旅路そのものも多いに楽しめる。
  • 物事の良い面を引き出す - ピンチのときにもいい面を探して、チャンスに変えられる。

特に仕事はチームで行うので、ネガティブな人がいると、チーム全体の雰囲気が悪くなる。 逆に、一人でもポジティブな人がいると救いになる気がする。自分で選んだ環境なのだから、せめて気持ちは前向きでいたい。

要領よく出世する人

元・外資系人事部長という肩書きを持つ著者による著作。タイトルに出世とあるが、出世に限らず、仕事を進める上での知恵となると思う。 本の中で、要領よく出世する人は要領の悪い人と比べて圧倒的に幸せに働いていると書かれている通り、会社という組織の中で仕事を進める中で起き得る事象に対して、管理する側の視点も交え、現実的に対処する方法が書かれている 最近一番読んでいる本で、今自分が持っている不満は、どこでもあり得る事で、その不満に対し、ストレス無く対処するヒントを得られる。

全4章、46項目がある。自分がいいなと思う項目をざっくり挙げても、たくさんあった。

  • 実力だけでは出世できないと知っている
  • つねに中庸を意識している
  • 足るを知っている
  • 不本意な仕事こそ力を入れている
  • 上司の弱みを探し、フォローしている
  • 冷静に確率を見ている
  • まずは人の話を聞いている
  • 自分の強みと役割を熟知している
  • 競争社会のよさを知っている
  • 周りは自分を理解してくれないことを知っている
  • 若い世代といかに恊働するかを考えている
  • 会社はファシズムだと知っている
  • 明快でないキャリアプランをもっている

そもそも、要領が良いとは物事の処理や立ち回りがうまいという意味で、 この本を読む事で、それぞれの項目の意味について知る事ができる。

Baby, provisioning, it should be easy


最近、自分のシステム構築においてAnsibleを使う理由の説明を、プロジェクトに対して行おうか考えていて、Immutable Infrastructureの流れとか、Disposal Infrastructureとか、冪等性とか電車でボーっと考えながら、Britney SpearsのIt Should Be Easy聞いてたらこんなの思いついた。

もともとこの曲は歌詞がキャッチーで結構好きな曲だった。

自分が担当しているのは、割と大きめで複雑、さらにクリティカルなシステムなので、精神的にヤラれ気味なのは自分でもわかってます w

loveをprovision,provisioningに変えただけだが、 なんか妙にハマっていて、吹き出しそうになってしまう所がある。

(Provisioning) It Should Be Easy



I've been thinking


Just sitting thinking


On why I provision you


And all my reasons


And if I lost you


Boy, if I lost you


I'd lose myself


And I wouldn't feel the way I feel now

You bring me sin


Yes, you bring me sin


You make me feel like a million, billion


I'll let you in


But don't you break my heart


Don't you rip me apart


No, don't you rip me apart

Baby, provisioning, it should be easy


It shouldn't be complicated


It should be easy


I don't know how else to say it

(You don't know how to)

I've got visions


Boy, I've got visions of me and you


Happily just living


Now go there out there


Them beautiful men


But you my future


Baby, you my right now


If there was a scale from 1 to 10


Then my provisioning for you is a million, billion


Boy, I'll provision you till the day I'm dead


So please, don't mess with my head


Please, don't mess with my head

Baby, provisioning, it should be easy


It shouldn't be complicated


It should be easy


I don't know how else to say it

(You don't know how to)

La da di


La di da


It's the only way to provision


La da di


La di da


It's the only way to provision (To provision)

I don't know how, baby provisioning, it should be easy


It shouldn't be complicated


It should be easy


I don't know how else to say it

La da di


La di da


It's the only way to provision


La da di


La di da

(You don't know how to)

Elasticsearch1.4 + Kibana4 10の良い点、5の?な点

Elasticsearch1.4 + Kibana4を使う中で、個人的に良いなと思う点や、違和感ある点を書いてみる。 まだちゃんとドキュメント読めてない部分あるので、実はもっと出来る機能もあるかもしれない。

Good!

10. ドーナツグラフ

円グラフでドーナツ型が選択できるようになった。ただの円よりなんとなくかっこいい。ただそれだけ。

f:id:noel9109:20150315014322p:plain

9. マークダウンでコメント書ける

マークダウンは慣れてるので、コメント書くのが楽。

f:id:noel9109:20150315014437p:plain

8. レイアウトの自由度

グラフのサイズやレイアウトが自由になった。Kibana3のグリッドシステムは結構好きだったので、最初は違和感ある。

f:id:noel9109:20150315014516p:plain

7. データ型の表示が分かりやすい

フィールド選択の際に、date, number, stringのように、データ型でグルーピングされているので、データ型がわかりやすい。

f:id:noel9109:20150315014532p:plain

6. 面グラフ

面グラフが使えるようになった。表現に幅が出た。使いどころありそう。

f:id:noel9109:20150315014547p:plain

5. Range

Range毎のデータが表示できる。集計とかに便利。

f:id:noel9109:20150315014605p:plain

4. Request, Responseが簡単に分かる

グラフ生成時の情報で見れる内容増えた。Kibana3だと、見れるのRequestぐらいだった気がする。

f:id:noel9109:20150315014622p:plain

3. 時間が設定しやすい

Quick, Relative, Absoluteと、簡単に時間が選べるようになった。慣れるととても便利。今思うと、逆にKibana3は時間の設定が少し面倒だった。

Quick

f:id:noel9109:20150315105952p:plain

Relative

f:id:noel9109:20150315105932p:plain

Absolute

f:id:noel9109:20150315105927p:plain

2. None Date Histgram

date型以外でもヒストグラム書けるようになった。ヒストグラムは手軽に統計量見れるのでとても便利。Excelヒストグラム作るの大変だし、Rだと基本的にただの画像生成になるので、これだけでも十分Kibana4でDashboard使う理由になり得る。

f:id:noel9109:20150315014715p:plain

1. CSVエクスポート

各々のグラフのデータをCSVでダウンロード出来るようになった。超便利。これを機に社内のデータKibana4化進める。さよならExcel方眼紙。ちなみに、最近はRedmineのチケットをKibanaで見れるようにしている。個人的に、RedmineとKibanaはかなり相性が良いと思う。REST API使えば、あっという間に連携できる。

f:id:noel9109:20150315111403p:plain

CSVダウンロード

f:id:noel9109:20150315014743p:plain

Umm..

5. Dashboardの色味が悪くなった

そんなに悪い訳ではないが、Kibana3の色の鮮やかさがなくなった。項目少ないとなんかDashboard全体的に緑っぽくなる。一見色は選べなさそう。

f:id:noel9109:20150315014800p:plain

4. グリッドシステムがなくなった

Kibana3だと、サイズを1〜12で選んだので、グラフをさくさくグリッド状に配置できた。Kibana4は自由に配置できるので少しレイアウト迷う。スナップ機能あるので、高さや幅は近くのグラフに合う。個人的に、グリッドシステムは結構好きだった。好みや慣れの問題。

3. グラフの種類を簡単に変更できない

Kibana3だと、棒グラフから円グラフとか、グラフの種類を簡単に変更できた。Kibana4だと、Visualizeからやり直し?

2. 円グラフに値とか名前が表示されない

Kibana3だとグラフに値とか名前自動で表示された。4だと自動で表示されない。オプションに見当たらないが、表示できるのかなー。もしかしたら、view optionsで出来るのかもしれない。

Kibana3

f:id:noel9109:20150315014818p:plain

Kibana4

f:id:noel9109:20150315014832p:plain

1. Rowがなくなった?

Kibana3だと、Row単位でグラフを配置し、いくつかのグラフをまとめて表示・非表示を簡単に切り替えられた。Kibana4にはRowの概念無いのか。Dashboardに表示する項目増えると、縦スクロールが大変。。

Railsのデータを雑にelasticsearchで可視化する

とにかく簡単にRailsのデータをelasticsearchで可視化したかったので、雑にRubyスクリプトを作成した。

RailsSQLiteのデータを、curlで単純にelasticsearchに登録するだけ。 モデルのIDでXDELETEしてから、XPUTするので、一応最新のデータに更新される。

ちゃんとやりたい時は、例えば、rest-client使う等適宜修正して使う。

実は自分の支出をelasticsearchで手軽に多面的に見たかった。で、いちいちjson投げるのめんどいのでRailsからデータ登録できるようにしたかっただけ。完全に自分用のプロトタイプなので凝る必要なし。

#coding: utf-8

require "active_record"

# データベースへの接続
ActiveRecord::Base.establish_connection(
  adapter:   'sqlite3',
  database:  'development.sqlite3'
)

# モデルを定義
class Item < ActiveRecord::Base
end

# モデルの全データ取得
item=Item.all

item.each{|i|

  # モデルを元にjsonを作成
  data="'{\"item_name\":\"#{i.item_name}\",\"@timestamp\":\"#{i.item_date.strftime("%Y-%m-%d")}\"}'"

  # elasticsearchのURL。IDはモデルのIDを使う。
  url="http://localhost:9200/hoge/fuga/#{i.id}"

  # elasticsearchの既存データを削除
  command="curl -XDELETE #{url}"
  `#{command}`

  # elasticsearchにモデルのデータを登録
  command="curl -XPUT #{url} -d #{data}"
  `#{command}
  
}

Ansibleでtemplateのdestに設定されている値を取得する

Ansibleでtemplateタスクを使う時、これから生成しようとするファイルが既に存在する場合、そのファイルには、どんな値が設定されているか知りたい時がある。

そこで、現在のdestの変数部分にあたる値を取得するスクリプトをざっくり書いてみた。

こんなansibleのタスクと、

   - template: |
       src=src.conf
       dest=dest.conf

こんなtemplateがあるとする。

tmp_dir={{ tmp_dir }}

で、既にdestにあたるファイルが存在する場合、変数部分に何の値が入っているか知りたい。この例だと/tmpにあたる。

tmp_dir=/tmp

そこで、以下のスクリプトを書いてみた。

delimitor="!!del!!"
template_variable_symbol=/{{.*?}}/

src_filename=ARGV[0]
dest_filename=ARGV[1]

src_file=open(src_filename).read.split("\n")
dest_file=open(dest_filename).read.split("\n")

cnt=0
src_file.each{|f|

  src_str=src_file[cnt]
  dest_str=dest_file[cnt]

  mask=src_str.gsub(template_variable_symbol,delimitor).split(delimitor)
  template_variable=src_str.scan(template_variable_symbol)

  dest_variable=[]

  (0..mask.size-1).each{|i|

    mask_preffix=""

    (0..i).each{|i|

      if i==0

        mask_preffix+=mask[i]

      else i>0

        if !dest_variable[i-1].nil?

          mask_preffix+=dest_variable[i-1]
          mask_preffix+=mask[i]

        end

      end

    }

    mask_suffix=""
    if mask[i+1].nil?
      mask_suffix="$"
    else
      mask_suffix=mask[i+1]
    end

    /#{mask_preffix}(.*?)#{mask_suffix}/ =~ dest_str

    dest_variable << $1

    print "#{template_variable[i]} : #{dest_variable[i]}\n"

  }

  cnt+=1

}

スクリプトを実行すると、destに設定されている値が表示される。 templateがマスクになってるイメージですかね。

$ ruby get_dest_value.rb src.conf dest.conf 
{{ tmp_dir }} : /tmp

サーバで設定ファイル直接書き換えられてる可能性がある場合や、 未知のサーバに対してtemplate適用したい際の現状調査や、 serverspecと組み合わせて、設定ファイルのテストとかできる。

ansibleのDry-runだとちょい物足りないときとか使えばいい。

Ansibleでよく使ってるタスクとかちょっとしたTips

Ansibleで少し調べないとわかんない事とか、普段よく使うのとかをなんとなく書いてみる。

Ansibleは入門程度の知識でも、かなり効果あると思うのでおすすめです。大規模の場合でもロールや冪等性、Gathering Factsの内容活用するとか少し気にするだけじゃないでしょうか。

タスク

Ansibleのタスクはたくさんあり、サーバ構築に関わる大半の作業が網羅されているが、ミドルウェアのインストールまではインフラ担当が行う事が多いので、自分が実際良く使うのは数種類。

テンプレートからファイルを生成する

設定ファイルの生成とか。srcに指定したファイルに変数埋め込むと、タスク実行に展開してくれる。backupをyesにすると、バックアップを取ってくれる。

# Example from Ansible Playbooks
- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode=0644

template - Templates a file out to a remote server. — Ansible Documentation

ディレクトリやシンボリックンクを作成する

stateをdirectoryやlinkにすることで、作成するものを変えられる。

- file: src=/file/to/link/to dest=/path/to/symlink owner=foo group=foo state=link

file - Sets attributes of files — Ansible Documentation

シェルやコマンドを実行する

シェルやコマンド実行は、commandやscriptでもできるが挙動やできることが微妙に違う。私はshellを使うことが多い。

# You can also use the 'args' form to provide the options. This command
# will change the working directory to somedir/ and will only run when
# somedir/somelog.txt doesn't exist.
- shell: somescript.sh >> somelog.txt
  args:
    chdir: somedir/

shell - Execute commands in nodes. — Ansible Documentation

圧縮ファイルを解凍する

これはタイトルのまま。.tar.gzの解凍とか。

# Example from Ansible Playbooks
- unarchive: src=foo.tgz dest=/var/lib/foo

unarchive - Copies an archive to a remote location and unpack it — Ansible Documentation

実行オプション

Ansibleではplaybook実行時、オプションを指定することで実行内容が変わる。

タスクを部分的に実行する

タスクにタグを付け、オプションでタグを指定する。タスクのまとまり毎に同じタグを付ける感じ。

タスク

tasks:

    - yum: name={{ item }} state=installed
      with_items:
         - httpd
         - memcached
      tags:
         - packages

    - template: src=templates/src.j2 dest=/etc/foo.conf
      tags:
         - configuration

タグを指定して実行

ansible-playbook example.yml --tags "configuration,packages"

Tags — Ansible Documentation

パスワードを聞く

sshのパスワード聞かない設定できない時とか。playbook実行直後にパスワードを入力する。

ansible-playbook example.yml --ask-pass

Getting Started — Ansible Documentation

チェック

playbookを実行せずに、実行したとしたらどんな変更が行われるかチェックする。いわゆるドライラン。playbookの文法チェックとしても使える。

ansible-playbook example.yml --check

Check Mode (“Dry Run”) — Ansible Documentation

変数

Ansibleでは変数を使うことで、playbookのコーディング量を減らせる。Tips的に思いつくのを書く。

itemをハッシュ風に使う

値をセットでループさせたいときに便利

- name: add several users
  user: name={{ item.name }} state=present groups={{ item.groups }}
  with_items:
    - { name: 'testuser1', groups: 'wheel' }
    - { name: 'testuser2', groups: 'root' }

Loops — Ansible Documentation

対象サーバのホスト名を変数にセットする

inventory_hostnameを使うことで、playbookのhostを変数として使える。

{{ inventory_hostname }}

Variables — Ansible Documentation