Furyu
[フリュー公式]

Tech Blog

フリュー株式会社の技術ブログです

2019年04月22日

awata

systemd-tmpfiles-setup.service が LDAP を使用できなくて /var/run/mysqld が作成されなかった

こんにちは。
ピクトリンク事業部開発部インフラ課の粟田です。

CentOS7で表題の件に引掛ってmysqlが自動起動できない問題にあたったので解決方法のメモを記述します。

問題

まぁ、表題の通りなんですが、OSを再起動しても /var/run/mysqld ディレクトリが作成されていないので、mysql が /var/run/mysqld/mysqld.pid ファイル作成エラーで起動できませんでした。

暫定として、

していたのを根本的に修正したいな、と調査しました。

調査

ここでWebサイトを調査してみると、

systemdでサービスを動かす際、/var/runにディレクトリを作った時の落とし穴と対策

お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ

の様な記事が見つかったので対応できそうかなと進めてみました。

検証

/etc/tmpfiles.d にファイルを作成するとディレクトリが作れる、という事だったので作成して再起動を実施してみました。

再起動してから

できてないじゃないですか……

/etc/tmpfiles.d のファイルを参照するプロセスを確認してみると、 systemd-tmpfiles ってのが見つかりました。

引数見て実行してみると、

できてる……

systemd-tmpfiles がどこから呼ばれているのかを調べてみると、/usr/lib/systemd/system/systemd-tmpfiles-setup.service を見つけました。

早速ステータスを確認してみます。

エラーですやん。

さらに、このプログラムを調べてみると、/usr/lib/tmpfiles.d を参照する様なので見てみる。

あれ、既にある……

エラーを調査するべく sudo journalctl -u systemd-tmpfiles-setup.service を実行。

mysql ユーザが LDAP に定義されていて、ネットワーク起動前に systemd-tmpfiles-setup が実行されるから起動できないんだろうと推測しました。

そこで、mysql ユーザでないユーザで /var/run/mysqld を作ってみます。

再起動してから

ちゃんとできてる!

ここまでで根本解決として以下のものを想定しました。

  1. /var/run/mysql を root で作って起動時に mysql に uid/gid を設定する
  2. mysql 起動直前に /usr/bin/systemd-tmpfiles –create を実行する
  3. pid ファイルの出力位置を変更する
  4. ホストのローカルに LDAP に定義してるuid/gid で mysql ユーザを作成してしまう

実際には1、2、3どの方法でも解決するのは確認しました。
4は未検証です。
LDAP 認証できない様にサーバ起動してユーザ作成するのとかが面倒だったので……

解決

先に提案した中で、1番を選択する事にしました。
理由として、

  • 2番を選択したら systemctl status systemd-tmpfiles-setup で常にエラーになってるのがなんかイヤ
    • プロセス起動のたびに create 呼ばれるのは chown 呼ぶより気色悪いし
  • 3番は /etc/my.cnf を変更したのに pid ファイルの出力先が変らない、と大騒ぎする人がいたのでいじりたくないな
  • どうせどれを選択しても /usr/lib/systemd/system/mysqld.service は編集しないといけないし(4は除く)

を思うと他の人に手順を説明しやすいのは1番かな、と。

これで mysql が自動起動できる様になりました。

あとがき

systemd-tmpfiles-setup と LDAP 相性よろしくないのかも……
他にも記事をいくつか見つけたし。


2018年12月25日

Rancher完全に理解した

こんにちはこんばんは、フリューのジョンです。
この記事はフリューAdvent Calendar 2018の12/24分となります。(ちなみに弊社はお休みです)

Dockerやってたりすると、オーケストレーションをしたくなりますよね。
そこでよく使われるのがKuberneteであったりするのですが、やっぱり構成が大変だったり、取っ掛かりが難しいとかあるような気がしています。
それでよく使われるのが、GoogleやAWSのKubernete、GKEやKESなどのサービスが多いのかなと思います。

ただ、もしそういうのが使えない。。。という方、Rancherはどうですか?と思っています。

Rancherとは

GUIでポチポチっとdocker imageのオーケストレーション構成を簡単に組み立てられるありがたいツールになります。
内部でのLoadBarancerなどの配置、アプリケーションのスケーリングが簡単にできるのは良い点かなと思います。

