こしごぇ(B)

旧:http://d.hatena.ne.jp/koshigoeb/

ソーシャルパーツ

重すぎて笑えない。

デザイン設定から全部切ったけど、それでもまだ重い。笑えない。

もう、長いことブログ書いてないけど、別の良いブログ的なサービスかツールを検討しても良いかもしれない。

が、運用コストが一番気にかかるポイントなので、難しいところ。

追記

パーツ減らしたら若干ましになったかもしれない。

銀と金

何か今後の話のネタにでもなればなと思ってしまってポチっちゃった件。高いわー。生活きついわー。

Rubyアソシエーション: Ruby技術者認定試験制度

ぎりっぎりのすれすれ。

銀が84だった時には、「もう終わった、15kどぶに捨てたな…。」と思ったけれども、金が82でどうにか命拾い。

Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)

Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)

合格は合格だけど、何年もやっていながら90にすら届かないという結果にはがっかりするばかり。こんな有様じゃあ、ギャグとしてしか活用できそうにない…。

まあ、雪の日のお受験という事で、良い記念になりました。

対策

  • 5年ちょいの経験()
  • 書籍に付属している演習問題を一周
  • Fiber のAPIドキュメント一読
  • Thread のAPIドキュメント一読
  • Refinments に関する Rubyist Magazine 記事一読
  • Module#prepend に関するAPIドキュメント一読
  • Refinements, prepend についてはググってブログ記事2,3個一読

『Effective Ruby』読んだ

すっかり注文したことを忘れていて、発送のメールが来たときにはちょっと驚いた。注文しなかった気がするのに、ポチり癖って怖いですね。

Effective Ruby

Effective Ruby

高くついたな、というのが率直な感想。

Docker 入門(1)

写経。

準備

$ brew install docker boot2docker
$ boot2docker init
$ boot2docker up
$ export DOCKER_HOST=tcp://192.168.59.103:2375
$ boot2docker ssh
docker@boot2docker:~$ docker pull ubuntu
docker@boot2docker:~$ docker run ubuntu /bin/echo hello world

基本操作

インタラクティブ実行

docker@boot2docker:~$ docker run -i -t -h ubuntu ubuntu /bin/bash
root@ubuntu:/# exit

バックグランドで実行

docker@boot2docker:~$ docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 10; done"
cbfbe8f4de110601bd884fb7fa3e1c252d4abcc4b29e2f996b2c642c0cc1b567
docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
cbfbe8f4de11        ubuntu:14.04        /bin/sh -c 'while tr   41 seconds ago      Up 40 seconds                           silly_turing
docker@boot2docker:~$ docker logs -f cbfbe8f4de110601bd884fb7fa3e1c252d4abcc4b29e2f996b2c642c0cc1b567
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world

コンテナの停止

docker@boot2docker:~$ docker stop cbfbe8f4de110601bd884fb7fa3e1c252d4abcc4b29e2f996b2c642c0cc1b567
cbfbe8f4de110601bd884fb7fa3e1c252d4abcc4b29e2f996b2c642c0cc1b567
docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

コンテナの再実行

docker@boot2docker:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                           PORTS               NAMES
cbfbe8f4de11        ubuntu:14.04        /bin/sh -c 'while tr   4 minutes ago       Exited (-1) About a minute ago                       silly_turing
198ac0c5f14f        ubuntu:14.04        /bin/bash              3 hours ago         Exited (0) 3 hours ago                               desperate_darwin
0aa4a140fb2c        ubuntu:14.04        /bin/echo hello worl   3 hours ago         Exited (0) 3 hours ago                               romantic_jones
docker@boot2docker:~$ docker restart cbfbe8f4de11
cbfbe8f4de11
docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
cbfbe8f4de11        ubuntu:14.04        /bin/sh -c 'while tr   4 minutes ago       Up 26 seconds                           silly_turing

コンテナへのアタッチ

docker@boot2docker:~$ docker attach cbfbe8f4de11
Hello world
Hello world
Hello world
Hello world
^C
docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

コンテナの強制終了

※ stop ではタイムアウトするまでコンテナの終了を待つが、kill は即時にコンテナを終了させる。

