Jaybanuan's Blog

どうせまた調べるハメになることをメモしていくブログ

Operator SDKのインストール

はじめに

Operator SDKのインストール時の作業記録。 インストール方法は以下の3つあるが、ここではGitHubのReleaseからのインストールを実施する。

環境

# cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME="Ubuntu 20.04.1 LTS"

事前準備

動作要件としてdockerとkubectlが必要なので、事前に準備しておく。 ここでは詳細は割愛する。

インストール

Operator SDKのWebサイトで示されているインストール手順通りに進める。

(1) バージョンの指定

インストールするバージョンを変数で指定しておく。

$ RELEASE_VERSION=v1.2.0

(2) コマンドのバイナリのダウンロード

コマンドのバイナリをダウンロードする。 コマンドはシングルバイナリになっている。

$ curl -LO https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu
$ curl -LO https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/ansible-operator-${RELEASE_VERSION}-x86_64-linux-gnu
$ curl -LO https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/helm-operator-${RELEASE_VERSION}-x86_64-linux-gnu

(3) バイナリの検証

まずascファイルをダウンロードする。

$ curl -LO https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu.asc
$ curl -LO https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/ansible-operator-${RELEASE_VERSION}-x86_64-linux-gnu.asc
$ curl -LO https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/helm-operator-${RELEASE_VERSION}-x86_64-linux-gnu.asc

以下のコマンドを実行することで検証できるが、後述の注意がある。

$ gpg --verify operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu.asc
$ gpg --verify ansible-operator-${RELEASE_VERSION}-x86_64-linux-gnu.asc
$ gpg --verify helm-operator-${RELEASE_VERSION}-x86_64-linux-gnu.asc

ここで注意点だが、単に上記のコマンドを実行すると、おそらく以下のように検証が失敗する。

$ gpg --verify operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu.asc
gpg: 署名されたデータが'operator-sdk-v1.2.0-x86_64-linux-gnu'にあると想定します
gpg: 2020年11月11日 08時54分26秒 JSTに施された署名
gpg:                RSA鍵0CF50BEE7E4DF6445E08C0EA9AFDE59E90D2B445を使用
gpg:                発行者"joe.lanford@gmail.com"
gpg: 署名を検査できません: 公開鍵がありません

その場合は、上記の実行結果の「RSA鍵」の後に表示されている文字列(Key ID)で示される公開鍵を取得する必要がある。 今回の場合は、以下のようにコマンドを実行する。

$ gpg --keyserver keyserver.ubuntu.com --recv-key "0CF50BEE7E4DF6445E08C0EA9AFDE59E90D2B445"

そして、最初に示した検証をやり直してみると、警告付きだが一応は成功する。

$ gpg --verify operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu.asc
gpg: 署名されたデータが'operator-sdk-v1.2.0-x86_64-linux-gnu'にあると想定します
gpg: 2020年11月11日 08時54分26秒 JSTに施された署名
gpg:                RSA鍵0CF50BEE7E4DF6445E08C0EA9AFDE59E90D2B445を使用
gpg:                発行者"joe.lanford@gmail.com"
gpg: "Joe Lanford <joe.lanford@gmail.com>"からの正しい署名 [不明の]
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:          この署名が所有者のものかどうかの検証手段がありません。
主鍵フィンガープリント: 0CF5 0BEE 7E4D F644 5E08  C0EA 9AFD E59E 90D2 B445

(4) コマンドの配置

以下のコマンドを実行する。 複雑に見えるが、実行のパーミッションをつけて/usr/local/binにコピーしているだけ。

$ chmod +x operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu && sudo mkdir -p /usr/local/bin/ && sudo cp operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu /usr/local/bin/operator-sdk && rm operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu
$ chmod +x ansible-operator-${RELEASE_VERSION}-x86_64-linux-gnu && sudo mkdir -p /usr/local/bin/ && sudo cp ansible-operator-${RELEASE_VERSION}-x86_64-linux-gnu /usr/local/bin/ansible-operator && rm ansible-operator-${RELEASE_VERSION}-x86_64-linux-gnu
$ chmod +x helm-operator-${RELEASE_VERSION}-x86_64-linux-gnu && sudo mkdir -p /usr/local/bin/ && sudo cp helm-operator-${RELEASE_VERSION}-x86_64-linux-gnu /usr/local/bin/helm-operator && rm helm-operator-${RELEASE_VERSION}-x86_64-linux-gnu