最近Rancher2系がリリースされており、DockerHubでは rancher/rancher となっています。rancher/serverでは1系がダウンロードできます。

Rancherの起動はDocker(Docker Compose)を使います。docker-compose.ymlは以下のようになります

無事に立ち上がりましたら、https://(host名):8443 にアクセスしてみてください。ログイン画面が出ると思います。デフォルトはadmin/adminです。

スクリーンショット 2018-12-21 14.59.57

スクリーンショット 2018-12-21 14.57.48

今回触る上で試しに、構成としては下の図のような構成を作成しようと思います。

スクリーンショット 2018-12-21 11.06.59

Rancherをつかってみる

ポチポチやっていきましょう。まず、clusterを作ります。名前は「kotlin-sample-cluster」です。コマンドが表示されていますのでそれをコピーしておいてください。

スクリーンショット 2018-12-21 15.05.37

スクリーンショット 2018-12-21 15.06.50
次にアプリケーションを起動するサーバを登録します。先程のコマンドをサーバ上で叩いてください。

sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.1.4 --server https://${①}:8443 --token ${②} --ca-checksum ${③} --worker

するとNodesのタブの画面で以下のようにサーバが登録が開始されているのを確認できるはずです。暫く待つと登録完了となるはずです

スクリーンショット 2018-12-21 15.23.46

スクリーンショット 2018-12-21 15.36.45

では実際にアプリケーションを配置します。
まずkotlin-sample-httpd(Apache)

スクリーンショット 2018-12-21 16.05.15

kotlin-sample-tomcat(tomcat)

スクリーンショット 2018-12-21 16.07.04

LB(LoadBalancer)

スクリーンショット 2018-12-21 17.01.08

kotlin-sample-httpd、kotlin-sample-tomcatは私が作成したアプリケーションをimageにしたものになります。

LBでkotlin-sample-httpdへ向けているので、しばらくしてから、http:(ホスト名)/hello にアクセスしてみてください。
hello, world!! という形で表示できていれば、Rancher完全理解したという状態になっているはず、、、です。

まとめ

Docker Imageをクラスタリングできました。ただし、プロキシ環境では難しくなってくるかもしれません。
皆様、困ったときにRancherを思い出してもらえればと思います!


2018年12月18日

Kayo

Ansibleで連番の複数ホストを指定できなかったのでその原因と対策

みなさん、こんにちは。ピクトリンク事業部インフラ課の藤本佳世です。

フリュー Advent Calendar 2018の12/18分の記事になります。

 

先日、SSL証明書の更新をAnsibleで実施しようとコードを書いていた時にはまった

「Ansibleで連番の複数ホストを指定できなかった件」について、シェアしたいと思います。

みなさんも、「これで動きそうなんだけど、なぜ動かない!!」と思ったことあるかと思います。

今回、私もそんな状況になってしまいました。

※Ansibleについては、以前ブログを書いているのでこちらをご覧ください。

やりたかったこと

今回やりたかった作業はSSL証明書の更新です。この作業をAnsibleで実施しようと考えました。

サーバ ドメイン
test-web-01~05 hoge.com
test-web-06~10 fuga.com

SSL証明書の場所は下記の通りです。

Webサーバ証明書ファイル /usr/local/ssl/server.crt
Webサーバの秘密鍵ファイル /usr/local/ssl/private.key
中間CA証明書ファイル /usr/local/ssl/server_ca.crt

ここで注意ポイントがあります。
test-web-01~test-web-05はドメインhoge.comの証明書
test-web-06~test-web-10まではドメインfuga.com証明書
のように、サーバによって証明書が異なることです。

実際のAnsibleコード

role配下のmain.ymlはこんな感じで書きました。

playbook.ymlはこんな感じです。

サーバによって証明書が異なるので、when句を使って
test-web-01~test-web-05はhoge_com
test-web-06~test-web-10はfuga_com
のように指定したつもりでしたが、うまくいきませんでした。

ex) test-web-05, test-web-10に対して実行した結果

エラー出力されませんが、すべてskippingされた状態になりました。

対処法

下記のようにplaybook.ymlを修正しました。

