Ansible on OSX

Chefがゴツいというか大げさな感じがしてきたので、Ansibleにしようかなと。
ドキュメントは以下。
http://www.ansibleworks.com/docs/

感覚的にはcapistranoでシェルスクリプトとかコマンドをリモートに実行させたり、レシピを書いてゴニョゴニョできる感じなのかな。
そういうのわりとすき。

コマンドラインではなくブラウザからできそうな、AnsibleWorks AWXというのもある。
http://www.ansibleworks.com/ansibleworks-awx/

コマンドラインからやってみよう。

https://weluse.de/blog/installing-ansible-on-os-x.html
大体上記に書いてあるやり方でOSXに設定できるのですが、うまくいかないことがあるので以下。

pythonのバージョンは、ansibleを実行するOSX上は2.7
サーバー側は2.6以上でないとそのまま実行できないっぽい。
centos5とかだと2.4なので、以下をインストールしておく

remote$ yum install python-simplejson

sshの鍵認証でログインできるようにしておく。
別にパスワードでもいいみたいだけど、あまりないかな。

osxで作業。

> python --version
Python 2.7.5

> easy_install virtualenv
> virtualenv ansible-env
> source ansible-env/bin/activate
(ansible-env)> easy_install pip
(ansible-env)> pip install paramiko PyYAML jinja2
(ansible-env)> pip install ansible
(ansible-env)> export ANSIBLE_HOSTS=~/.ansible/hosts

準備完了。hostsを作成して実行先を書く。centosとかなら/etc/ansible/hostsでいいみたい。

(ansible-env)> vim ~/.ansible/hosts
localhost

[testserver]
192.168.100.5
192.168.100.6:22222
192.168.100.7:22222

[hoge]
hoge.runeleaf.jp

sshのポートが22以外ならそれも書く。
.ssh/configの設定をみてくれてると思ったのだけれど、微妙に見ていないところがある?
サーバーの実行ユーザーは、ansibleコマンドを実行するユーザーと合わせておくとよいかも。
ユーザーの指定もできる。

(ansible-env)> ansible
Usage: ansible <host-pattern> [options]

Options:
  -a MODULE_ARGS, --args=MODULE_ARGS
                        module arguments
  -k, --ask-pass        ask for SSH password
  -K, --ask-sudo-pass   ask for sudo password
  -B SECONDS, --background=SECONDS
                        run asynchronously, failing after X seconds
                        (default=N/A)
  -C, --check           don't make any changes, instead try to predict some of
                        the changes that may occur
  -c CONNECTION, --connection=CONNECTION
                        connection type to use (default=smart)
  -f FORKS, --forks=FORKS
                        specify number of parallel processes to use
                        (default=5)
  -h, --help            show this help message and exit
  -i INVENTORY, --inventory-file=INVENTORY
                        specify inventory host file
                        (default=/Users/kawashima/.ansible/hosts)
  -l SUBSET, --limit=SUBSET
                        further limit selected hosts to an additional pattern
  --list-hosts          dump out a list of hosts matching input pattern, does
                        not execute any modules!
  -m MODULE_NAME, --module-name=MODULE_NAME
                        module name to execute (default=command)
  -M MODULE_PATH, --module-path=MODULE_PATH
                        specify path(s) to module library
                        (default=/Users/kawashima/works/srv/ansible-
                        env/bin/../share/ansible/)
  -o, --one-line        condense output
  -P POLL_INTERVAL, --poll=POLL_INTERVAL
                        set the poll interval if using -B (default=15)
  --private-key=PRIVATE_KEY_FILE
                        use this file to authenticate the connection
  -s, --sudo            run operations with sudo (nopasswd)
  -U SUDO_USER, --sudo-user=SUDO_USER
                        desired sudo user (default=root)
  -T TIMEOUT, --timeout=TIMEOUT
                        override the SSH timeout in seconds (default=10)
  -t TREE, --tree=TREE  log output to this directory
  -u REMOTE_USER, --user=REMOTE_USER
                        connect as this user (default=kawashima)
  -v, --verbose         verbose mode (-vvv for more)
  --version             show program's version number and exit

pingモジュールを実行してみる。

(ansible-env)> ansible testserver -m ping
192.168.100.5 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.100.6 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.100.7 | success >> {
    "changed": false,
    "ping": "pong"
}

コマンド送ってみる。

(ansible-env)> ansible testserver -a "uptime"
192.168.100.5 | success | rc=0 >>
 14:07:20 up 35 days,  8:08,  1 user,  load average: 0.00, 0.00, 0.00

192.168.100.6 | success | rc=0 >>
 14:07:20 up 35 days,  8:48,  2 users,  load average: 0.00, 0.00, 0.00