動作確認

各コマンドのバージョンを表示してみる。

$ operator-sdk version
operator-sdk version: "v1.2.0", commit: "215fc50b2d4acc7d92b36828f42d7d1ae212015c", kubernetes version: "v1.18.8", go version: "go1.15.3", GOOS: "linux", GOARCH: "amd64"

$ ansible-operator version
ansible-operator version: "v1.2.0", commit: "215fc50b2d4acc7d92b36828f42d7d1ae212015c", kubernetes version: "v1.18.8", go version: "go1.15.3", GOOS: "linux", GOARCH: "amd64"

$ helm-operator version
helm-operator version: "v1.2.0", commit: "215fc50b2d4acc7d92b36828f42d7d1ae212015c", kubernetes version: "v1.18.8", go version: "go1.15.3", GOOS: "linux", GOARCH: "amd64"

参考

bashのシェルスクリプトでよく使うコードスニペット

はじめに

最近、シェルスクリプトを書くことが多い。 何度も調べるのが面倒なので、メモを残しておく。 自分がよく使うものだけなので、網羅性はない。 理屈どうこうより、コピペですぐ使えるようにしておく。

条件分岐 (構文)

if

if [ 条件 ]; then
    #
fi

if 〜 else

if [ 条件 ]; then
    #
else
    #
fi

if 〜 else if 〜 else

if [ 条件 ]; then
    #
elif [ 条件 ]; then
    #
else
    #
fi

条件分岐 (文字列)

文字列の比較 (等しい)

if [ "$STR" = "foo" ]; then
    #
fi

文字列の比較 (等しくない)

if [ "$STR" != "foo" ]; then
    #
fi

空文字列かどうか

if [ -z "$STR" ]; then
    #
fi

変数の値で示されるパスがファイルかどうか

if [ -f "$VAR" ]; then
    #
fi

変数の値で示されるパスがディレクトリかどうか

if [ -d "$VAR" ]; then
    #
fi

変数が定義されているかどうか

if [ -v VAR ]; then
    #
fi

間接参照する変数が定義されているかどうか

# VAR="hello,world!"
INDIRECT_VAR="VAR"

if [ -z "${!INDIRECT_VAR+undefined}" ]; then
    echo "${INDIRECT_VAR} is undefined:"
else
    echo "${INDIRECT_VAR} is defined: ${!INDIRECT_VAR}"
fi

上掲のコード中の${!INDIRECT_VAR+undefined}+以降の文字は何でもよい。

繰り返し (構文)

値の列挙による繰り返し (ハードコーディングによる)

for VAR in value1 value2 value3; do
   #
done

値の列挙による繰り返し (コマンド実行による)

この例はlsの結果を繰り返し処理している。

for VAR in `ls`; do
   #
done

関数

関数定義

function foo() {
    #
}

関数呼び出し

foo param1 param2

ヒアドキュメント

ヒアドキュメントをコマンドに標準入力として渡す

以下はcatに標準入力として渡して、画面に表示する例。

cat << EOS
foo
EOS

ヒアドキュメントをファイルに出力する

cat << EOS > output.txt
foo
EOS

ヒアドキュメントで変数展開をしない

wordをクォートする。 ここではEOSがwordにあたる。

cat << 'EOS' > output.txt
foo
EOS

変数のデフォルト値(代替値)

ややこしくて、なかなか頭に入らない。。。 結論としては、${VAR:-default}だけ覚えておけば、実用上は事足りそう。

以下のスクリプトを実行してみる。

#!/bin/bash

echo '(VAR is undefined)'
echo '${VAR+default}  = '"${VAR+default}"
echo '${VAR:+default} = '"${VAR:+default}"
echo '${VAR-default}  = '"${VAR-default}"
echo '${VAR:-default} = '"${VAR:-default}"

VAR=""
echo ''
echo 'VAR=""'
echo '${VAR+default}  = '"${VAR+default}"
echo '${VAR:+default} = '"${VAR:+default}"
echo '${VAR-default}  = '"${VAR-default}"
echo '${VAR:-default} = '"${VAR:-default}"

