地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Nginx】ngx_mrubyへ入門

github.com

概要

ngx_mrubyへの入門記事。luaとはjavascriptも組み込めたりするのがその一種っぽいくらいの認識の状態から調べてみました。

ngx_mrubyとは

ngx_mrubyとは弊社ペパボ研究所に所属する松本 亮介(@matsumotory)によって開発されているOSSです。
nginxに組み込むことで、nginxの設定ファイルや、nginxの各イベントにフックしてmrubyを実行し、nginxの動作をプラガブルに扱うことができます。

tech.pepabo.com

nginxでluaを動かしたりすることができますがその系統でmrubyを動かすものって考えで良さそうです。ngx_mrubyで動かすことでウェブサーバがそのままアプリケーションサーバとして振舞うこともできるらしい。イベント駆動はNginxでこの辺どこまでやるかは考えるのが難しそう。

mrubyとは

そもそものmrubyとはなんなのかも調べたのでメモ

mrubyとはISOを元に実装されたRuby1.9互換のシンタックスを持つ組み込み向けの軽量言語。言語の最大の特徴は軽量言語ゆえの省メモリな設計で mruby本体には必要最低限の機能しか実装されておらず、例えばファイルの読み書きやHTTPのリクエストなどはサポートされていらしいです。

専門の書籍も出てるらしいです。時間ある時買ってみようと思います。

Webで使えるmrubyシステムプログラミング入門 | 近藤宇智朗 | 工学 | Kindleストア | Amazon

そもそもrubyとの違いも怪しいので参考に以下を読んでおく

blog.masuidrive.jp

触ってみる

docker-composeでラップした環境を以下へ用意。

github.com

http://localhost:8080/mruby-test

とかやればrubyのコードを実行できるようになっている。

ざっくりツリー構成は以下

tree
.
├── Dockerfile
├── LICENSE
├── README.md
├── docker
│   ├── conf
│   │   └── nginx.conf
│   └── hook
│       └── test.rb
└── docker-compose.yml

test.rbへmrubyのコードを書くことで実行することができる。

以下はランダムに返す内容を出力するmrubyのコードNginx.echo で出力している。

backends = [
  "dog",
  "cat",
  nil,
]

Nginx.echo backends[rand(backends.length)]

ヒアドキュメントも書ける

body = <<DATA

# Section
## aaa

- hoge
- foo

## bbb

__code__

    a = 1
    b = a + 1

DATA

Nginx.echo body

事例とか面白かったやつ

speakerdeck.com

動的に証明書を使用する仕組みとか面白かった

speakerdeck.com

1000行超えたapacheの設定とかもうまく使えば短縮できたのかなと感じた。

参考リンク

【OpenStack】入門する

f:id:ryuichi1208:20210711090758p:plain

背景

仕事で使う機会が出てきたのでそもそもなんなのかから調べていく。聞いたことはあるけど実際それぞれなにしてるのかはよくわかっていない。構築とはまでは別でやるとしてそもそもの用語整理とコンポーネントについて理解するのが目標。

目次

概要

OpenStackとは

OpenStack は、クラウドコンピューティングのためのオープンソース・フリーソフトウェアであり、クラウドの分類のIaaSサービスとして仮想マシンやその他のリソースを提供する[2]。 OpenStackは、データセンター全体の処理、ストレージ、およびネットワークリソースのマルチベンダーハードウェアプールを制御するコンポーネントで構成されている。 そして、Webベースのダッシュボード、コマンドラインツール、または Webサービスを通じて操作する。

参考: OpenStack - Wikipedia

OpenStack は、プールされた仮想リソースを使用してプライベートクラウドおよびパブリッククラウドを構築および管理するプラットフォームというのがわかった。仮想化管理プラットフォームとかと似た印象があるが全く同じものではないらしい。

www.redhat.com

2010年にリリースされて以降今も開発は続いている。OpenStackが提供するのは仮想サーバーやストレージ、ネットワークなどを制御するための機能であり、これを利用することで独自のクラウド環境を構築することが可能となる。

用語集抜粋

ATA over Ethernet (AoE)

Ethernet 内をトンネルされるディスクストレージプロトコル

テナント