192.168.100.7 | success | rc=0 >>
 14:06:50 up 141 days,  3:54,  1 user,  load average: 0.08, 0.08, 0.08

yum install vimしてみる。

(ansible-env)> ansible testserver -m yum -a "name=vim-enhanced state=installed"
192.168.100.5 | FAILED >> {
    "changed": true,
    "msg": "You need to be root to perform this command.\n",
    "rc": 1,
    "results": [
        ""
    ]
}

192.168.100.6 | success >> {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}

192.168.100.7 | success >> {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}

.6と.7にはインストールされてたみたいですが、.5にはなくてrootで実行しろ的な。

(ansible-env)> ansible testserver -m yum -a "name=vim-enhanced state=installed" -K
192.168.100.5 | success >> {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "\n================================================================================\n Package              Arch         Version                   Repository    Size\n================================================================================\nInstalling:\n vim-enhanced         i386         2:7.0.109-7.2.el5         base         1.2 M\n\nTransaction Summary\n================================================================================\nInstall       1 Package(s)\nUpgrade       0 Package(s)\n\nTotal download size: 1.2 M\n\nInstalled:\n  vim-enhanced.i386 2:7.0.109-7.2.el5                                           \n\n"
    ]
}

192.168.100.6 | success >> {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}

192.168.100.7 | success >> {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}

1台だけ実行したければ、testserverの部分を192.168.100.5にすればOK。
デフォルトで並列実行が5のようなので、もっと台数があるなら-fで指定する。

これら一連の作業を自動的に構成するのがplaybookと。
ヘルプはansible-playbook -hで、各モジュールのヘルプはansible-doc yumとかansible-doc commandとかで確認できる。

実行する。

(ansible-env)> ansible-playbook develop.yml -K -v

make && make installみたいにコンパイルしているところはモジュールにしてしまうのがいいのかな。

playbookの中身はこんな感じ。

Infrastructure as Code!

[追記]
Best Practicesみてちょっと変えてみたり。
https://github.com/runeleaf/ansible-playbook

広告

Vim, vimでjavaをかく。

別に大したエントリでもなく。私的なメモ程度。

osxでやってます。vimは7.1。PrivatePortfileのvimを使っています。7.2にしてもいいかも。
http://lapangan.net/darwinports/index.php?PrivatePortfile%2FVim
http://lapangan.net/darwinports/index.php?PrivatePortfile%2FVim72

ポリシーとして、あまり追加でプラグインやシンタックスなどを入れないようにしてます。
project.vimとかrails.vimも入れてなかったり。

早速。

この2つがあれば基本的にしあわせです。。

  • snipMate
  • ctags

すでに以下の3つのsyntaxがある。

  • ruby.vim
  • actionscript.vim
  • mxml.vim

新たにsyntaxを導入する。
javaid.vim
http://www.fleiner.com/vim/download.html

docとautoloadに設置する。vimrcも修正。
javacomplete
http://www.vim.org/scripts/script.php?script_id=1785

zshrcに記述する。

export _JAVA_OPTIONS=-Duser.language=en
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
export PATH=$JAVA_HOME/bin:$PATH

あとはscreenも併用していけば、eclipseとか要らないですな。(eclipseは便利だけどね)

iPhone, 実機転送で詰まったところをメモ

今更感のある。

基本的に、iPhone Developer ProgramのPortalにあるHow Toの通りにやれば出来るのですが、最後のビルドでこけたのでー。

XcodeのオーガナイザーからProvisioningを追加するのですが、これDeviceのところのProvisioningの+ボタンから追加するだけではダメらしく、IPHONE DEVELOPMENTのProvisioning Profileにファイルをドラッグ&ドロップすると追加できるのです。

こうしておくとコード署名IDのところで証明書を選択できて、「ビルドして実行」した時に証明書エラーが出なくなり実機で動かす事が出来るのでした。

というかAndroidアプリも調べねばー

モバイル系のアプリは作るの楽しいんだよね!

IRC, irssiとtiarraとtig.rbとBitlbeeでもういいよね?

IRC, irssiとtiarraとtig.rbでtiwtterとか色々と

の続き。

irssiがなんだか起動しなくなっちゃったので、ついでにMSNメッセンジャーもirssiでやろう!という記録。
サーバのログもircにでるので、もうコンソールからirssiだけでひゃっほい!

osxなのでportからインストールします。

% sudo port search bitlbee
bitlbee @1.2.3 (irc, net)
    An IRC to other chat networks gateway
%
% sudo port install bitlbee
...

長い・・・

終わったら設定ファイルをコピーして編集。