docker@boot2docker:~$ docker restart cbfbe8f4de11
cbfbe8f4de11
docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
cbfbe8f4de11        ubuntu:14.04        /bin/sh -c 'while tr   7 minutes ago       Up 4 seconds                            silly_turing
docker@boot2docker:~$ docker kill cbfbe8f4de11
cbfbe8f4de11
docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

コンテナ内プロセスの監視

docker@boot2docker:~$ docker restart cbfbe8f4de11
cbfbe8f4de11
docker@boot2docker:~$ docker top cbfbe8f4de11
PID                 USER                COMMAND
998                 root                /bin/sh -c while true; do echo Hello world; sleep 10; done
1018                root                sleep 10

コンテナの状態の確認

docker@boot2docker:~$ docker inspect cbfbe8f4de11
[{
    "Args": [
        "-c",
        "while true; do echo Hello world; sleep 10; done"
    ],
    "Config": {
        "AttachStderr": false,
        "AttachStdin": false,
        "AttachStdout": false,
        "Cmd": [
            "/bin/sh",
            "-c",
            "while true; do echo Hello world; sleep 10; done"
        ],
        "CpuShares": 0,
        "Cpuset": "",
        "Domainname": "",
        "Entrypoint": null,
        "Env": [
            "HOME=/",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "ExposedPorts": null,
        "Hostname": "cbfbe8f4de11",
        "Image": "ubuntu",
        "Memory": 0,
        "MemorySwap": 0,
        "NetworkDisabled": false,
        "OnBuild": null,
        "OpenStdin": false,
        "PortSpecs": null,
        "StdinOnce": false,
        "Tty": false,
        "User": "",
        "Volumes": null,
        "WorkingDir": ""
    },
    "Created": "2014-08-18T09:43:46.165018471Z",
    "Driver": "aufs",
    "ExecDriver": "native-0.2",
    "HostConfig": {
        "Binds": null,
        "ContainerIDFile": "",
        "Dns": null,
        "DnsSearch": null,
        "Links": null,
        "LxcConf": [],
        "NetworkMode": "bridge",
        "PortBindings": {},
        "Privileged": false,
        "PublishAllPorts": false,
        "VolumesFrom": null
    },
    "HostnamePath": "/mnt/sda1/var/lib/docker/containers/cbfbe8f4de110601bd884fb7fa3e1c252d4abcc4b29e2f996b2c642c0cc1b567/hostname",
    "HostsPath": "/mnt/sda1/var/lib/docker/containers/cbfbe8f4de110601bd884fb7fa3e1c252d4abcc4b29e2f996b2c642c0cc1b567/hosts",
    "Id": "cbfbe8f4de110601bd884fb7fa3e1c252d4abcc4b29e2f996b2c642c0cc1b567",
    "Image": "c4ff7513909dedf4ddf3a450aea68cd817c42e698ebccf54755973576525c416",
    "MountLabel": "",
    "Name": "/silly_turing",
    "NetworkSettings": {
        "Bridge": "docker0",
        "Gateway": "172.17.42.1",
        "IPAddress": "172.17.0.5",
        "IPPrefixLen": 16,
        "PortMapping": null,
        "Ports": {}
    },
    "Path": "/bin/sh",
    "ProcessLabel": "",
    "ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/cbfbe8f4de110601bd884fb7fa3e1c252d4abcc4b29e2f996b2c642c0cc1b567/resolv.conf",
    "State": {
        "ExitCode": 0,
        "FinishedAt": "2014-08-18T09:50:53.222406799Z",
        "Paused": false,
        "Pid": 998,
        "Running": true,
        "StartedAt": "2014-08-18T09:52:09.613630607Z"
    },
    "Volumes": {},
    "VolumesRW": {}
}
]
docker@boot2docker:~$ docker inspect -f "{{.State}}" cbfbe8f4de11
map[ExitCode:0 FinishedAt:2014-08-18T09:50:53.222406799Z Paused:false Pid:998 Running:true StartedAt:2014-08-18T09:52:09.613630607Z]

コンテナのコミット

docker@boot2docker:~$ docker commit cbfbe8f4de11
d7a471af5180a8185859e0684058b73cbd004e53cfb858b5859e5c5d0e731246
docker@boot2docker:~$ docker images | grep d7a471af5180
<none>              <none>              d7a471af5180        54 seconds ago      225.4 MB

コンテナの削除、イメージの削除

docker@boot2docker:~$ docker rm cbfbe8f4de11
Error response from daemon: Impossible to remove a running container, please stop it first or use -f
2014/08/18 09:57:16 Error: failed to remove one or more containers
docker@boot2docker:~$ docker kill cbfbe8f4de11
cbfbe8f4de11
docker@boot2docker:~$ docker rm cbfbe8f4de11
cbfbe8f4de11
docker@boot2docker:~$ docker rmi d7a471af5180
Deleted: d7a471af5180a8185859e0684058b73cbd004e53cfb858b5859e5c5d0e731246

コンテナのイメージを共有する

Usage: docker push NAME[:TAG]

Dockerfile

$ docker build .
  • FROM
  • RUN
  • CMD
  • EXPOSE
  • ENV
  • ADD
  • ENTRYPOINT
  • VOLUME
  • USER
  • WORKDIR
  • ONBUILD

入門 Ansible (1)

入門Ansible

入門Ansible

準備

$ brew install ansible
$ ansible --version
ansible 1.7.1
  • Python 2 系が必要(3系では動かず、今後の対応も不明だとか)
  • 対象ホストでも Python 2 系がインストールされている必要があるとか

Vagrant で対象ホストを用意

$ vagrant box add hashicorp/precise64
$ vagrant init hashicorp/precise64

inventory ファイル

$ vagrant up
$ vagrant ssh-config --host sample01 >> ~/.ssh/config
$ cat <<\EOF > hosts
sample01
EOF
$ ansible -i hosts sample01 -m command -a 'date'
sample01 | success | rc=0 >>
Mon Aug 18 04:56:54 UTC 2014
$ ansible -i hosts all -m setup
sample01 | success >> {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "10.0.2.15"
        ],
...
    "changed": false
}