ユーザーのグループ。Compute リソースへのアクセスを分離するために使用される。プロジェクトの別名。

テナント API

プロジェクトにアクセス可能な API

テナントエンドポイント

1 つ以上のプロジェクトと関連付けられた Identity サービス API エンドポイント。

テナント ID

project ID の別名。

コンポーネント

コンピュート (Nova)

直訳は「新星」。Novaは仮想サーバーの作成と管理を司るサービス

などを担当する。Novaの主要コンポーネントは以下

• API Server ( nova-api )
  – 外部にAPIを提供

• Message Queue ( rabbit-mq server )
  – 各コンポーネントへの通信をキューイング

• Compute Workers ( nova-compute )
  – インスタンスの管理

• Network Controller ( nova-network )
  – ネットワークの管理

• Volume Worker ( nova-volume )
  – ボリュームの管理

• Scheduler ( nova-scheduler )
  – API呼び出しのコンポーネントへの割り当て

ネットワーキング (Neutron)

ルータやネットワークインタフェースなど、ネットワーク全般を処理するためのサービス

Linux名前空間機能を利用し、プロジェクト毎に独立したネットワークサービスを提供する。

Linuxのdnsmasq機能を利用し、仮想DHCPサーバ機能を提供する。

Linuxlinux-brdige機能(あるいはOpen vSwitch)を利用し、受け取ったパケットのVLANIDから対応する仮想ルータ(プロジェクトネットワーク)にパケットをL2転送する。

Linuxのパケットフォワーディング機能とパケットフィルタリング機能(iptables)を利用し、仮想ルータ機能を提供する。

eutronが提供するネットワーク機能は、非常に高度なものを目指しており、テナント分割や、GREやVXLANなどのL3トンネリングをサポート、LBaaS(Load Balancer as a Service)、VPNaaS(VPN as a Service)、FWaaS(Fire Wall as a Service)、分散ルーティング機能などの実装を行っている。

www.atmarkit.co.jp

ブロックストレージ (Cinder)

仮想マシンに仮想外部ストレージを管理するサービスボリュームの作成/削除、テナントごとのquotaの設定、スナップショットの作成/削除などの機能を持つ

主要コンポーネント

* cinder-api
API リクエストを受け付け、それらを処理するために cinder-volume に中継します。

* cinder-volume
cinder-scheduler などの Block Storage サービスやプロセスと直接やり取りを行います。また、メッセージキュー経由でもこれらのプロセスと連携します。 cinder-volume サービスは、Block Storage サービスへ送られた読み出し、書き込みリクエストに応答し、状態を管理します。ドライバーアーキテクチャーになっており、様々なストレージプロバイダーと連携できます。

* cinder-scheduler デーモン
ボリュームを作成するのに適切なストレージプロバイダーノードを選択します。 nova-scheduler と同様のコンポーネントです。

* cinder-backup デーモン
cinder-backup サービスは、あらゆる種類のボリュームのバックアップをバックアップストレージプロバイダーに提供します。 cinder-volume サービスのように、ドライバーアーキテクチャーになっており、さまざまな種類のストレージプロバイダーを利用できます。

* メッセージングキュー
Block Storage プロセス間で情報を転送します。

docs.openstack.org

アイデンティティサービス (Keystone)

直訳は「要石(かなめいし)」。OpenStackの認証とエンドポイントの管理をつかさどるサービス

認証トークンはmemcached上で管理する。

Keystoneのインストール直後ではユーザが登録されていないため、admin_tokenと呼ばれるkeystone.confに定義された特別なトークンを利用して管理者ユーザーをまず作成する。

環境変数

CLIから操作する上で必要となる環境変数は以下。テナントとか認証情報とかを設定しておくことでopenstackコマンドから色々呼び出すことが可能となる。

export OS_PROJECT_DOMAIN_ID = default 
export OS_USER_DOMAIN_ID = default 
export OS_PROJECT_NAME = admin 
export OS_TENANT_NAME = admin 
export OS_USERNAME = admin 
export OS_PASSWORD = password 
export OS_AUTH_URL = http://controller:35357/v3

使いそうなコマンド

#プロジェクト一覧
keystone tenant-list
openstack project list

#プロジェクト詳細
keystone tenant-get <tenant>
openstack project show <project>

