<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
  <channel rdf:about="http://www.fraction.jp/log/category/62/">
    <title>Program/Python -- BONNOH FRACTION 14</title>
    <link>http://www.fraction.jp/log/category/62/</link>
    <description>世の中に寝るより楽はなかりけり&lt;br /&gt;浮世の馬鹿は起きて働く</description>
    
    <dc:creator>Yuanying</dc:creator>
	<dc:date>2018-06-18T09:39:55+09:00</dc:date>
	<admin:generatorAgent rdf:resource="http://webby.rubyforge.org/?v=0.9.4"/>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2017/11/15/openstack-summit-sydney" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2017/05/14/openstack-summit-boston" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2016/10/31/openstack-summit-barcelona" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2016/05/01/openstack-summit-austin" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2015/12/02/multi-node-openstack-kolla" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2015/06/05/linuxcon" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2015/02/06/ansible-http-proxy" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2015/01/06/create-dev-env-magnum" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2014/12/31/summary-of-2014" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2008/09/14/PSP_de_Hello_World" />
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://www.fraction.jp/log/archives/2017/11/15/openstack-summit-sydney">
    <title>シドニー出張</title>
    <link>http://www.fraction.jp/log/archives/2017/11/15/openstack-summit-sydney</link>
    <description>今年の春に引き続き、オーストラリアはシドニーに出張してきた。今回の発表は初日だったためもあってか残りの二日は 羽を伸ばしてちゃんと仕事をしてきた。結局3人しか集まらなかったものの、OpenStacker を集めて早朝ランをするというイベントもこなし、仲良くなった中国人は HyperHQ の CTO というオマケもあってか現時点では未公開情報なども聞くことができて有意義だった。まあ、その未公開情報を知ってたとしても何もできないのだが…。まだ今のところ、自分の中でバンクーバーにはまだ劣るが、、なかなか...</description>
    <content:encoded><![CDATA[
        <p><a href="/log/archives/2017/05/14/openstack-summit-boston">今年の春に引き続き</a>、
オーストラリアはシドニーに出張してきた。</p>

<p class='image'>
<img  src='/log/2017/11/IMGP2866.JPG'
      width='720'
      height='480'
      alt=''  />
</p>


<p><a href="https://www.openstack.org/videos/sydney-2017/which-is-the-best-way-to-install-kubernetes-on-openstack">今回の発表</a>は初日だったためもあってか残りの二日は <del>羽を伸ばして</del>
ちゃんと仕事をしてきた。</p>

<p class='image'>
<img  src='/log/2017/11/IMG_4022.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>結局3人しか集まらなかったものの、OpenStacker を集めて早朝ランをするというイベントもこなし、
仲良くなった中国人は HyperHQ の CTO というオマケもあってか現時点では未公開情報なども聞くことができて有意義だった。
まあ、その未公開情報を知ってたとしても何もできないのだが…。</p>

<p class='image'>
<img  src='/log/2017/11/IMG_0413.JPG'
      width='640'
      height='480'
      alt=''  />
</p>




<p class='image'>
<img  src='/log/2017/11/IMGP2969.JPG'
      width='720'
      height='480'
      alt=''  />
</p>




<p class='image'>
<img  src='/log/2017/11/IMGP2921.JPG'
      width='720'
      height='480'
      alt=''  />
</p>




<p class='image'>
<img  src='/log/2017/11/IMGP2990.JPG'
      width='720'
      height='480'
      alt=''  />
</p>




<p class='image'>
<img  src='/log/2017/11/IMG_2405.JPG'
      width='640'
      height='480'
      alt=''  />
</p>




<p class='image'>
<img  src='/log/2017/11/IMG_0556.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>まだ今のところ、自分の中で<a href="/log/archives/2015/05/25/openstack-summit-vancouver">バンクーバー</a>
にはまだ劣るが、、なかなかいい場所だった。シドニー、今度は家族で行きたい。</p>

    ]]></content:encoded>
    <dc:subject>日記</dc:subject>
    <dc:subject>Program/Python</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2017-11-15T16:15:35+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2017/05/14/openstack-summit-boston">
    <title>ボストン出張</title>
    <link>http://www.fraction.jp/log/archives/2017/05/14/openstack-summit-boston</link>
    <description>去年秋に引き続き、アメリカはマサチューセッツ、ボストンに出張してきた。さすがにバブルは去ったのか、OpenStack 関連で海外出張するのもこれで最後かな。(まあ、前回も言ってるけど。)...</description>
    <content:encoded><![CDATA[
        <p><a href="/log/archives/2016/10/31/openstack-summit-barcelona">去年秋に引き続き</a>、
アメリカはマサチューセッツ、ボストンに出張してきた。</p>

<p class='image'>
<img  src='/log/2017/05/IMG_5783.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>さすがにバブルは去ったのか、OpenStack 関連で海外出張するのもこれで最後かな。
(まあ、前回も言ってるけど。)</p>

    ]]></content:encoded>
    <dc:subject>日記</dc:subject>
    <dc:subject>Program/Python</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2017-05-14T16:04:09+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2016/10/31/openstack-summit-barcelona">
    <title>バルセロナ出張</title>
    <link>http://www.fraction.jp/log/archives/2016/10/31/openstack-summit-barcelona</link>
    <description>春に引き続き、スペインはバルセロナに出張してきた。今回の出張では会いたかった開発者が来れてなかったり、前回のようにプレゼンもなく、予定していたデモは機材の関係でできなかったりと、ちょっと微妙だったが、バルセロナは良かった。物価も安く、美味かった。これまでも、パリ、バンクーバー、オースチン、バルセロナと半年おきで出張があったわけだが、これでもしかすると終わりかもしれぬと思うと感慨深い。特に役得的に。...</description>
    <content:encoded><![CDATA[
        <p><a href="/log/archives/2016/05/01/openstack-summit-austin">春に引き続き</a>、
スペインはバルセロナに出張してきた。</p>

<p class='image'>
<img  src='/log/2016/10/IMG_4731.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>今回の出張では会いたかった開発者が来れてなかったり、
前回のようにプレゼンもなく、予定していたデモは機材の関係でできなかったりと、
ちょっと微妙だったが、</p>

<p class='image'>
<img  src='/log/2016/10/IMG_4750.JPG'
      width='640'
      height='480'
      alt=''  />
</p>




<p class='image'>
<img  src='/log/2016/10/IMG_4768.JPG'
      width='640'
      height='480'
      alt=''  />
</p>




<p class='image'>
<img  src='/log/2016/10/IMG_4840.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>バルセロナは良かった。物価も安く、美味かった。
これまでも、パリ、バンクーバー、オースチン、バルセロナと半年おきで出張があったわけだが、
これでもしかすると終わりかもしれぬと思うと感慨深い。特に役得的に。</p>

    ]]></content:encoded>
    <dc:subject>日記</dc:subject>
    <dc:subject>Program/Python</dc:subject>
    <dc:subject>Program/Cocoa</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2016-10-31T14:55:44+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2016/05/01/openstack-summit-austin">
    <title>オースチン出張</title>
    <link>http://www.fraction.jp/log/archives/2016/05/01/openstack-summit-austin</link>
    <description>約1年ぶりに海外出張。OpenStack Summit Austin に参加。OpenStack Summit今回はありがたくも(めんどくさくも)共同プレゼンターとして二つの一般セッションを行ってきた。OpenAPI as a Standard一つ目は OpenStack Document プロジェクトの元プロジェクトリーダー、QA プロジェクトリーダー、Nova コアと共にという贅沢な布陣のセッション。正直何で自分がここにいるのかわからなかったが、まあ役得というものだろう。OpenAPI の M...</description>
    <content:encoded><![CDATA[
        <p>約1年ぶりに海外出張。OpenStack Summit Austin に参加。</p>

<h2>OpenStack Summit</h2>

<p>今回はありがたくも(<del>めんどくさくも</del>)
共同プレゼンターとして二つの一般セッションを行ってきた。</p>

<h3>OpenAPI as a Standard</h3>

<p class='image'>
<img  src='/log/2016/05/IMG_3702.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>一つ目は OpenStack Document プロジェクトの元プロジェクトリーダー、
QA プロジェクトリーダー、Nova コアと共にという贅沢な布陣のセッション。
正直何で自分がここにいるのかわからなかったが、まあ役得というものだろう。
OpenAPI の Magnum におけるユースケースについて話してきた。
まあ、それしかわからんからしょーがないが。</p>

<p>正直、現状の Magnum において OpenAPI 対応の優先度は低いが、
API ワーキンググループの重鎮の関心をもらってしまったので対応しないわけにはいかなくなったかも。
誰か引き継いでくれないかなー。</p>

<ul>
<li><a href="https://www.openstack.org/videos/video/openapi-as-a-standard-a-new-way-forward-for-api-documentation-design-and-tool">OpenAPI as a Standard - A New Way Forward for API Documentation, Design and Tool</a></li>
</ul>


<h3>Managing Container Clusters in OpenStack Native Way</h3>

<p class='image'>
<img  src='/log/2016/05/IMG_3748.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>二つ目は Senlin プロジェクトリーダー、Senlin コアと共にコンテナ関連のセッション。
っていうか二つとも PTL と一緒にセッションやったことになるのか…。
誘われていたが残念にも通らなかった Magnum プロジェクトリーダーとのセッションが通っていれば、
三つセッション且つ三つとも PTL と一緒という贅沢なことになっていたということに今気づいた。</p>

<p>内容はデザインサミットでの話題とかぶるが、
OpenStack でネイティブにコンテナを管理するにはどうすればいいかというトピック。
実際、内容は Senlin を使えばコンテナの管理がうまくいくよ！という広告で、
Magnum のコアレビューアが参加してしまって良いのだろうかと躊躇したが、
結局のところ今回のデザインサミットで、
Magnum のスコープから「コンテナの管理」を外すという決定がなされてしまったので、
結果オーライといったところか。</p>

<ul>
<li><a href="https://www.openstack.org/videos/video/managing-container-clusters-in-openstack-native-way">Managing Container Clusters in OpenStack Native Way</a></li>
</ul>


<h3>Design Summit (Magnum)</h3>

<p>今回は一般セッションで二つプレゼンを行ったのちに、
デザインサミットに出っぱなし（まあ、前回もそうだったけれども）。
と言っても最後に少し喋っただけで、ほぼ聞くだけというのは相も変わらずだが、、
前回よりしゃべる内容が増えたのでよしとする。</p>

<h2>その他</h2>

<h3>プリペイド SIM</h3>

<p>今までの出張は毎回 WIFI ルータを借りて外でのネット接続はそれに頼っていたのだが、
毎回ルータの電源をつけたり切ったりするのがめんどくさくなってきたので、
せっかく SIM フリーの iPhone を使っていることだしということで
現地で SIM を買ってみることにした。</p>

<p class='image'>
<img  src='/log/2016/05/IMG_3734.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>事前情報によると空港内、Best Buy の自販機で SIM カードが売っているということだったが、
売っていたのは 3G のみのカードだったのでスルー。
結局 Walmart で T-Moblie の SIM カードを入手した。</p>

<p>ただ、Walmart まで行くのにタクシー使うことになるし、
プランも微妙だったので次回からは SIM カードは現地入手ではなく事前に入手しておきたい。</p>

<h3>Hooters</h3>

<p class='image'>
<img  src='/log/2016/05/IMG_3834.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>あとは、、本場の Hooters に行った。
テーブルについたねーちゃんは16時間も働きづめとか言ってて、
どこも大変だなーと。</p>

<p>次回は半年後、スペインはバルセロナ。</p>

    ]]></content:encoded>
    <dc:subject>日記</dc:subject>
    <dc:subject>Program/Python</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2016-05-01T12:22:34+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2015/12/02/multi-node-openstack-kolla">
    <title>マルチノードで OpenStack Kolla</title>
    <link>http://www.fraction.jp/log/archives/2015/12/02/multi-node-openstack-kolla</link>
    <description>OpenStack Advent Calendar 2015 の 2日目のエントリとして、OpenStack Magnumでコアレビューアやってるのになぜか Kolla の紹介をしますよ。(間違って早めに公開しちゃったけどまあいいか。)TL;DR依存するソフトウェアが以下のように少ないのでインストールがとてもシンプル。  Component  Min Version  Max Version  Comment  Ansible    1.9.4    none    On deployment h...</description>
    <content:encoded><![CDATA[
        <p><a href="http://www.adventar.org/calendars/968">OpenStack Advent Calendar 2015</a> の 2日目のエントリとして、
<a href="https://wiki.openstack.org/wiki/Magnum">OpenStack Magnum</a>
でコアレビューアやってるのになぜか <a href="https://wiki.openstack.org/wiki/Kolla">Kolla</a> の
紹介をしますよ。</p>

<p>(間違って早めに公開しちゃったけどまあいいか。)</p>

<h2>TL;DR</h2>

<p>依存するソフトウェアが以下のように少ないのでインストールがとてもシンプル。</p>

<table class="docutils">
<colgroup>
<col width="31%" />
<col width="16%" />
<col width="16%" />
<col width="37%" />
</colgroup>
<thead valign="bottom">
  <tr class="row-odd"><th class="head">Component</th>
  <th class="head">Min Version</th>
  <th class="head">Max Version</th>
  <th class="head">Comment</th>
</tr>
</thead>
<tbody valign="top">
  <tr class="row-even"><td>Ansible</td>
    <td>1.9.4</td>
    <td>none</td>
    <td>On deployment host</td>
  </tr>
  <tr class="row-odd"><td>Docker</td>
    <td>1.8.2</td>
    <td>1.8.2</td>
    <td>On target nodes</td>
  </tr>
  <tr class="row-even"><td>Docker Python</td>
    <td>1.2.0</td>
    <td>none</td>
    <td>On target nodes</td>
  </tr>
  <tr class="row-odd"><td>Python Jinja2</td>
    <td>2.6.0</td>
    <td>none</td>
    <td>On deployment host</td>
  </tr>
</tbody>
</table>


<p>ただし Kolla 自体はまだいくつか突っ込みどころ、
良く言えばパッチのしがいがあるプロジェクトなので自分たちで使って行って成熟させていくしかない感じ。</p>

<h2>OpenStack Kolla とは</h2>

<p>コンテナを利用して、プロダクションレディな OpenStack 環境を構築するツール。
現時点では実装に <a href="https://www.docker.com">Docker</a> と <a href="http://www.ansible.com">Ansible</a> を利用している。</p>

<h2>環境</h2>

<p>ドキュメントの
<a href="http://docs.openstack.org/developer/kolla/quickstart.html">Bare Metal Deployment of Kolla</a>
にはオールインワン構成時の構築方法しか載っていないため、
各種ツールを利用したりソースを読んでマルチノード構成のデプロイを頑張ってみる。</p>

<p>と、言ってもベアメタル四台も簡単に転がっていないので、
今回自分は以下のような VM 4台でマルチノード構成を組んだのだが、</p>

<p class='image'>
<img  src='/log/2015/12/IMG_2993.JPG'
      width='640'
      height='480'
      alt=''  />
</p>




<dl>
  <dt>Kolla Host</dt>
  <dd>VM を起動するホスト。各 VM はブリッジ接続で直接外につながっている。</dd>

  <dt>Operator Node</dt>
  <dd>Kolla をインストールし、ansible を起動したりイメージをビルドしたり、docker-registry をホストしたりする。</dd>

  <dt>Controller Node</dt>
  <dd>OpenStack の制御ノード。各コンポーネントの API サーバや MariaDB, RabbitMQ が動いている。</dd>

  <dt>Network Node</dt>
  <dd>OpenStack のネットワークノード。HAProxy が動いており keepalived で 二重化されている。</dd>

  <dt>Compute Node</dt>
  <dd>OpenStack の実行系。</dd>

</dl>


<p>とりあえず今回は operator/controller/network/compute
という同じネットワークに繋がった以下のスペックのベアメタルが4台あると思って読んでもらいたい！</p>

<ul>
<li>Memory: 8GB</li>
<li>NIC: eth0, eth1</li>
<li>OS: Ubuntu 14.04</li>
</ul>


<p>ちなみに以上の4台の VM は <code>uvtool</code> を使って用意したのだが、
その手順は <a href="https://github.com/yuanying/dev-kolla">github.com/yuanying/dev-kolla</a>
に一応書いておいた。</p>

<h2>controller/network/compute のセットアップ</h2>

<p>OpenStack の各プロセスはコンテナ化されているので当たり前のことだが、
最低限のセットアップで controller/network/compute のセットアップは終わる。
その、最低限必要なスペックは以下。</p>

<table>
<tr>
  <th>Component</th>
  <th>Min Version</th>
  <th>Max Version</th>
</tr>

<tr>
  <td>Kernel</td>
  <td>3.19</td>
  <td></td>
</tr>
<tr>
  <td>Docker</td>
  <td>1.8.2</td>
  <td>1.8.2</td>
</tr>
<tr>
  <td>Docker Python</td>
  <td>1.2.0</td>
  <td></td>
</tr>
</table>


<p><code>Docker Python</code> がターゲットノードに必要なのは、
デプロイに Ansible を使っている関係上、
Python から Dokcer のインタフェースを触れなければ困るため。</p>

<h3>カーネルのアップデート</h3>

<p>以下のスクリプトでカーネルをアップデートした後にノードの再起動。</p>

<pre><code>echo "Kernel version $(uname -r)"
if [[ $(uname -r) != *"3.19"* ]]; then
    echo "Going to update kernel image"
    apt-get update
    apt-get install -y linux-image-generic-lts-vivid
    # VM needs to be rebooted for docker to pickup the changes
    echo "Rebooting for kernel changes"
    echo "After reboot re-run vagrant provision to finish provising the box"
    reboot
    # Sleep for a bit to let vagrant exit properly
    sleep 3
fi
</code></pre>

<h3>Docker のインストール</h3>

<pre><code>apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" &gt; /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y  docker-engine=1.8.2*
sed -i -r "s,^[# ]*DOCKER_OPTS=.+$,DOCKER_OPTS=\"--insecure-registry operator.local:4000\"," /etc/default/docker
restart docker
</code></pre>

<p>ちなみにここで <code>--insecure-registry</code> として <code>operator.local:4000</code>
を Docker デーモンの起動オプションに渡している。
今回は、認証無しでの docker registry を利用しているためこれが必要。</p>

<p>また、operator.local というホスト名で operator ノードに繋がる必要があるため、
<code>/etc/hosts</code> に <code>192.168.201.1 operator.local</code> を追記する。</p>

<pre><code>sudo bash -c 'echo "192.168.201.1 operator.local" &gt;&gt; /etc/hosts'
</code></pre>

<h3>Docker Python のインストール</h3>

<pre><code>curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python
sudo pip install docker-py
</code></pre>

<h3>ntp のインストール</h3>

<pre><code>sudo apt-get install -y ntp
</code></pre>

<h3>SSH で root ログイン許可</h3>

<p>Kolla は Ansible の実行を root ユーザで行うため(イケテナイ)、
root の <code>.ssh/authorized_keys</code> に Ansible で利用する公開鍵を追記しておく必要がある。
また、念のため、<code>/etc/ssh/sshd_config</code> が <code>PermitRootLogin without-password</code>
されているか確認しておく。</p>

<h3>NIC の設定</h3>

<p><code>eth0</code> を OpenStack 各コンポーネントの API 通信に利用するので IP アドレスを振っておく。</p>

<pre><code># /etc/network/interface.d/eth0
auto eth0
iface eth0 inet static
address 192.168.201.X
netmask 255.255.0.0
gateway 192.168.11.1
dns-nameservers 8.8.8.8
</code></pre>

<p>また、<code>eth1</code> はテナント間ネットワークのトンネリング通信に利用するので以下のように設定しておく。</p>

<pre><code># /etc/network/interface.d/eth1
auto eth1
iface eth1 inet manual
up is link set dev $IFACE up
down is link set dev $IFACE down
</code></pre>

<p>以上を設定したらめんどくさいので reboot 。</p>

<h2>operator のセットアップ</h2>

<p>operator ノードには Kolla をインストールする。
デプロイその他の運用は operator ノードでやることになる。
また、Kolla のデプロイに必要なコンテナイメージはこのノードでホストされる。</p>

<h3>Kolla のソースのクローン</h3>

<p>ちなみに、現時点の Kolla ではこのマルチノード構成でちゃんとデプロイすることができず、
<a href="https://review.openstack.org/#/c/242777/">微妙な修正パッチ</a>
がマージされてしまい依然議論中な状態なので、
とりあえずその微妙なパッチがマージされる前のソースをチェックアウトし、
別のパッチを当てる。</p>

<pre><code>sudo git clone https://github.com/openstack/kolla.git /usr/local/share/kolla
cd /usr/local/share/kolla
sudo chown -R $USER .
git fetch https://review.openstack.org/openstack/kolla refs/changes/68/247368/5 &amp;&amp; git checkout FETCH_HEAD
git checkout -b fix-multinode
git checkout 8dd36c11bb5dab3358bcda6bd92dd87f329422d5
git checkout -b multinode-test
git merge fix-multinode
</code></pre>

<p>場所は <code>/usr/local/share/kolla</code> にハードコードされているので確実にここに置くこと。</p>

<h3>Kolla の設定</h3>

<p>/etc/kolla 配下に設定ファイルを配置する。
テンプレートは kolla のソースに含まれているのでそれをコピー。</p>

<pre><code>sudo cp -r /usr/local/share/kolla/etc/kolla /etc/
</code></pre>

<p>適当に <code>/etc/kolla/globals.yml</code> を修正。</p>

<pre><code>kolla_base_distro: "ubuntu"
kolla_install_type: "source"
kolla_internal_address: "192.168.201.100"
docker_registry: "operator.local:4000"
docker_insecure_registry: "True"
network_interface: "eth0"
neutron_external_interface: "eth1"
</code></pre>

<p><code>kolla_base_distro</code> に <code>ubuntu</code> を選んだ場合、
<code>kolla_install_type</code> は <code>source</code> しか指定できなくてハマった。</p>

<p><code>kolla_internal_address</code> は <code>keepalived</code> によって管理される VIP。
各 API はこのアドレスにアクセスして利用することになる。
ネットワークで使われていないアドレスを指定する。</p>

<p>また、ここで NIC の指定を <code>network_interface</code> と <code>neutron_external_interface</code>
でしているが、ヘテロな環境の場合、
各ノードでネットワークカードのデバイス名が違うっていうことがあり得る。
っていうか自分が作った環境であったためパッチを書いたのだが、</p>

<ul>
<li><a href="https://review.openstack.org/#/c/247999/">Change Id15d70bf: Fix retrieving api_interface | review.openstack Code Review</a></li>
</ul>


<p><del datetime="2015-12-25T08:10+09:00">すでに blueprint が挙がっていて実装者が決まっていたので放置。
(ってかこれ bug じゃなくて blueprint だったのかって指摘されて思った。)</del>
マージされました。</p>

<h3>bootstrap スクリプトの実行</h3>

<p><code>Vagrant</code> 用に operator ノードに必要パッケージをインストールするスクリプトが添付されているので、
使ってやる。</p>

<pre><code>sudo sed -i -r "s/^(127\.0\.0\.1\s+)(.*)/\1 \2 operator.local/" /etc/hosts
sudo mkdir -p /data/host/registry-storage
sudo bash /usr/local/share/kolla/dev/vagrant/ubuntu-bootstrap.sh \
       operator multinode /usr/local/share/kolla
</code></pre>

<h3>Kolla のインストール</h3>

<p>clone してきたソースから kolla 関連のコマンドをインストールする。</p>

<pre><code>cd /usr/local/share/kolla
sudo python setup.py develop
</code></pre>

<p>以上で kolla のインストールは完了。</p>

<h2>OpenStack のデプロイ</h2>

<h3>イメージのビルド</h3>

<pre><code>sudo kolla-build --base ubuntu --type source --registry operator.local:4000 --push
</code></pre>

<p>コマンドを実行したのちにしばし待つ。</p>

<h3>OpenStack のデプロイ</h3>

<p>kolla は Ansible を利用してデプロイを行うため、
Ansible の inventory ファイルを用意する必要がある。
マルチノード用の inventory ファイルのサンプルをコピーして修正するのが良い。</p>

<pre><code>cp /usr/local/share/kolla/ansible/inventory/multinode ~/inventory
</code></pre>

<p>control/network/compute のアドレスはそれぞれ、192.168.201.2, 3, 4 なので、
こんな感じに修正する。</p>

<pre><code>ubuntu@dev-yuanying:~$ diff -u inventory.old inventory
--- inventory.old   2015-11-24 09:44:20.030821655 +0000
+++ inventory   2015-11-24 09:45:44.602821655 +0000
@@ -2,9 +2,7 @@
 # additional groups are for more control of the environment.
 [control]
 # These hostname must be resolvable from your deployment host
-control01
-control02
-control03
+192.168.201.2

 # The above can also be specified as follows:
 #control[01:03]     ansible_ssh_user=kolla
@@ -12,13 +10,12 @@
 # The network nodes are where your l3-agent and loadbalancers will run
 # This can be the same as a a host in the control group
 [network]
-network01
+192.168.201.3

 [compute]
-compute01
+192.168.201.4

 [storage]
-storage01


 # You can explicitly specify which hosts run each project by updating the
</code></pre>

<p>inventory を修正したらそれをして deploy を実行。</p>

<pre><code>sudo kolla-ansible deploy -i ~/inventory
</code></pre>

<p><code>sudo</code> は必須。うまくいかない時は <code>root</code> ユーザ間でちゃんと ssh できるかどうかを確認しておく。</p>

<p>以上。</p>

<p>パスワード類は、<code>/etc/kolla/passwords.yml</code>
に書かれているので各サービスにはこれを利用してアクセスする。</p>

<h2>参考</h2>

<ul>
<li><a href="https://github.com/yosshy/wiki/wiki/Setup-OpenStack-with-Kolla-on-Vagrant">Setup OpenStack with Kolla on Vagrant</a></li>
</ul>


    ]]></content:encoded>
    <dc:subject>Program/Python</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2015-12-02T11:50:32+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2015/06/05/linuxcon">
    <title>LinuxCon Japan 2015</title>
    <link>http://www.fraction.jp/log/archives/2015/06/05/linuxcon</link>
    <description>LinuxCon Japan 2015 で発表してきてやった。内容は 「Introduction to Magnum -- Containers Service for OpenStack」ということで、最近仕事で開発している OpenStack Magnumの簡単な紹介。簡単な紹介、、という割に 50分も時間が割り当てられているので、それをどう引き延ばすかで資料作りに四苦八苦した。苦肉の策として余った時間をデモに割り当て。また、さえない男がひとりでプレゼンしててもつまらないし、そもそも自分の英語...</description>
    <content:encoded><![CDATA[
        <p>LinuxCon Japan 2015 で発表してきてやった。</p>

<p>内容は 「Introduction to Magnum -- Containers Service for OpenStack」
ということで、最近仕事で開発している <a href="https://wiki.openstack.org/wiki/Magnum">OpenStack Magnum</a>
の簡単な紹介。</p>

<p>簡単な紹介、、という割に 50分も時間が割り当てられているので、
それをどう引き延ばすかで資料作りに四苦八苦した。
苦肉の策として余った時間をデモに割り当て。</p>

<p class='image'>
<img  src='/log/2015/06/IMG_1489.JPG'
      width='800'
      height='450'
      alt=''  />
</p>


<p>また、さえない男がひとりでプレゼンしててもつまらないし、
そもそも自分の英語リスニング能力には疑いがあったので、
QA の時間にまともに受け応えることができないことが予想された訳で。
(プレゼン、質疑応答すべて英語という謎仕様。ここ、日本なのに…。)</p>

<p class='image'>
<img  src='/log/2015/06/IMG_1495.JPG'
      width='800'
      height='450'
      alt=''  />
</p>


<p>英語のできるお姉ちゃんをひとり引き込んでプレゼンの半分を担当してもらった。
我ながら酷い話だ。</p>

    ]]></content:encoded>
    <dc:subject>Program/Python</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2015-06-05T20:25:28+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2015/02/06/ansible-http-proxy">
    <title>Ansible で http_proxy</title>
    <link>http://www.fraction.jp/log/archives/2015/02/06/ansible-http-proxy</link>
    <description>問題Proxy 環境下で ansible を利用しようとするとたまにはまることがある。具体的には以下のようなタスクで pip が失敗したり。- hosts: all  sudo: yes  tasks:    - pip: name=python-docker state=installedちょっとぐぐるとオフィシャルな解決方法が出てくる。それによるとタスクごとに proxy の設定をしろと書いてある。- hosts: all  remote_user: root  # here we make ...</description>
    <content:encoded><![CDATA[
        

<p class='image'>
<img  src='/log/2015/02/ansible.png'
      width='569'
      height='298'
      alt=''  />
</p>


<h2>問題</h2>

<p>Proxy 環境下で ansible を利用しようとするとたまにはまることがある。
具体的には以下のようなタスクで pip が失敗したり。</p>

<pre><code>- hosts: all
  sudo: yes
  tasks:
    - pip: name=python-docker state=installed
</code></pre>

<p>ちょっとぐぐると<a href="http://docs.ansible.com/playbooks_environment.html">オフィシャルな解決方法</a>が出てくる。
それによるとタスクごとに proxy の設定をしろと書いてある。</p>

<pre><code>- hosts: all
  remote_user: root

  # here we make a variable named "proxy_env" that is a dictionary
  vars:
    proxy_env:
      http_proxy: http://proxy.example.com:8080

  tasks:

    - pip: name=python-docker state=installed
      environment: proxy_env
</code></pre>

<p>が、一個一個タスクに <code>environment</code> キーワードを使って環境変数を設定していくのはすごくだるい。</p>

<h2>解決方法</h2>

<p><code>playbook</code> の最初の方で対象のホストの <code>/etc/environment</code> ファイルに、
proxy 関連の環境変数を一括で設定しまうことで解決した。</p>

<pre><code>- hosts: all
  vars:
    proxy:
      http_proxy: http://proxy.example.com:8080

  tasks:
  - name: Add no_proxy to /etc/environment
    sudo: yes
    lineinfile:
      create: yes
      dest: '/etc/environment'
      state: present
      line: 'no_proxy="{{ proxy.no_proxy }}"'
    when: proxy.no_proxy | default(False)
    register: no_proxy_result

  - name: Add http_proxy to /etc/environment
    sudo: yes
    lineinfile:
      create: yes
      dest: '/etc/environment'
      state: present
      line: 'http_proxy="{{ proxy.http_proxy }}"'
    when: proxy.http_proxy | default(False)
    register: http_proxy_result

  - name: Add https_proxy to /etc/environment
    sudo: yes
    lineinfile:
      create: yes
      dest: '/etc/environment'
      state: present
      line: 'https_proxy="{{ proxy.https_proxy }}"'
    when: proxy.https_proxy | default(False)
    register: https_proxy_result

  - name: Restart sshd
    service: name=ssh state=restarted
    sudo: yes
    when: &gt;
      no_proxy_result.changed == true or
      http_proxy_result.changed == true or
      https_proxy_result.changed == true
</code></pre>

<p>ただ、設定した後に対象ホストの <code>sshd</code> を再起動しないと、
環境変数が反映されないことがあったので注意。</p>

    ]]></content:encoded>
    <dc:subject>Program/Python</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2015-02-06T08:41:53+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2015/01/06/create-dev-env-magnum">
    <title>OpenStack Magnum の開発環境を整える 2015年1月版</title>
    <link>http://www.fraction.jp/log/archives/2015/01/06/create-dev-env-magnum</link>
    <description>なんかしょっちゅう devstack がぶっ壊れるので、OpenStack Magnum の開発環境を整える方法をメモ。絶賛開発中なのですぐに情報が古くなると思うけど。Devstack8GB ほどメモリを積んだ VM を Vagrant で用意。devstack を起動する。必要パッケージのインストール$ sudo apt-get update$ sudo apt-get install -y vim git libmysqlclient-dev openvswitch-switchkuberne...</description>
    <content:encoded><![CDATA[
        

<p class='image'>
<img  src='/log/2015/01/magnum.jpg'
      width='650'
      height='410'
      alt=''  />
</p>


<p>なんかしょっちゅう devstack がぶっ壊れるので、
OpenStack <a href="https://launchpad.net/magnum">Magnum</a> の開発環境を整える方法をメモ。
絶賛開発中なのですぐに情報が古くなると思うけど。</p>

<h2>Devstack</h2>

<p>8GB ほどメモリを積んだ VM を Vagrant で用意。
devstack を起動する。</p>

<h3>必要パッケージのインストール</h3>

<pre><code>$ sudo apt-get update
$ sudo apt-get install -y vim git libmysqlclient-dev openvswitch-switch
</code></pre>

<h3>kubernetes client のインストール</h3>

<p><a href="https://github.com/GoogleCloudPlatform/kubernetes/releases">ダウンロードページ</a>
から適当なバージョンのリリース、今回は v0.8.0 をダウンロードし、
適時 PATH の通った場所にコピー。</p>

<pre><code>$ curl -O -L https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v0.8.0/kubernetes.tar.gz
$ tar zxvf kubernetes.tar.gz
$ cd kubernetes/platforms/linux/amd64/
$ sudo cp -rp ./* /usr/local/bin/
</code></pre>

<h3>Network 事前準備</h3>

<p>eth2 を以下のように修正。</p>

<pre><code>auto eth2
iface eth2 inet manual
        up ifconfig $IFACE 0.0.0.0 up
        up ip link set $IFACE promisc on
        down ip link set $IFACE promisc off
        down ifconfig $IFACE 0.0.0.0 down
</code></pre>

<p>devstack がその後に作る br-ex を事前に作り設定。</p>

<pre><code>$ sudo ifup eth2
$ sudo ovs-vsctl add-br br-ex
$ sudo ovs-vsctl add-port br-ex eth2
$ sudo ovs-vsctl add-port br-ex p0
$ sudo ovs-vsctl set interface p0 type=internal
$ sudo ifconfig p0 192.168.11.139
</code></pre>

<h3>Devstack 起動</h3>

<pre><code>$ cd /vagrant
$ git clone https://git.openstack.org/openstack-dev/devstack
$ cd devstack
$ git checkout -b stable/juno origin/stable/juno
$ ./stack.sh
</code></pre>

<p>devstack の localrc は以下。
現状、利用している heat のテンプレートが最新版で動かないので、
stable/juno を利用。</p>

<pre><code>HOST_IP=192.168.11.139

FLOATING_RANGE=192.168.11.0/24
Q_FLOATING_ALLOCATION_POOL="start=192.168.11.133,end=192.168.11.138"
PUBLIC_NETWORK_GATEWAY=192.168.11.1

Q_USE_SECGROUP=True
ENABLE_TENANT_VLANS=True
TENANT_VLAN_RANGE=1000:1999
PHYSICAL_NETWORK=default
OVS_PHYSICAL_BRIDGE=br-ex

NETWORK_GATEWAY=10.11.12.1
FIXED_RANGE=10.11.12.0/24
FIXED_NETWORK_SIZE=256

ADMIN_PASSWORD=openstack
MYSQL_PASSWORD=stackdb
RABBIT_PASSWORD=stackqueue
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=tokentoken

disable_service n-net
enable_service q-svc
enable_service q-agt
enable_service q-dhcp
enable_service q-l3
enable_service q-meta
enable_service neutron

NOVA_BRANCH=stable/juno
GLANCE_BRANCH=stable/juno
KEYSTONE_BRANCH=stable/juno
HORIZON_BRANCH=stable/juno
CINDER_BRANCH=stable/juno
NEUTRON_BRANCH=stable/juno
CEILOMETER_BRANCH=stable/juno
HEAT_BRANCH=stable/juno

LOGFILE=$DEST/logs/devstack.log
DEST=/opt/stack
SCREEN_LOGDIR=$DEST/logs/screen
</code></pre>

<p>local.sh</p>

<pre><code># /bin/bash
sudo ifconfig br-ex 0.0.0.0
</code></pre>

<h2>Magnum</h2>

<h3>ソースのインストール</h3>

<h4>Magnum サーバ</h4>

<pre><code>$ cd /vagrant
$ git clone https://github.com/stackforge/magnum.git
$ cd magnum
$ tox -evenv -- echo 'done'
</code></pre>

<h4>Magnum クライアント</h4>

<pre><code>$ cd /vagrant
$ git clone https://github.com/stackforge/python-magnumclient.git
$ cd python-magnumclient
$ tox -evenv -- echo 'done'
</code></pre>

<h3>設定</h3>

<pre><code>$ sudo mkdir -p /etc/magnum/templates
$ cd /etc/magnum/templates
$ sudo git clone https://github.com/larsks/heat-kubernetes.git
$ cd /etc/magnum
$ vim magnum.conf
</code></pre>

<p>magnum.conf の中身は以下。</p>

<pre><code>[DEFAULT]
debug = True
verbose = True

rabbit_password = stackqueue
rabbit_hosts = 192.168.11.139
rpc_backend = rabbit

[database]
connection = mysql://root:stackdb@localhost/magnum

[keystone_authtoken]
admin_password = openstack
admin_user = nova
admin_tenant_name = service
identity_uri = http://192.168.11.139:35357

auth_uri=http://192.168.11.139:5000/v2.0
auth_protocol = http
auth_port = 35357
auth_host = 192.168.11.139
</code></pre>

<h3>Keystone に Magnum サービスを登録</h3>

<pre><code>$ source /vagrant/devstack/openrc admin admin
$ keystone service-create --name=container \
                        --type=container \
                        --description="Magnum Container Service"
$ keystone endpoint-create --service=container \
                         --publicurl=http://127.0.0.1:9511/v1 \
                         --internalurl=http://127.0.0.1:9511/v1 \
                         --adminurl=http://127.0.0.1:9511/v1
</code></pre>

<h3>デフォルトの key-pair を追加</h3>

<pre><code>$ ssh-keygen
$ source /vagrant/devstack/openrc demo demo
$ nova keypair-add --pub-key ~/.ssh/id_rsa.pub default
</code></pre>

<h3>Image の登録</h3>

<p>Magnum で利用する VM のイメージを Glance に登録。</p>

<pre><code>$ cd /vagrant
$ curl -O https://fedorapeople.org/groups/heat/kolla/fedora-21-atomic.qcow2
$ source /vagrant/devstack/openrc admin admin
$ glance image-create \
    --disk-format qcow2 \
    --container-format bare \
    --is-public True \
    --name fedora-21-atomic \
    --file /vagrant/fedora-21-atomic.qcow2
</code></pre>

<h3>Database</h3>

<p>devstack が作成されたらとりあえずデータベースを作る。</p>

<pre><code>$ mysql -h 127.0.0.1 -u root -pstackdb mysql &lt;&lt;EOF
CREATE DATABASE IF NOT EXISTS magnum DEFAULT CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON magnum.* TO
    'root'@'%' IDENTIFIED BY 'stackdb'
EOF
</code></pre>

<p>テーブル作成。</p>

<pre><code>$ cd /vagrant/magnum
$ source .tox/venv/bin/activate
$ pip install mysql-python
$ magnum-db-manage upgrade
</code></pre>

<h3>Magnum の起動</h3>

<p>端末が3個あると良い。</p>

<h4>magnum-api</h4>

<pre><code>$ cd /vagrant/magnum
$ source .tox/venv/bin/activate
$ magnum-api
</code></pre>

<h4>magnum-conductor</h4>

<pre><code>$ cd /vagrant/magnum
$ source .tox/venv/bin/activate
$ magnum-conductor
</code></pre>

<h4>python-magnumclient</h4>

<pre><code>$ cd /vagrant/python-magnumclient
$ source .tox/venv/bin/activate
$ magnum bay-list
</code></pre>

<h2>Bay を作ってみる</h2>

<p><code>Bay</code> とは <code>Pod</code> を管理するリソースという意味らしい。
ぶっちゃけ k8s をホストするクラスターのこと。</p>

<pre><code>magnum baymodel-create --name default --keypair_id default \
  --external_network_id 97dc1372-b002-47a0-82e2-63e8896f107c \
  --image_id fedora-21-atomic \
  --flavor_id m1.small

magnum bay-create --name kube --baymodel_id ae8fd2a5-6076-4b36-a545-61c15ee43677
</code></pre>

<p>以上。</p>

    ]]></content:encoded>
    <dc:subject>Program/Python</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2015-01-06T12:33:48+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2014/12/31/summary-of-2014">
    <title>2014 年まとめ</title>
    <link>http://www.fraction.jp/log/archives/2014/12/31/summary-of-2014</link>
    <description>2014 年が終わった。振り返ってみてみると、後半の調子よさっぷりは半端なかった。この調子で 2015 年も引き続き行けたら良いなとは思うが、運の良さを持続できるかどうかは実力次第なので如何ともしがたい。トライアスロン今年は年初にランニング 2000km を走ろうという目標を密やかに立て、達成した。二年ぶりの徳之島トライアスロンはあまり納得いかない結果ではあったが、一応自己ベスト、ということでまあまあな一年だった気がする。練習距離は以下。カッコ内は去年。ラントータル、2002.83km (1056...</description>
    <content:encoded><![CDATA[
        <p>2014 年が終わった。振り返ってみてみると、後半の調子よさっぷりは半端なかった。
この調子で 2015 年も引き続き行けたら良いなとは思うが、
運の良さを持続できるかどうかは実力次第なので如何ともしがたい。</p>

<h2>トライアスロン</h2>

<p>今年は年初にランニング 2000km を走ろうという目標を密やかに立て、達成した。
<a href="/log/archives/2014/07/24/tokunoshima-triathlon">二年ぶりの徳之島トライアスロン</a>
はあまり納得いかない結果ではあったが、
一応自己ベスト、ということでまあまあな一年だった気がする。</p>

<p>練習距離は以下。カッコ内は去年。</p>

<ul>
<li>ラントータル、2002.83km (1056.14km)</li>
<li>バイクトータル、6981.24km (6619.68km)</li>
<li>スイムトータル、22.18km (19.85km)</li>
</ul>


<h3>ラン</h3>

<p class='image'>
<img  src='/log/2014/12/run.png'
      width='551'
      height='308'
      alt=''  />
</p>


<p>一ヶ月ほど危うい月があったが、
今年ほどコンスタントに毎月走れた年は無いのではなかろうか。
なにより 2000km 走れたのが大きい。</p>

<p>…しかし練習回数少な目で年に 2000km 走ろうとすると、
週二で 30km ランとかいうちょっと継続したくない練習方法になってしまうので、
来年はもう少し適当にやっていきたい。</p>

<h3>バイク</h3>

<p class='image'>
<img  src='/log/2014/12/bike.png'
      width='504'
      height='308'
      alt=''  />
</p>


<p>出張で走れない日が多かったものの、思ったより距離は踏んでいた。
一番好きな種目であるはずなのだが最近はランの練習に偏りすぎてて、
バイクの筋肉が完全に落ちてる気がする。要検討。</p>

<h3>スイム</h3>

<p class='image'>
<img  src='/log/2014/12/swim.png'
      width='504'
      height='309'
      alt=''  />
</p>


<p>今年の徳之島で、練習しててもしてなくてもタイムは変わらんということがはっきりとわかってしまったので、
練習のモチベーションが急降下中、というか7月以降やっていない。
これについては打開策を打ったがどうなるかは微妙。来年待ち。</p>

<h2>ソフトウェア関連</h2>

<p>今年はどういうわけか大きな転換点があった。Rubyist から Pythonista へクラスチェンジ。</p>

<blockquote class="twitter-tweet" lang="ja"><p>Magnum のコアになった。<a href="https://t.co/V9kcpgHGL5">https://t.co/V9kcpgHGL5</a></p>&mdash; Yuanying (@yuanying) <a href="https://twitter.com/yuanying/status/550070636068876291">2014, 12月 30</a></blockquote>


<p> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>

<p>それというのも仕事が PaaS は Cloud Foundry の調査から、
OpenStack の調査開発研究へと変わったからだが。
下期の目標である「OpenStack のなんらかのコンポーネントのコアレビューワになる」
を今年中に滑り込みで達成した。</p>

<p><a href="https://twitter.com/masayukig">@masayukig</a> からは達成したのならば、
<strong>CENSORED</strong> とのことなので夏のボーナス期待である。</p>

    ]]></content:encoded>
    <dc:subject>日記</dc:subject>
    <dc:subject>独り言</dc:subject>
    <dc:subject>Program/Python</dc:subject>
    <dc:subject>自転車</dc:subject>
    <dc:subject>トライアスロン</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2014-12-31T21:48:43+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2008/09/14/PSP_de_Hello_World">
    <title>PSP で Hello World</title>
    <link>http://www.fraction.jp/log/archives/2008/09/14/PSP_de_Hello_World</link>
    <description>PSP っていっても &quot;ぷれいすてーしょんぽーたぶる&quot; じゃないです。Python Server Pagesのことですよ。PHP も気軽に動的なウェブページを書くのには良いと思うけど、いまさら覚える気にならないのが痛いところ。っということで PSP なるものがあることを知ったのでレッツトライ！sudo port install apache2sudo port install python25sudo port install py25-hashlibsudo port install pytho...</description>
    <content:encoded><![CDATA[
        <p>PSP っていっても "ぷれいすてーしょんぽーたぶる" じゃないです。
<a href="http://www.python.jp/doc/contrib/modpython/pyapi-psp.html#pyapi-psp">Python Server Pages</a>
のことですよ。</p>

<p>PHP も気軽に動的なウェブページを書くのには良いと思うけど、
いまさら覚える気にならないのが痛いところ。</p>

<p>っということで PSP なるものがあることを知ったのでレッツトライ！</p>

<pre><code>sudo port install apache2
sudo port install python25
sudo port install py25-hashlib
sudo port install python_select
sudo python_select python25
sudo port install mod_python25
</code></pre>

<p>っとまあインストールしまして。
httpd.conf に <code>LoadModule python_module modules/mod_python.so
</code> を書き加える。</p>

<p>ついでに userdir も有効化。</p>

<pre><code>LoadModule python_module modules/mod_python.so
# User home directories
Include conf/extra/httpd-userdir.conf
</code></pre>

<p>~/Sites/psp というフォルダを作って、.htaccess に以下のように記述。</p>

<pre><code># ~/Sites/psp/.htaccess
AddHandler mod_python .psp
PythonHandler mod_python.psp
</code></pre>

<p>さっそく index.psp を。</p>

<pre><code class='prettyprint'>
&lt;html&gt;
&lt;%
import time
%&gt;
Hello world, the time is: &lt;%=time.strftime("%Y-%m-%d, %H:%M:%S")%&gt;
&lt;/html&gt;
</code></pre>


<p><img src="/log/2008/09/index.psp.png" width="400" height="167" alt="index.psp.png" /></p>

<p>よしよし。</p>

    ]]></content:encoded>
    <dc:subject>Apple</dc:subject>
    <dc:subject>Program/Python</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2008-09-14T07:48:47+09:00</dc:date>
  </item>
</rdf:RDF>
