トップ 最新 追記

Days of Speed

過ぎゆく日々を書こう。忘れっぽい未来の自分のために


2013-09-13

_ DebianからAnsibleをDebianが動いてるVagrant boxに使ってみる

chefもpuppetも挫折してfabricに手を出そうとしたけど、ちょっと違う感じがしたのでAnsibleに手を出してみたら意外とうまくいったのでメモっておきます。

てか、日本語のAnsible使って見ましたー系日記が全部CentOSってどういうことじゃい!と思いつつ。

参考

Vagrantの準備

1台だけで試すので普通に起動しました。ちなみにwheezy32は以前Packerで作ったWheezy 32bitのVagrant Boxです。

$ mkdir ansible-test
$ cd ansible-test
$ vagrant init wheezy32
$ vi Vagrantfile

26行目のコメントを外して

config.vm.network :private_network, ip: "192.168.33.10"
$ vagrant up

で、起動しました。そして vagrant ssh でログインできることを確認。

Ansibleのインストール

sidにはAnsibleが入ってるのでapt一発です。

$ sudo apt-get install ansible

Ansibleの疎通確認

Ansibleチュートリアルを読み替えつつ、まず最初に疎通確認ということでpingが通るか試してみた。

$ ansible 192.168.33.10 -m ping
No hosts matched

ふむふむ。/etc/ansible/hostsにノードを書いてあげればいいけど、面倒なのでカレントディレクトリにhostsを書いてオプションで指定してみる。

$ echo "192.168.33.10" > hosts
$ ansible -i hosts 192.168.33.10 -m ping
192.168.33.10 | FAILED => FAILED: ssh jun@192.168.33.10:22 : Private key file is encrypted
To connect as a different user, use -u <username>.

gnome-keyringが立ち上がるしなんかヘン。ていうかユーザー名はvagrantじゃなきゃダメだよね。

$ ansible -i hosts 192.168.33.10 -m ping -u vagrant
No handlers could be found for logger "paramiko.transport"
192.168.33.10 | FAILED => FAILED: ssh vagrant@192.168.33.10:22 : Private key file is encrypted
To connect as a different user, use -u <username>.

やっぱりダメだ。チュートリアルもここまでか。 と思ったけどググって本家ドキュメントのGetting StartedのYour First Commandsにこんな記述を発見。

Set up SSH agent to avoid retyping passwords:
$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa

ああ!ssh-agentで鍵を登録しておくのか! VagrantのSSH秘密鍵を登録して、もう一度pingを試してみる。

$ ssh-agent bash
$ ssh-add ~/.vagrant.d/insecure_private_key
Identity added: /home/jun/.vagrant.d/insecure_private_key (/home/jun/.vagrant.d/insecure_private_key)
$ ansible -i hosts 192.168.33.10 -m ping -u vagrant
192.168.33.10 | success >> {
    "changed": false,
    "ping": "pong"
}

わーい。とおったー。じゃあunameを表示。

$ ansible -i hosts 192.168.33.10 -u vagrant -a 'uname -a'
192.168.33.10 | success | rc=0 >>
Linux packer-virtualbox 3.2.0-4-686-pae #1 SMP Debian 3.2.46-1 i686 GNU/Linux

おk。だけど毎回 -u オプションは面倒なので「Inventory and Patterns」を参考にhostsにansible_ssh_userを書いてみた。

$ cat hosts
192.168.33.10 ansible_ssh_user=vagrant

-uオプションを外してもう一度。

$ ansible -i hosts 192.168.33.10 -a 'uname -a'
192.168.33.10 | success | rc=0 >>
Linux packer-virtualbox 3.2.0-4-686-pae #1 SMP Debian 3.2.46-1 i686 GNU/Linux

いいね。ちゃんと表示されたよ。ってことで第1関門突破できた。


簡単なPlaybookを作って適用する

第1関門を突破したので、次は簡単なPlaybookを作ってパッケージをインストールしてみます。

Playbookの書き方は適当につまみ食いして書こうかと思ったけれど、日本語のドキュメントは全部CentOSのyumでそのまま使えないので、本家ドキュメントの「Playbooks」と「Ansible Modules」を見ながらこんな風に書いてみた。

$ cat first-playbook.yml

---
- hosts: 192.168.33.10
  user: vagrant
  sudo: yes
  tasks:
  - name: install apache
    apt: pkg=apache2 state=present update_cache=yes