#プロジェクト作成
keystone tenant-create --name <tenant_name>
openstack project create <project_name>

#プロジェクト削除
keystone tenant-delete <tenant>
openstack project delete <project>

#プロジェクト情報更新
keystone tenant-update <tenant>
openstack project set <project>


#ユーザ一覧
keystone user-list
openstack user list

#指定プロジェクトのユーザ一覧
keystone user-list --tenant-id=<tenant_id>
openstack user list --project <project>

#ユーザ詳細
keystone user-get <user>
openstack user show <user>

#ユーザ作成
keystone user-create --name <user_name>
openstack user create <user_name>

#ユーザ削除
keystone user-delete <user>
openstack user delete <user>

#ユーザ情報更新
keystone user-update <user>
openstack user set <user>

#ユーザ(一般ユーザ)のパスワード変更
keystone user-password-update --pass <password> <user>
openstack user set --password <password> <user>


#ロール一覧
keystone role-list
openstack role list

#ロール詳細
keystone role-get <role>
openstack role show <role>

#ロール作成
keystone role-create --name <role_name>
openstack role create <role_name>

#ロール削除
keystone role-delete <role>
openstack role delete <role>


#ユーザのロール一覧
keystone user-role-list
openstack user role list

#ユーザにロールを与える
keystone user-role-add --user <user> --role <role>
openstack role add --user <user> <role>

#ユーザに与えられたロールを取り除く
keystone user-role-remove --user <user> --role <role>
openstack role remove --user <user> <role>

イメージサービス (Glance)

直訳は「見る」。NOVAによって作られる仮想マシンの基となるイメージを扱うサービス

glance-apiとglance-registryのプロセス間はAMQPを利用せずにREST-APIで連携している。

オブジェクトストレージ (Swift)

直訳は「迅速」。バックアップなど、各種オブジェクトを格納するストレージとして利用できるサービス

Swiftでは"アカウント情報"と"コンテナ(ディレクトリ)情報"と"オブジェクト(ファイル)"の3種類のファイルを管理する。これらへのアクセスはSwiftのプロキシサーバーを経由する必要があり、プロキシサーバーでは認証や負荷分散が行われる。

コンテナにオブジェクトをアップロードするとコンテナとオブジェクトは自動でレプリカが作成され、各ストレージノードに冗長保管される。冗長保管のため耐障害性が高い。デフォルトでは3つのゾーンに冗長化される。

主要コンポーネント
* swift-proxy-server
SwiftのREST-APIを提供するプロセス。

* swift-account-server
アカウント管理のREST-APIを提供し、実際に操作するプロセス。

* swift-container-server
コンテナ情報管理のREST-APIを提供し、実際に操作するプロセス。

* swift-object-server
オブジェクト管理のREST-APIを提供し、実際に操作するプロセス。

ダッシュボード (Horizon)

直訳は「地平線」。OpenStackのWeb管理コンソールで、WebブラウザからOpenStackを管理・操作する機能を提供します。VMインスタンスやネットワーク、リソース使用状況等が確認できる。

主要コンポーネント

* ironic-conductor
IPMI経由でのベアメタルノードの電源投入やiSCSI経由でのベアメタルノードへのイメージ転送を行うプロセス。

* ironic-python-agent
ブートローダのインストールやOSイメージのインストール等を行うためのREST-APIを提供するプロセス。

コマンドUsage

#サブコマンド一覧
openstack help <command>

#サブコマンドパラメータ一覧
openstack help <command> <subcommand>

#デバッグオプション。デバッグログを出力しながら実行
openstack --debug <command> <subcommand>

詳しいまとめは以下にあった

docs.openstack.org

感想

とりあえず概要だけでも知れたので良かった。

【puppet】入門する

背景/概要

puppetを使う機会が出てきたので調べたことのメモを記載。commitログとかみてると結構頻繁に今でも更新されていてちょっとびっくりした。

以下に全てがまとまっている。

www.slideshare.net

puppetとは/特徴とか

github.com

puppetとは構成管理ツールの一つ。Ansibleとかと競合するツール。「クライアント/サーバ構成」でサーバ構成を集中管理できる設定管理ツールで各ノードにはエージェントが必要。Ruby型のDSLが使える。

