備忘録、はじめました。

作業したこと忘れないようにメモっておきます。

Chefで複数リソースに更新があった時だけbashを実行

はじめに

cookbookのfilesの中に大量のtomlファイルが入っていて、各tomlファイルに対してコマンドを実行したい場面に直面しました。 ファイルの更新が合った時だけ、そのコマンドを実行したかったので、その時の作業をメモします。

目的

  • confファイルが更新されているかをチェック
  • 更新されていればファイルを差し替えしてスクリプトを実行

作業

作業環境は、仮想マシンにChef-ServerとChef-Clientを用意し、作業(knifeを実行するマシン)はホストマシンになります。 下記、レシピになります。

recipe.rb

files = run_context.cookbook_collection["my-cookbook-name"].file_filenames
files.select!{ |file| file =~ /\.toml/ }

files.each do |file| 
  # 2. 配置したtomlを使ってコマンドを実行
  bash "exec-#{File.basename(file,".*")}" do
    action :nothing # 実行しない
    user "vagrant"
    cwd "/home/vagrant/conf"
    code "echo #{File.basename(file,".*")} >> /home/vagrant/exec-stamp.txt" # 処理したいコマンド
  end
end

files.each do |file| 
  # 1. tomlを配置
  cookbook_file "/home/vagrant/conf/#{File.basename(file)}" do
    owner "vagrant"
    group "vagrant"
    mode 0644
    source File.basename file
    not_if { FileUtils.cmp("/home/vagrant/conf/#{File.basename(file)}", file) } # ファイルの比較
    notifies :run, "bash[exec-#{File.basename(file,".*")}]" # bash[exec-hoge] の内容を実行しにいく
  end
end
続きを読む

レキシカルスコープとダイナミックスコープ

はじめに

レキシカルスコープとダイナミックスコープの違いについて簡単にまとめてみます。

メモ

以下、サンプルコードを元にして説明していきます。

1: func X(){
2:     print(s)
3: }
4: 
5: func Y() int{
6:     s := 12
7:     X()
8:     return s
9: }

上記のコードで想定している出力結果は、関数Yを呼び出したら12が出力されることとします。 実行している内容は、関数Yで定義された変数sを関数Xで出力するというものです。 下記、2つにスコープに分けて説明します。

続きを読む

Dockerでoperation not supportedが出てきた話

はじめに

DockerでイメージをbuildしようとDockerfileの作ってbuildしてみたものの、

operation not supported

というメッセージでRUNで記載したコマンドが実行できない事象に陥りました。

解決方法

LXCを導入したい場合、以下必要なことがわかりました(根本的な理由は調べてません)。

  • CONFIG_VETHの値(カーネルコンフィグ)
  • lxc
  • cgroups

CONFIG_VETHの値の確認は下記コマンドにて行いました。 下記の結果が表示されていれば値が入っている状態となります。

$ zcat /proc/config.gz | grep VETH
CONFIG_VETH=m

ちなみに、上記表記が出ない場合の対策については実施していません。

cgroupsはubuntuなどのOSであれば、cgroup-liteをapt-getしてあげるらしいです。 Archlinuxの環境ではyaourt -S libcgroupsが必要でした。下記のコマンドは適宜読み替えてください。

$ yaourt -S libcgroups
$ sudo pacman -S lxc

dockerでbuildとりあえずうまく行きました。。。

続きを読む

Riak searchを使ってみた

はじめに

Riakで全文検索してみたいと思い、Riakのsearch機能を利用する準備で行った作業をまとめました。

利用環境

  • Ubuntu server 14.04
  • Riakのホストは192.168.56.101
  • Riak 2.0.5(from source)

前準備

作業

indexの作成

例として、"api_index"という名前のindexを作成します。

export RIAK_HOST="http://192.168.56.101:8098"
curl -XPUT $RIAK_HOST/search/index/api_index \
     -H 'Content-Type: application/json' \
     -d '{"schema":"_yz_default"}'

下記、URLにアクセスし、api_indexのsolrのcore(?)が作成されているか確認します。 ※ solrについて詳しくないので上記言い回し的に間違ってたらご指摘ください。

http://192.168.56.101:8093/internal_solr/

続きを読む

Cowboyでobserverを起動するメモ

目的

軽量HTTPサーバcowboyのアプリケーションをErlangの監視ツールobserverで視覚的に監視できるようにしたい。

実施内容

  • relx.configの編集

レシピ

relx.configの作成したアプリケーション名(以下app_name)の他に、

  • wx
  • observer
  • runtime_tools

の3つを追加します。

{release, {animeeting_release, "1"}, [app_name,wx,observer,runtime_tools]}.
--省略--

上記の対処でobserverが起動できるようになります。 アプリをconsoleで起動し、下記コマンドをerlシェルで実行します。

1> observer:start().

下図みたいな感じなものが見れるようになります。

続きを読む

Riak 2.1.0をソースからインストール&クラスターの構築

はじめに

※ 2.0.4から2.1.0に更新しました。

以下、準備するものになります。

1ノードのスペックは以下になります。
* MEM: 1024 MB

  • CPUs: 1 core

  • HDD: 10 GB

  • NIC: 2枚 (ひとつはNATで、もうひとつはホストオンリーアダプタ)

ネットワークの設定

まずはじめに、/etc/network/interfacesのファイルを修正します。

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp

# The secondary network interface
auto eth1
iface eth1 inet static
address 192.168.56.xxx
network 192.168.56.0
netmask 255.255.255.0
broadcast 192.168.56.255
gateway 192.168.56.1

addressのIPはRiakの各ノードのIPアドレスが当てはまります。設計したIPを入れます。 ※ eth0はNAT接続で、eth1はホストオンリーアダプタ

networkingをリスタートします。

続きを読む

GitLab7.6.2の検索フォームでUTF-8の文字列を使う場合

問題

検索フォームでUTF-8のも文字列を使って検索してしまうと次のようなエラーが出てきます。

Encoding::CompatibilityError (incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string)):
  app/models/repository.rb:162:in `method_missing'
  lib/gitlab/project_search_results.rb:51:in `blobs'
  lib/gitlab/project_search_results.rb:20:in `objects'
  app/controllers/search_controller.rb:33:in `show'

ASCII-8BITの文字列に対してUTF-8の文字列で比較してしまっていると怒られています。
(gitのwiki作成に用いられているgollum-libは、ASCII-8BITの文字列を扱っているらしいので)

解決策

app/controllers/search_controller.rbの変数termの行を変更しました。

  def autocomplete
    # term = params[:term]
    term = params[:term].force_encoding('ASCII-8BIT') # ここの行を変更
    @project = Project.find(params[:project_id]) if params[:project_id].present?
    @ref = params[:project_ref] if params[:project_ref].present?

    render json: search_autocomplete_opts(term).to_json
  end

params[:term]は検索フォームに入力された文字列なので、そのparams[:term]をforce_encodingでASCII-8BITにエンコーディングしてあげることで、UTF-8の文字列を入力した際にも強制的にASCII-8BITに変換して検索にかけることができるようになります。