CentOSと違うのはyum:じゃなくてapt:かな。それ以外は同じのはず。 apt:のオプションはpkg=にパッケージ名、state=presentはインストールされている状態。update_cache=yesはインストール前にapt-get updateを実行。といった感じ。

文法チェックにかけてみたら

$ ansible-playbook -i hosts first-playbook.yml --syntax-check
Playbook Syntax is fine

大丈夫っぽい。 チュートリアルに沿ってタスクの確認もしてみる。

$ ansible-playbook -i hosts first-playbook.yml --list-tasks

playbook: first-playbook.yml

  play #1 (192.168.33.10): task count=1
    install apache

ちゃんとありますね。

ドライランでテスト実行してみます。

$ ansible-playbook -i hosts first-playbook.yml --check

PLAY [192.168.33.10] *********************

GATHERING FACTS *********************
ok: [192.168.33.10]

TASK: [install apache] *********************
failed: [192.168.33.10] => {"failed": true}
msg: Could not import python modules: apt, apt_pkg. Please install python-apt package.

FATAL: all hosts have already failed -- aborting

PLAY RECAP *********************
192.168.33.10                  : ok=1    changed=0    unreachable=0    failed=1

おおっと。エラーが出てる。 aptの実行に必要なpython-aptパッケージが足りないみたい。

えー、aptが使えないからpython-aptをインストールするわけだけれどaptが使えないということは手詰まりか…。

と思ったけれど単純に apt-get -y install python-apt を実行してあげればよいだけなので、actionを使ってこういう風に書き足してみた。

---
- hosts: 192.168.33.10
  user: vagrant
  sudo: yes
  tasks:
  - name: install python-apt
    action: command /usr/bin/apt-get -y install python-apt
  - name: install apache
    apt: pkg=apache2 state=present update_cache=yes

もう一度チェックをかけてみる。

$ ansible-playbook -i hosts first-playbook.yml --check

PLAY [192.168.33.10] *********************

GATHERING FACTS *********************
ok: [192.168.33.10]

TASK: [install python-apt] *********************
skipping: [192.168.33.10]

TASK: [install apache] *********************
failed: [192.168.33.10] => {"failed": true}
msg: Could not import python modules: apt, apt_pkg. Please install python-apt package.

FATAL: all hosts have already failed -- aborting

PLAY RECAP *********************
192.168.33.10                  : ok=1    changed=0    unreachable=0    failed=1

相変わらずapache2のインストールはコケているけどpython-aptのインストールは大丈夫なので、これで適用してみます。失敗してもvagrantなのでやり直せばいいしね。

$ ansible-playbook -i hosts first-playbook.yml

PLAY [192.168.33.10] *********************

GATHERING FACTS *********************
ok: [192.168.33.10]

TASK: [install python-apt] *********************
changed: [192.168.33.10]

TASK: [install apache] *********************
changed: [192.168.33.10]

PLAY RECAP *********************
192.168.33.10                  : ok=3    changed=2    unreachable=0    failed=0

うまくいった。vagrant sshで入って確認します。

$ vagrant ssh

vagrant@packer-virtualbox:~$ dpkg -l | grep apache
ii  apache2                              2.2.22-13                 i386         Apache HTTP Server metapackage
ii  apache2-mpm-worker                   2.2.22-13                 i386         Apache HTTP Server - high speed threaded model
ii  apache2-utils                        2.2.22-13                 i386         utility programs for webservers
ii  apache2.2-bin                        2.2.22-13                 i386         Apache HTTP Server common binary files
ii  apache2.2-common                     2.2.22-13                 i386         Apache HTTP Server common files

vagrant@packer-virtualbox:~$ dpkg -l | grep python-apt
ii  python-apt                           0.8.8.2                   i386         Python interface to libapt-pkg
ii  python-apt-common                    0.8.8.2                   all          Python interface to libapt-pkg (locales)

ちゃんとインストールされてる。 apacheをインストールしたのでブラウザで http://192.168.33.10/ にアクセスすると「It Works!」のメッセージが見られるはず。ということで確認したら見れた。

-vvvオプションをつけるとAnsibleが動いている時にどんなことをしているのかわかるので、つけて、もう一度実行してみた。

$ ansible-playbook -i hosts first-playbook.yml -vvv

PLAY [192.168.33.10] *********************

(長いので中略)