f:id:ryuichi1208:20210708224246p:plain

ドキュメントとかは以下

www.puppetcookbook.com

ターゲットシステム (またはノード) 上で実行される Puppet デーモンは、Puppet エージェントと呼ばれる。エージェントは構成の更新がないかどうかマスターをポーリングする。この辺がAnsible使っていると理解しづらい点かなと思う。

Ansibleとの比較

一番気になるのがやはりpull型という点。plus/consあると思うけど実際使ってから感じていく。

tool Push/Pull 開発元 実装言語
Ansible Push RedHat Python
Puppet Pull Puppet Labs Ruby

環境構築

master/agetnそれぞれの手順

master

$ yum -y install https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm
$ sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/puppetlabs.repo
$ yum --enablerepo=puppetlabs-products,puppetlabs-deps -y install puppet-server

agent

$ yum -y install https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm
$ sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/puppetlabs.repo
$ yum --enablerepo=puppetlabs-products,puppetlabs-deps -y install puppet
$ puppet agent --test --ca_server=192.168.1.15
$ systemctl start puppet

ハンズオン?

hello worldする

master1台あればできるhello world。noticeはdebug message的な使い方をするらしいので必須。

[root@master manifests]# cat hello.pp
notice("Hello, World!")

[root@master manifests]# puppet apply hello.pp
Notice: Scope(Class[main]): Hello, World!
Notice: Compiled catalog for master in environment production in 0.12 seconds
Notice: Finished catalog run in 0.01 seconds

グループ/ユーザ追加

group { "developer" :
  ensure => "present",
  gid    => "1101",
}

user { "developer01" :
  ensure     => "present",
  uid        => "1101",
  gid        => "developer",
  home       => "/home/developer01",
  managehome => "true",
  shell      => "/bin/bash",
  password   => '$6$aqc3cun1$QpzeHomBlMEcKmCOkeDa9VItfbzi4R.NTyLm7r7ak6Mc9oxtQSzBlfgFtvQcvBNkr/OEZMXXu6XegP1g/p67O1',
  expiry     => "2016-12-31",
}

nodeを指定してパッケージを追加

node 'slave' {
  package {['ypbind.x86_64']:
    ensure => 'present',
  }
}

即時反映させたい

puppet-agentを再起動させれば即読み込む。

puppetで使える関数を知りたい

facterで見れる。

推奨ディレクトリで進める

Puppetのmoduleのmanifestsのマニフェスト構成の基本ディレクトリなるものがあるらしいのでそちらを試す。

[root@master puppet]# tree -L 1
.
├── auth.conf
├── environments
├── fileserver.conf
├── manifests // modues配下を読み行く
├── modules // ここに実際に行いたい操作を書いたファイルを置く
└── puppet.conf

3 directories, 3 files

またモジュール内には以下のファイルが置かれるのがデファクトらしい。

  • params.pp -> そのmodule内で使われる変数、default値の定義
  • init.pp -> 同一モジュール内のその他classの適用順序関係を記載
  • user.pp -> このmoduleでインストールするソフトウェアが必要とするアカウント情報(userやgroup)の定義
  • install.pp -> moduleに必要なパッケージインストールのためのResourceの定義
  • config.pp -> ソフトウェアのセットアップに必要となる設定ファイルの配備、ディレクトリの作成等のためのResourceの定義
  • service.pp -> Moduleの含むデーモン(apache, mysql-server等)のservice Resourceの定義

以下のディレクトリ構成でモジュールを作成してみる

$ tree modules/
modules/
└── useradd
    └── manifests
        └── init.pp

モジュール配下を呼び出すには以下のような記述をmanifest配下にファイルに対して行う。

node 'slave' {
  package {['ypbind.x86_64']:
    ensure => 'present',
  }
  class {'useradd':
  }
}

init.ppから他classを呼び出すことも可能だが単体で呼び出すことも可能。node指定とかで複雑になるくらいならこっちで読みやすくしても良さそうだろうか?(運用したことないので不明)

cat params.pp
class useradd::params (
  $uid = '50',
) {
    group { "developer3" :
      ensure => "present",
      gid    => "1103",
    }
}

「Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera defaults」

