OpenStackの設定と格闘していました

おはようございます。ライトノベル好きのツチノコです。

さて、先日までOpenStackの検証環境を作って検証をしていました(Mitaka Release)。
その時につらかったことの1つが、設定項目に設定するべき値やそもそも項目自体の存在がわからないということでした。
結果としてドキュメントやdaemon起動時の設定値のダンプを見ていろいろと悩んで解決できたのですが、そもそも設定値がどこで定義されているかをmain関数から追いかけてみました。

novaを例にとるとmain関数はcmd/以下にあります。
cmd/api.pyを例に読んでいきます。

37行目にそれっぽい部分があります。

CONF = nova.conf.CONF

nova.conf.CONFはconf/__init__.pyで定義されています。
cfg.CONFはoslo_config.cfg.CONFというグローバル変数で、その下にそれっぽい関数があります。

CONF = cfg.CONF

api.register_opts(CONF)
availability_zone.register_opts(CONF)
base.register_opts(CONF)
cache.register_opts(CONF)
cells.register_opts(CONF)

この関数の実態はconf/api.py#L403にあります。
それで上のほうを見ると、OptGroup(confファイルで[api]などのセクションになる)とOpt(confファイルでauth_stratedy=…_というオプションと値となる)が定義されているところが見つかります。

api_group = cfg.OptGroup('api',
    title='API options',
    help="""
Options under this group are used to define Nova API.
""")

auth_opts = [
    cfg.StrOpt("auth_strategy",
        default="keystone",
        choices=("keystone", "noauth2"),
        deprecated_group="DEFAULT",
        help="""
This determines the strategy to use for authentication: keystone or noauth2.
'noauth2' is designed for testing only, as it does no actual credential
checking. 'noauth2' provides administrative credentials only if 'admin' is
specified as the username.
"""),

まとめ(novaの場合)
・conf/*.py に各オプションの定義があります。
・import nova.conf した段階で各オプションがCONFに登録されます。

他の(いまのところドキュメントが充実していない)プロジェクトもこうやっていけばオプションにたどり着けるはずです。

おまけ
こんな感じで全ファイルをロードしてregister_opts関数を呼べばひょっとしてオプションのリストができるのではということを思いつきました。何事も暴力で解決するのが一番だ。

for 全ファイル
    import モジュール as dummy
    dummy.register_opts(conf)
    print(conf)

結果のnova.txt(348KBあります)の一部です。

[DEFAULT]

(snip...)

[api]

(snip...)

auth_strategy = keystone
# class:      
# deprecated: False
# multi:      False
# required:   False
# help:
# This determines the strategy to use for authentication: keystone or noauth2.
# 'noauth2' is designed for testing only, as it does no actual credential
# checking. 'noauth2' provides administrative credentials only if 'admin' is
# specified as the username.

わーい。

生成に利用したツールは以下の場所にあります。
リポジトリ
プロジェクトごとに生成したテキスト
中間生成されるjsonの例

ドキュメントがあればそちらを参照するのがよいですが、今のところドキュメントが見当たらないdesignate/magnumなども生成できますので、これはこれでよいかなというところです。

今後もいろいろ実験していこうかと思います。

P.S. 発売日が近い本の中でぜったい転職したいんです!! ~バニーガールは賢者を目指す~が気になっています

PPAP – Printing Performance Achitecture Protocol

そろそろ忘年会シーズンです。
PPAP、練習してますかー?

ちなみにPPAPというのは、HPの独自プロトコルです。
詳細は以下を読んでください。

PPA – HP Printing Performance Architecture
http://www.undocprint.org/formats/page_description_languages/ppa

 

英語は苦手ですよね?
最近パワーアップしたというGoogle翻訳を使ってみました。

PPAPをGoogle翻訳

英語

The PPA protocol is actually composed of two protocols: a lower-level packet protocol called VLink and the Sleek Control Protocol (SCP). The VLink protocol regulates all data transferred back and forth between the printer and the computer. SCP sends command sequences to tell the printer to do things like load a sheet of paper, eject, and print a sweep.

Although PPA is a bi-directional protocol, I have mainly concentrated on its uni-directional component. It is not required for the host to be aware of the bi-directional nature of the device, which makes this easy to do.

All values are stored in big endian format.

日本語

PPAプロトコルは実際には、VLinkと呼ばれる低レベルパケットプロトコルとSCP(Sleek Control Protocol)という2つのプロトコルで構成されています。 VLinkプロトコルは、プリンタとコンピュータ間で転送されるすべてのデータを制御します。 SCPは、コマンドシーケンスを送信して、プリンタに用紙のセット、取り出し、掃引などの処理を指示します。

PPAは双方向プロトコルですが、私は主にその一方向コンポーネントに集中しています。 ホストがデバイスの双方向性を認識することは必須ではありません。このため、これを簡単に行うことができます。

すべての値はビッグエンディアン形式で格納されます。

 

ほぼ完璧な翻訳。
Google翻訳すげー、というネタでした。

忘年会で無駄な小ネタを披露してツルツル滑って欲しいな、と願っています。

cd ../../../ をなんとかしました

おはようございます。ライトノベル好きのツチノコです。年末年始に読むライトノベルは決めましたか?

さてansibleのplaybookを書いていたりすると、ディレクトリ構造が深くなりがちです。
作業中に深いディレクトリから浅いディレクトリへ移動するときにめんどいのでなんとかしました。
・cd ../../../ などで上がろうとすると、いくつ上がるんだっけとか、間違って ./ や …/ と typo する
・popd しようとしても移動先ディレクトリがスタックに入ってるとは限らない

watanabe-k@deploy:~/openstack-playbook/roles/image/templates/etc/glance/rootwrap.d$ pwd
/home/watanabe-k/openstack-playbook/roles/image/templates/etc/glance/rootwrap.d
watanabe-k@deploy:~/openstack-playbook/roles/image/templates/etc/glance/rootwrap.d$ # ここから openstack-playbook/roles に cd したい

.bashrc に以下のfunctionを定義します。

# .bashrc
function upto() {
    if [ $# -eq 0 ]; then
        cd ~
    else
        ptn=$(echo -n $1 | sed -e 's/\/$//g;s/\//\\\//g;')
        exp='s/\(.*'$ptn'[^/]*\/\).*/\1/g'
        dir=$(pwd)"/"
        cd $(echo $dir | sed -e "$exp")
    fi
}