inventroy_hostname(ホスト名)の数字の部分だけを取り出し、「5以下」、「6以上」と識別するようにしました。
公式ドキュメントにも書いている通り、CentOSのバージョンによって処理を分けることもできます。

Tip: Sometimes you’ll get back a variable that’s a string and you’ll want to do a math operation comparison on it.

このTipsは今後も使えそうです!

だめだった方法

記述方法をいろいろ替えてやってみましたが、うまくいかず。。。

こちらの記事を参考にしてみましたが、うまいかず。。。

うまくいかなかった問題に関しては、また時間がある時に調べてみたいと思います。

最後に

2018年度の私の投稿はこの記事で最後になります。

2018年は大変お世話になり、ありがとうございました。来年もどんどんブログを書くつもりなので、

今後ともどうぞよろしくお願い致します。

 

みなさまにとって2018年は素敵な年となりましたでしょうか?
願わくは、2019年も素敵な年となりますように★


2018年12月12日

Hashimoto Naoto

ESXiサーバ上で動作しているゲストサーバの詳細情報一覧を取得したい

ピクトリンク事業部開発部インフラ課の「メガネとマスクを同時着用すると耳が痛くなる系エンジニア」の橋本です。この上さらにヘッドホンとか装備しようものなら、耳が爆発します。

 

本記事は フリューAdvent Calendar 2018 の12/12分です。

 

前回の記事で、ESXiサーバにパスワードなしで簡単にSSH接続できる環境を整えました。

今回はそれを活かしつつ、ESXi仮想環境をより便利にしていきます。

やりかた

  1. いい感じに必要情報を取得するスクリプトを作成する
  2. SSH越しにスクリプトを実行する

いい感じに必要情報を取得するスクリプトを作成する

ESXiホストサーバでは、「そのホスト上で動作しているゲストサーバの概要を取得するコマンド」が用意されています。

しかし、これで取得できる情報は、登録されているゲストサーバ名とvmイメージのpath, イメージのバージョン情報くらいのもの。かなり限定的です。

 

個人的見解ですが、少なくともホストサーバの稼働状態(起動中・サスペンド中・停止中)は知りたい。
できれば、いつから稼働しているかとかの情報もわかると嬉しい。

 

そういう詳細情報まで取得したい場合、ESXiに用意されているget.summaryコマンドを使います。

これを叩くと、ずらずらっとjsonモドキの形式で情報が取れます。

出力結果は長いので省略しますが、割り当ててあるCPUのコア数であるとか、いろいろな情報が出ます。

 

ですが、ここで問題となるのが「対象となるVMのID」を指定しなければならない、というところ。

 

ホストの情報は1ホスト分ずつしか取得できず、しかもそのためにはVMのIDが必要なのです。(VMID自体は上記のgetallvmsで取得できる情報です)

 

なので、これらをいい感じに組み合わせるスクリプトを用意しました。

シェバンが #! /bin/sh となっていますが、ESXiサーバで使えるのは /bin/bash ではなく/bin/sh です。
bashとは一部記法が違ったり、たとえば配列みたいな構造体が使えなかったりします。

実行権限付与をお忘れなきよう。

 

実行してみると、こんな感じの結果が帰ってきます。

スクリプト21行目のgrep以降、

この部分で取得する情報を絞っているので、たとえば「IPアドレス情報も取得したい!」という場合には

といった具合に、取得したい項目を追加してやれば良い感じになります。

SSH越しにスクリプトを実行する

esx構成

こんな感じに複数のESXiサーバから単一のストレージサーバ(仮にhoge_fuga_maxheartとします)をマウントし、そこにスクリプトを置いてやれば、どのサーバからも先ほどのスクリプトが叩けるようになります。

ssh越しに複数サーバのスクリプトを叩くには、接続用の鍵ファイルを置いてある環境で下記のようにします。

前回の記事でパスワードなしにSSH接続する環境が整っていれば、一発で全てのホストサーバの状態を取得できます。情報を取ってくるだけなら、このコマンドを都度叩くだけで解決です。

あとはイイカンジのGUIのガワを作って、URLにアクセスがあるたびに情報を取ってきてやれば、見た目にも優しい状態確認画面の完成です。