グループ

[web]
web01.example.com
web02.example.com

[db]
db01.example.com
db02.example.com

グループのグループ

[hoge:children]
hogeweb
hogedb

[hogeweb]
web01.example.com
web02.example.com

[hogedb]
db01.example.com
db02.example.com

ホスト単位の設定

web01.example.com ansible_ssh_user=ec2-user

グループ単位の設定

[web]
web01.example.com
web02.example.com

[web:vars]
ansible_ssh_port=2222
ansible_python_interpreter=/usr/local/bin/python

playbook

ホストと inventory の準備

$ git diff Vagrantfile
diff --git a/Vagrantfile b/Vagrantfile
index 91b7b92..14c9e85 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -12,6 +12,9 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
   # Every Vagrant virtual environment requires a box to build off of.
   config.vm.box = "hashicorp/precise64"

+  config.vm.define :web01
+  config.vm.define :web02
+
   # Disable automatic box update checking. If you disable this, then
   # boxes will only be checked for updates when the user runs
   # `vagrant box outdated`. This is not recommended.

$ vagrant up
$ vagrant ssh-config >> ~/.ssh/config
$ cat <<\EOF > hosts
[web]
web01
web02
EOF

playbook を書いてみる

$ cat <<\EOF > web.yml
---
- hosts: all
  sudo: yes
  remote_user: vagrant
  vars:
    username: newuser
  tasks:
    - name: ユーザーを追加
      user: name={{ username }} group=admin shell=/bin/bash
EOF
$ ansible-playbook -i hosts web.yml

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [web02]
ok: [web01]

TASK: [ユーザーを追加] ***************************************************************
changed: [web01]
changed: [web02]

PLAY RECAP ********************************************************************
web01                      : ok=2    changed=1    unreachable=0    failed=0
web02                      : ok=2    changed=1    unreachable=0    failed=0

handler, notify

タスクの notify で handlers で定義した名前を指定すると、そのハンドラを実行出来る感じ。

tasks:
  - name: 設定ファイルをコピー
    copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
    notify: apacheの再起動
handlers:
  - name: apacheの再起動
    service: name=httpd sate=restarted