function upto_completion() {
    COMPREPLY=( $(compgen -W "$(pwd|sed -e 's/\// /g')" ${COMP_WORDS[COMP_CWORD]} ) )
}
complete -F upto_completion upto

これでカレントディレクトリのパスの一部を指定して、そのディレクトリにcdするコマンドuptoができました。

$ upto pathの一部

こんな感じで使えます。

watanabe-k@deploy:~/openstack-playbook/roles/image/templates/etc/glance/rootwrap.d$ upto roles
watanabe-k@deploy:~/openstack-playbook/roles$

補完も効きます(候補がsortされるけど・・・)

watanabe-k@deploy:~/openstack-playbook/roles/image/templates/etc/glance/rootwrap.d$ upto [tab][tab]
etc                 glance              home                image               openstack-playbook  roles               rootwrap.d          templates           watanabe-k

部分一致にも対応してます。

watanabe-k@deploy:~/openstack-playbook/roles/image/templates/etc/glance/rootwrap.d$ upto openstack
watanabe-k@deploy:~/openstack-playbook$

べんり。

p.s. 華麗なる探偵アリス&ペンギンおもしろいですね

酉の日なのでUTPケーブルで熊手を作ってみた

今日はポッキーの日ですが、酉の市の日でもあります。

酉の市
https://ja.wikipedia.org/wiki/%E9%85%89%E3%81%AE%E5%B8%82

今年の酉の市は11月11日と23日、深夜0時から24時間続きます。

昨晩新宿の花園神社に行ってきました。
沢山の提灯が吊られ、縁起物である熊手が沢山売られていました。

img_4364

小さいのを1つ買ってみましたが、自分でも作ってみたくなりますよね。

img_4368

ということで、みんなの手元にあるUTPケーブルを使って熊手を自作してみます。

素材、道具

  • UTPケーブル
  • ニッパー
  • ケーブルストリッパー
  • 細径電動ドリル

img_4373

ケーブルを剥く

ケーブルストリッパーで 被膜を剥きます。

img_4374

img_4376

被膜を加工

開いて、ドリルで穴を開けていきます。
安全のためダンボール箱に養生テープで固定しつつ作業をしています。

img_4382

img_4383

ケーブルを整形

より線をほどいて、まっすぐにして、いつもの順番に揃えます。

img_4386

img_4389

パーツを組み合わせて整形

被覆の穴にケーブルを通して整形します。

img_4391

img_4393

飾って完成

とりあえずディスプレイに貼ってみました。

img_4395

 

30分ほどで作れます。

みなさんも作ってみてはいかがでしょうか?

もの作りは楽しいです。

DMM.make AKIBA も今日で2周年です。

ONIEをbuildしました

おはようございます。ライトノベル好きのツチノコです。ヒマワリの季節が近づいてきましたね。

さて、タイトルの通り、ONIEをbuildしました(というか何回かしている)ので日本語で手順をまとめておきます。
公式のドキュメントは https://github.com/opencomputeproject/onie/wiki/Building-ONIE です。