$ ln -s /etc/hiera.yaml /etc/puppet/hiera.yaml

デフォルト値が設定されたyamlを読み込めていない場合に出る文言らしい。CentOS6とかではデフォルトで入っていたが7だとなくて出る。

puppet hieraとは何か · GitHub

contain

Containment | Puppet

include

DSLに触れる

マニフェスト内では、変数の利用が可能で変数名は「$」で始まる文字列で指定する

# httpdパッケージをインストール
package { “httpd”:
provider => “yum”,
ensure => “installed”
}

# httpdサービスを起動する
service { “httpd”:
name => “httpd”,
ensure => running,
require => Package[“httpd”]
}

# /var/www/testディレクトリを作成する
file { “/var/www/test”:
ensure => directory,
owner => “root”,
group => “root”,
require => Package[“httpd”]
}

# httpd用の設定ファイルを作成する
file { “/etc/httpd/conf.d/mysite.conf” :
content => ”
NameVirtualHost *:8000
<VirtualHost *:8000>
ServerName $hostname
DocumentRoot /var/www/test
ErrorLog logs/test-error_log
CustomLog logs/test-access_log common
</VirtualHost>”,
mode => “0644”,
owner => “root”,
group => “root”,
subscribe => Service[“httpd”]
}

使えそうなコマンド

# 適用させる
$ puppet apply /etc/puppet/manifests/site.pp

# モジュールをインストールする
$ puppet module install puppetlabs/mysql

Hieraとは

Hieraはkey/value型(yaml, json)の設定データ検索ツール。 ノードごとの設定値をHieraに記述することで、マニフェストからノード固有設定を分離する。

puppet hieraとは何か · GitHub

まとめ/感想

参考

作業手順書はもういらない! Puppetにおける自動化の定義書「マニフェスト」の書き方と基礎文法まとめ:新人インフラ技術者のためのサーバー構築/運用自動化入門(4)(1/5 ページ) - @IT

【CLI】envchain入門

github.com

envchainとは

秘匿情報を[環境変数]に入れるのを、多少安全にしてくれるツールでC言語で実装されている。

インストール方法

$ git clone https://github.com/sorah/envchain.git
$ cd envchain
$ yum install   readline-devel libsecret-devel

$ make
cc -c -Wall -Wextra -ansi -pedantic -std=c99 `pkg-config --cflags libsecret-1`  -o envchain_linux.o envchain_linux.c
cc  -o envchain envchain.o envchain_linux.o -lreadline `pkg-config --libs libsecret-1`
$ make install
install -d /usr/./bin
install -m755 ./envchain /usr/./bin/envchain

Usage

./envchain version 1.0.1

Usage:
  Add variables
    ./envchain (--set|-s) [--[no-]require-passphrase|-p|-P] [--noecho|-n] NAMESPACE ENV [ENV ..]
  Execute with variables
    ./envchain NAMESPACE CMD [ARG ...]
  List namespaces
    ./envchain --list

Options:
  --set (-s):
    Add keychain item of environment variable +ENV+ for namespace +NAMESPACE+.

  --noecho (-n):
    Enable noecho mode when prompting values. Requires stdin to be a terminal.

  --require-passphrase (-p), --no-require-passphrase (-P):
    Replace the item's ACL list to require passphrase (or not).
    Leave as is when both options are omitted.

使ってみる

setで環境を指定して入れたい変数を引数に入れることで変数をセットすることができる。その後はenvchainの引数としてセットした環境とコマンドを実行することでその変数がセットされた状態でコマンドを実行することが可能となる。

$ envchain --set aws AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY
aws.AWS_ACCESS_KEY_ID: aaaa
envchain: secret_password_store_sync failed with 0: Cannot autolaunch D-Bus without X11 $DISPLAY
aws.AWS_SECRET_ACCESS_KEY: bbbb

仕組みは結構シンプルで機密情報を含む環境変数macOSのKeychainに保存し、コマンドを実行するときにそれを復号してくれるみたいな仕組み。実行箇所でsetenvを読んでexecvpでコマンドを実行する。

static void
envchain_exec_value_callback(const char* key, const char* value, void *context)
{
  (void)context; /* silence warning */

  setenv(key, value, 1);
}