TASK: [install apache] *********************
<192.168.33.10> ESTABLISH CONNECTION FOR USER: vagrant on PORT 22 TO 192.168.33.10
<192.168.33.10> EXEC /bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-1379035773.63-262833540768519 && chmod a+rx $HOME/.ansible/tmp/ansible-1379035773.63-262833540768519 && echo $HOME/.ansible/tmp/ansible-1379035773.63-262833540768519'
<192.168.33.10> REMOTE_MODULE apt pkg=apache2 state=installed update_cache=yes
<192.168.33.10> PUT /tmp/tmpV60Loq TO /home/vagrant/.ansible/tmp/ansible-1379035773.63-262833540768519/apt
<192.168.33.10> EXEC /bin/sh -c 'sudo -k && sudo -H -S -p "[sudo via ansible, key=gjakztadddddarndfsdlhrihshoxzcfr] password: " -u root /bin/sh -c '"'"' /usr/bin/python /home/vagrant/.ansible/tmp/ansible-1379035773.63-262833540768519/apt; rm -rf /home/vagrant/.ansible/tmp/ansible-1379035773.63-262833540768519/ >/dev/null 2>&1'"'"''
ok: [192.168.33.10] => {"changed": false}

PLAY RECAP *********************
192.168.33.10                  : ok=3    changed=1    unreachable=0    failed=0

apache2のインストールを見るとインストール済みなので「changed: false」となってますね。 シェルスクリプトを使ったデプロイだと、インストールされている場合のことも考えないといけないので、これはいいかも。

やっと一歩を踏み出せた。


まとめ

ansibleチュートリアルでつまづいている人は、ssh-agentでvagrantの鍵を登録すればいいよ!


2013-09-26

_ 夏休みが終わる事に気がついてない病

大学の後期が9月24日から始まっていた模様。月曜は祝日でセフセフ。 ということで明日から授業です。

Tags: life

2013-09-27

_ ひさびさの授業

疲れましたですよ。

Tags: life

_ DebianでICカードリーダSCR3310を使って住基カードが認識するか見てみる

去年、使うかなーと思って買った SCR3310 というICカードリーダがあります。

SCM ICカードリーダー/ライター B-CAS・住基カード対応 SCR3310/v2.0 【簡易パッケージ品】

SCM Microsystems
¥ 1,899

買ったあと住基カードも作っていたのですが、なんだかんだでそのまま放置していたので、DebianでICカードリーダが認識して住基カードが読めるか確認してみました。 まず、lsusbでみるとこんな感じ。

# lsusb
Bus 005 Device 015: ID 04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader

これを手がかりに調べてみるとDebian Wikiに「Smartcards - Debian Wiki」というページがあり、pcscdとlibccidで認識できるそうなのでpcscdとpcsc-toolsをインストールしてみた。

# apt-get install pcscd pcsc-tools

これで、ICカードリーダーに住基カードを差してみたら緑のランプが光った! 続いて pcsc_scan コマンドを実行してみた。

# pcsc_scan
PC/SC device scanner
V 1.4.21 (c) 2001-2011, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.8.7
Using reader plug'n play mechanism
Scanning present readers...
0: SCM Microsystems Inc. SCR 3310 [CCID Interface] 00 00

Fri Sep 27 20:50:50 2013
Reader 0: SCM Microsystems Inc. SCR 3310 [CCID Interface] 00 00
  Card state: Card inserted,
  ATR: 3B E0 00 FF 81 31 FE 45 14

ATR: 3B E0 00 FF 81 31 FE 45 14
+ TS = 3B --> Direct Convention
+ T0 = E0, Y(1): 1110, K: 0 (historical bytes)
  TB(1) = 00 --> VPP is not electrically connected
  TC(1) = FF --> Extra guard time: 255 (special value)
  TD(1) = 81 --> Y(i+1) = 1000, Protocol T = 1
-----
  TD(2) = 31 --> Y(i+1) = 0011, Protocol T = 1
-----
  TA(3) = FE --> IFSC: 254
  TB(3) = 45 --> Block Waiting Integer: 4 - Character Waiting Integer: 5
+ Historical bytes:
+ TCK = 14 (correct checksum)

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B E0 00 FF 81 31 FE 45 14
        "JUKICARD", digitally sign tax documents in Japan

とりあえず認識したようです。

これで JSignPdf を使ってPDFに署名できるか調べてみよう。


2001|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|06|08|12|
2011|01|02|03|06|07|08|09|10|11|12|
2012|01|02|03|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|12|
2014|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|10|11|12|
2017|01|02|

クリエイティブ・コモンズ・ライセンス Jun NOGATA を著作者とするこの 作品クリエイティブ・コモンズの 表示 - 継承 4.0 国際 ライセンスで提供されています。