5月のJapan ComCamp meets de:codeでLTした、例のブンチンカッコカリからのリカバリの時にも利用しました(スライド中ではONIE関連は省略)。

前の記事はここです。間があいてしまってもうしわけないです(夏休みの宿題はためるタイプでした)

環境はDockerで作ってしまうことにします。Dockerfileは https://gist.github.com/wataken44/e5e6c7f94b257c15196d50bab9a9a2de にあります。

まずはimageをbuildします。

# wget https://gist.githubusercontent.com/wataken44/e5e6c7f94b257c15196d50bab9a9a2de/raw/13fe198b9e93c7ab2a45767c176435f11ad89247/ONIE.Dockerfile -O Dockerfile
# docker build -t onie-work:latest <Dockerfileを置いたディレクトリ>

Dockerfileの中身は以下のようになってます。

FROM debian:jessie

MAINTAINER example@example.com

RUN apt-get clean && apt-get update
# git-coreはリポジトリとってくるのに必要
# sudo, makeは公式のMakefileで環境を整える(make debian-prepare-build-host)のに必要
# wget, pkg-config, cpioはbuildに必要だが、公式のMakefileでインストールされないので必要
RUN apt-get install -y git-core sudo make wget pkg-config cpio

# rootではbuildできないのでbuilduserを追加してsudoersに追加
RUN useradd -m builduser
RUN echo 'builduser ALL=(ALL:ALL) ALL' >> /etc/sudoers

# リポジトリをclone
RUN su builduser -c "cd /home/builduser/; git clone https://github.com/opencomputeproject/onie"
# 公式のMakefileで環境を整える(色々パッケージがインストールされる)
RUN cd /home/builduser/onie/build-config && make debian-prepare-build-host

# gitのglobal設定を適当に入れる(入れておかないとbuildがこける)
RUN su builduser -c "git config --global user.email example@example.com; git config --global user.name example"
# bashを使う
RUN chsh -s /bin/bash builduser
# PATHを設定(設定しないとmkdosfsが実行できずbuildがこける)
RUN echo 'export PATH=$PATH:/sbin/:/usr/sbin/' >> /home/builduser/.bashrc

コンテナを走らせてbuildします。

# docker run --name onie-work -i -t onie-work /bin/bash
root@f304bbf507f4:/# su builduser
builduser@f304bbf507f4:/$ cd ~/onie/build-config
builduser@f304bbf507f4:~/onie/build-config$ make -j4 MACHINEROOT=../machine/<vendor> MACHINE=<vendor>_<model> all

<vendor>,<model>のところにはお手元の機種名を入れます。DellのS6000-ONだとそれぞれdell, s6000_s1220になります。一覧は ~/onie/machine 以下にあります。

builduser@f304bbf507f4:~/onie/machine$ ls --color=none
accton  alphanetworks  celestica  centec  dell  dni  facebook  imt  intel  inventec  kvm_x86_64  mellanox  nxp  plexxi  qemu_armv7a  quanta  wiwynn  wnc
builduser@f304bbf507f4:~/onie/machine$ ls dell/ --color=none
dell_s3000_c2338  dell_s4000_c2338  dell_s4048t_c2338  dell_s4810_on_p2020  dell_s6000_s1220  dell_s6010_c2538  dell_s6100_c2538  dell_z9100_c2538

1時間くらいでbuildが終わり、isoイメージやpxe用のイメージができます。

builduser@f304bbf507f4:~/onie/build-config$ make -j4 MACHINEROOT=../machine/dell MACHINE=dell_s6000_s1220 all
(中略)
=== Finished making onie-x86_64-dell_s6000_s1220-r0 master-201607260338 ===
builduser@f304bbf507f4:~/onie/build-config$ ls ../build/images/
dell_s6000_s1220-r0.initrd   onie-recovery-x86_64-dell_s6000_s1220-r0.efi64.pxe  onie-updater-x86_64-dell_s6000_s1220-r0
dell_s6000_s1220-r0.vmlinuz  onie-recovery-x86_64-dell_s6000_s1220-r0.iso

あとはUSBメモリに焼くなりなんなりしてセットアップすればONIEのインストールができるようになります。
ご活用ください。

BIOS
上はDell S6000-ONのBIOS画面です。AMIのBIOSが動いていて、8GBのメモリが乗っていることがわかります。
シリアル経由ですがツチノコブログの読者には見慣れた画面ではないでしょうか。

S6000のBIOS
Boot orderを変更できる画面です。

ネットワークスイッチのBIOS画面が見れて、そこらへんのPCと同じようにOSをインストールしたりできるようになりました。すごい時代ですね。

p.s. このテンプレ展開のせいで、おれのラブコメが鬼畜難易度がすごい