esx_kanseizu


2018年12月4日

Hashimoto Naoto

ESXiサーバにパスワードなしでSSH接続したい

ピクトリンク事業部開発部インフラ課の「部署名が変わったのに未だ慣れず、前世の記憶に苛まれている系エンジニア」の橋本です。こんにちは。今年がもう終わるとか信じたくないです。

本記事は フリューAdvent Calendar 2018 の12/4分です。

 

さて本題。

ESXiはVMware社 が提供する、仮想環境を構築する上で便利に使える強力なハイパーバイザです。
無料で使えるライセンスもあるので、利用されている方も多いのではないでしょうか。

 

バージョン5以前はvSphereClientの導入が必要でしたが、バージョン6以降からは割り当てたIPアドレスにブラウザからアクセスするだけでGUIによる視覚的な操作も可能です。これまでに比べるとべんりでつよいです。

 

しかし、何か作業をする際にその都度IDとパスワードによる認証を行うのは、正直面倒です。

面倒はないほうが幸せです。孫子曰く「兵は拙速を尊ぶ」とも言います。書いてる私は兵ではないですし、兵の人がこの記事を読んでいる率は低い気もしますが、簡潔なのは良いことです。(この一文が冗長であるという厳然たる事実は全力で見逃してください)

 

また、コマンドライン操作であれば自動化もしやすいです。

そのため、楽ちんにSSH接続できる環境にしましょう! というのが今回のお題です。

やりかた

  1. SSH接続を許可する
  2. 接続するユーザを作成する
  3. ユーザに権限を付与する
  4. 鍵ファイルを配置する
  5. ssh/config に接続設定を書く

SSH接続を許可する

ESXiサーバのデフォルト設定では、SSH接続を拒否するようになっています。
GUIにID, パスワードでログインしてから[アクション] → [サービス] → [SSHの有効化] を選択しましょう。

接続するユーザを作成する

[ホスト] → [管理] から [セキュリティとユーザ] タブを選択し、[ユーザーの追加]から設定してください。
英数字大文字小文字を含む、それなりに強いパスワード設定が求められます。

ユーザに権限を付与する

[アクション] → [権限]から、先ほど作成したユーザに対して権限を設定します。

そのユーザで行いたいことによって、適切な権限を設定します。

 

ゲストサーバの状態を確認する用途であれば「読み取り専用」で十分ですし、ホストの起動/停止まで自動化したいという欲求があるならば「システム管理者」といった具合にです。
「システム管理者」はなんでもできるので、迷ったらコレにしておけば、なんて気もするかもしれませんが、システムを壊さないためにも不要な権限付与は控えるほうが無難です。

もしユーザを乗っ取られたときにえらい目に遭いたくもないですし。

鍵ファイルを配置する

以降はコマンドラインでの操作です。

鍵の生成

接続するユーザ用の鍵ファイルを作成します。

ssh接続用の公開鍵をすでにお持ちの場合、鍵の作成はスキップして大丈夫です。
パスワードなしで接続したいので、パスフレーズは空のままにしておきます。github等で秘密鍵を公開してしまってはダメですよ。

鍵の配置

接続するESXi、接続したいユーザ名に置き換えて実行してください。rootのパスワード入力を求められます。
公開鍵(id_rsa.pub)はauthorized_keysという名前で置かなければなりません。

 

具体例として、先ほど作成して権限を付与したユーザがhogeというユーザだった場合は、

/etc/ssh/keys-hoge/authorized_keys

という形にしてやる必要があります。

.ssh/config に接続設定を書く

ここまでで完了でも良いのですが、より簡略化を進めるために ~/.ssh/config に以下の設定を追記しましょう。

たとえば、esx-hoge-01, esx-hoge-02, esx-hoge-03… というESXiサーバにhogeユーザで便利に接続したいのであれば、以下のようにまとめてやることも可能です。

こうしておくと、

としてやるだけでパスフレーズなしでSSH接続することが可能です。楽ちんになりました。

 

楽ができるって幸せですね! 手を抜くためには全力を尽くしましょうね。

余談

ESXiサーバを再起動すると鍵が消えるという悲しい問題もあるのですが、そちらはまた別の記事をご覧ください。