% sudo cp /opt/local/etc/bitlbee/bitlbee.conf.sample /opt/local/etc/bitlbee/bitlbee.conf
% sudo vi /opt/local/etc/bitlbee/bitlbee.conf
RunMode = Daemon
DaemonInterface = 127.0.0.1
DaemonPort = 16667

勢い良く起動!

% bitlbee

tiarraに設定を追加します。

% vi tiarra.conf
name: bitlbee

bitlbee {
  host: 127.0.0.1
  port: 16667
  in-encoding: utf8
  out-encoding: utf8
}

tiarra起動。

irssi起動。

% irssi
[(status)] /connect TIA

bitlbeeのチャンネルに移動します。

パスワードは平文だけどローカルなのでとりあえず。

[&bitlbee@bitlbe] register パスワード

<@runeleaf> register パスワード
<@root> Account successfully created

アカウントを登録します。

[&bitlbee@bitlbe] account add msn ホットメール パスワード
<@runeleaf> account add msn ホットメール パスワード
<@root> Account successfully added

アカウントのリストをみるには

[&bitlbee@bitlbe] account list

<@runeleaf> account list
<@root>  0. msn, ホットメール
<@root> End of account list

設定を保存します。

[&bitlbee@bitlbe] save
<@runeleaf> save
<@root> Configuration saved

アカウントを有効にします。

[&bitlbee@bitlbe] account on 0

bitlbeeを再起動してirssiとかで繋ぎ直した場合には、

[&bitlbee@bitlbe] identify registerのパスワード

で保存した設定を呼び出せます。

メッセージおくるには、

[&bitlbee@bitlbe] dareka: こんにちわ

<@runeleaf> dareka: こんにちわ
-!- ServerMode/&bitlbee@bitlbee [+v dareka] by localhost
<+dareka> runeleaf: どうもどうも

どんな設定がされているか確認。

[&bitlbee@bitlbe] set

あとはヘルプで。

[&bitlbee@bitlbe] help

きになるのはGrowlに通知する方法。ぷらぎんつくれってこと?

MacPorts, fetch failed

treeに限ったことではないが、たまに起こる現象。

% sudo port install tree
--->  Fetching tree
--->  Attempting to fetch tree-1.5.1.1.tgz from ftp://mama.indstate.edu/linux/tree/
--->  Attempting to fetch tree-1.5.1.1.tgz from http://svn.macports.org/repository/macports/distfiles/tree
--->  Attempting to fetch tree-1.5.1.1.tgz from http://svn.macports.org/repository/macports/distfiles/general/
--->  Attempting to fetch tree-1.5.1.1.tgz from http://svn.macports.org/repository/macports/downloads/tree
Error: Target org.macports.fetch returned: fetch failed
Error: Status 1 encountered during processing.

回避策

% sudo env MASTER_SITE_LOCAL=http://distfiles.macports.org/tree/ port -v fetch tree
--->  Fetching tree
--->  tree-1.5.1.1.tgz doesn't seem to exist in /opt/local/var/macports/distfiles/tree
--->  Attempting to fetch tree-1.5.1.1.tgz from http://distfiles.macports.org/tree/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 30792  100 30792    0     0  20523      0  0:00:01  0:00:01 --:--:-- 42766
% sudo port install tree
--->  Verifying checksum(s) for tree
--->  Extracting tree
--->  Applying patches to tree
--->  Configuring tree
--->  Building tree with target all
--->  Staging tree into destroot
--->  Installing tree 1.5.1.1_0
--->  Activating tree 1.5.1.1_0
--->  Cleaning tree

OK。

Mac, 色々使える代替アプリ

web制作に必要なツールって結構あるよね。

macだとそういったツールをそろえるコストが高い!みたいに思ってた時期もありました。(macじゃなくても高いけど・・)

今じゃもうほとんど(僕が)使わなくなったアプリとかもあるけれど参考までに。

  • TextMate
    とりあえずこのエディタがあれば十分。$53。
  • CSSedit
    プレビューとか使いやすい。$46。
  • Coda
    Web構築環境。色々そろってます。$99。transmitもっているので$85。
  • Transmit
    秘密鍵の設定に手間取ったけど、Cyberduckとどっこい。$29.95。
  • Pixelmator
    photoshop代替。まじすげぇ!$59。
  • VectorDesigner
    illustrator代替。だよね?$69.95

このあたりからオープンソース。

  • Inkscape [illustrator]
    illustrator代替。
  • jahshaka [AfterEffects]
    ビデオ編集くらいでしか使わないけど。
  • Synfig [Flash]
    ん、現在MacOSはofflineかー。
    cs3かflexでいいかも。
  • KomPozer [dreamweaber]
    HTMLエディタ。
  • Scribus [InDesign]
    DTPソフトなんだってね。

でもよく使うのは、

vim
nano
ssh
sftp

だったり。