VAR="hello,world!"
echo ''
echo 'VAR="hello,world!"'
echo '${VAR+default}  = '"${VAR+default}"
echo '${VAR:+default} = '"${VAR:+default}"
echo '${VAR-default}  = '"${VAR-default}"
echo '${VAR:-default} = '"${VAR:-default}"

結果は以下のようになる。

(VAR is undefined)
${VAR+default}  = 
${VAR:+default} = 
${VAR-default}  = default
${VAR:-default} = default

VAR=""
${VAR+default}  = default
${VAR:+default} = 
${VAR-default}  = 
${VAR:-default} = default

VAR="hello,world!"
${VAR+default}  = default
${VAR:+default} = default
${VAR-default}  = hello,world!
${VAR:-default} = hello,world!

その他

スクリプトの配置ディレクトリを変数に代入する

BASE_DIR=$(cd $(dirname $0); pwd)

参考

Kubernetes Operatorの調査メモ

Kubernetes Operatorの調査メモだが、さっぱり分かってないので無秩序。 Kubernetes Operatorとその関連技術をひたすら集めた。

Kubernetes Operator

Operator SDK (概要)

Operator SDK (実装)

Kubebuilder

kustomize

環境ごとに異なるマニフェストをOverlayというやり方で生成するツール。

Molecule

Kubernetes OperatorのAnsible SDKで使われているテストフレームワーク

Cloud Init

コンテナの初期化に使えないか要検討。

BASE64 + ROT13のエンコードとデコード

たびたびBASE64 + ROT13のエンコードとデコードを行う必要が出てきたので、メモを残しておく。 エンコードは以下。

$ echo -n "abc" | base64 | tr '[A-Za-z]' '[N-ZA-Mn-za-m]'
bm9w

デコードは以下。

$ echo -n "bm9w" | tr '[A-Za-z]' '[N-ZA-Mn-za-m]' | base64 -d
abc

RHEL 8/CentOS 8のパッケージについての調査メモ

ピリオド(.)を含むファイルは/etc/sudoers.dに配置しても読み込まれない

はじめに

久しぶりにsudoの設定を変更したところ、思いの外ハマったので、忘れないようにメモしておく。

環境

# cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME="Ubuntu 20.04.1 LTS"

やりたかったこと

あるユーザについて、sudoを実行する時にパスワードを入力不要にするために、sudoの設定を変更したかった。

やってみた => 設定が反映されない

まずは以下のコマンドを実行してファイル/etc/sudoers.d/10-nopassword.confを作成した。

# sudo visudo -f /etc/sudoers.d/10-nopassword.conf

このファイルに、例えば以下のような内容を書き込んで、保存する。

jaybanuan    ALL=(ALL:ALL) NOPASSWD:ALL

動作確認のために、対象ユーザでログインして、適当に以下のようなコマンドを打ってみる。

# sudo ls ~/
[sudo] jaybanuan のパスワード: 

設定が反映されておらず、パスワードの入力が求められてしまった。

調べた結果

/etc/sudoers.d/READMEをよく読んでみる。 以下抜粋。

This will cause sudo to read and parse any files in the /etc/sudoers.d directory that do not end in '~' or contain a '.' character.

言葉を補いつつ訳すと以下のようになる。

これ(#includedir)によりsudoは、ディレクト/etc/sudoers.dに配置したファイルのうち、ファイル名の末尾が'~'でないファイル、あるいはファイル名に'.'を含まないファイルを読み込んでパースする。

つまり、自分の作ったファイル10-nopassword.confには拡張子.confでピリオドが含まれていたことが、期待しない動作の原因になっていた。 これは分かりにくい。。。

ファイル名を変えてみた => 成功

ファイル名をピリオドを含まないようにリネーム。

# sudo mv 10-nopassword.conf nopassword

ついでに、プレフィックスの数字も意味がなさそうなので、あわせて削除した。 そして、対象ユーザでログインして、再度動作確認してみる。

# sudo ls ~/
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos

設定が反映されており、パスワードの入力は求められなかった。

何故ハマったか

ファイル名を考える際に、/etc/sudoers.dに既に配置されているファイルがあれば参考にしようと思い、lsを実行してみた。

# ls /etc/sudoers.d/
99-snapd.conf  README

99-snapd.confという名前のファイルがあったので、これを参考に10-nopassword.confとしたのが間違いだった。 そもそも、このファイルは読み込まれていないのか。。。