ふり返る暇なんて無いね

日々のメモ書きをつらつらと。メインブログに書くほどでもないことを流してます

MySQLクライアントでパスワードを指定するいくつかの方法

MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.1.2.1 パスワードセキュリティーのためのエンドユーザーガイドライン

ここの通りなんだけど。

コマンドラインで指定

簡単だけど、セキュアじゃないですね。コマンドラインヒストリーに残る場合もあるし。

-pの後にスペースを入れないのがポイント

mysql -u USER -pPASSWORD

プロンプトで入力

一般的な方法ですね。

mysql -u USER -p

設定ファイルから読み取る

~/.my.cnfを作っておくとそこから設定を読み取ってくれます。パスワード情報は他のユーザから読み取られないようにパーミッションを気を付けておくと良いでしょう。 (でも平文のパスワードをファイルで保存するのは良い手ではないです。

cat > ~/.my.cnf <<...
[client]
user=USER
password=PASSWORD
...

chmod 600 .my.cnf

mysql

環境変数から読み取る

この方法はpsコマンドでパスワードが他のユーザから見られてしまう可能性があるので基本的には使ってはいけません。

MYSQL_PWD=PASSWORD mysql -u USER

Ubuntu16.04上のMySQL5.7でChange limitsとか言われる件

MySQLのエラーログを見てるとこんなこと言われるのですが、

2016-06-09T06:53:07.219882Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 5010)
2016-06-09T06:53:07.219948Z 0 [Warning] Changed limits: max_connections: 214 (requested 1000)
2016-06-09T06:53:07.219954Z 0 [Warning] Changed limits: table_open_cache: 400 (requested 2000)

そんなときは、/lib/systemd/system/mysql.serviceserviceセクションにLimitNOFILE=65535を足してあげて、下記の様に再起動してあげると良いです。

systemctl daemon-reload
systemctl restart mysql

しかし、このwarnins、log_timestamps = systemってmy.cnfに入れておいてもUTCでタイムスタンプ出力するんですよね。。。。

Ubuntu16.04のMySQL5.7の設定ファイル

Ubuntu16.04で入るMySQL5.7の設定ファイルがこんな感じになってるんですが、 どういう意図なんでしょうね?

MySQL的には読み込むファイルは/etc/mysql/my.cnfだけど、Ubuntu開発チーム的には/etc/mysql/mysql.cnfがいじって欲しいファイルってことなんですかね?

# ls -l /etc/mysql/my.cnf
lrwxrwxrwx 1 root root 24 Jun  2 16:13 /etc/mysql/my.cnf -> /etc/alternatives/my.cnf
# ls -l /etc/alternatives/my.cnf
lrwxrwxrwx 1 root root 20 Jun  2 16:13 /etc/alternatives/my.cnf -> /etc/mysql/mysql.cnf
# ls -l /etc/mysql/mysql.cnf
-rw-r--r-- 1 root root 682 Apr 20 19:04 /etc/mysql/mysql.cnf

中身的にはこうなってるので、includeディレクトリをいじるのが素直だと思います。

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

意識低めに考える理想の労働環境

頭の中に思い浮かぶものをとりとめもなくメモ

設備回り

  • 広めのデスク
  • 畳スペース
  • 混んでない休憩スペース
  • デスクパーティション
  • 人口密度が低い執務室
  • 空調がちゃんと仕事をしている

勤怠回り

  • できれば裁量労働
  • できなければコアタイムが短いフレックス
    • 定時に全員揃っている必要性をあまり感じない
  • 退勤時間が早い
    • 諸事情で17:30には会社を出たい
  • 規定労働時間は短い方が良い
  • 突発的な休みを許容する
    • 出勤直前に突然私用ができるとか普通にあり得る

雰囲気

  • 技術を大事にする
  • ビジョンがある
  • 人に対する敬意がある

なんか思いついたらあとで追記する

自分のipアドレスを知りたいとき(linux)

最初に結論

hostname -Iを使うと良い

某所で、自ホストのIPアドレスを取得するためにこんなことをしている箇所を見つけたのが発端です。

LANG=C /sbin/ifconfig | grep 'inet addr' | awk '{print $2;}' | cut -d: -f2 | grep -v 127.0.0.1 | tail -n 1

もう少し、簡潔にできないかなー。(そもそもifconfigはもう使わない方が良いし) ip addr show eht0 とかでもデータ加工しないとだめだしな。とか考えてたら、hostnameでできそうだということが分かりました。

似たオプションで、-i-I があるのですが、名前解決ができるかできないかの違いです。用途に合わせて使い分けましょう。

   -i, --ip-address
          Display  the  network  address(es)  of the host name. Note that this works only if the
          host name can be resolved. Avoid using this option;  use  hostname  --all-ip-addresses
          instead.

   -I, --all-ip-addresses
          Display  all  network  addresses  of  the  host. This option enumerates all configured
          addresses on all network  interfaces.  The  loopback  interface  and  IPv6  link-local
          addresses are omitted. Contrary to option -i, this option does not depend on name res‐
          olution. Do not make any assumptions about the order of the output.

sudoersにはワイルドカードが使える

デーモン管理はUpstartでやっていて、Webアプリケーションサーバwebapp-${project_name}、ジョブワーカーはjobworker-${project_nameみたいな感じの名前で定義しています。

serviceコマンドはrootじゃないと実行出来ないのですが、デプロイのときなど、大量のサーバにいちいちパスワード打てないので、特定のユーザにNOPASSWORDで実行出来るようにします。 ただ、何も考えず/etc/sudoersに設定していくとサブコマンド毎に指定していかないといけないのでなかなか辛いです。

app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_1 restart
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_1 reload
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_1 stop
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_1 start
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_2 restart
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_2 reload
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_2 stop
app ALL=(root) NOPASSWD: /usr/bin/service webapp-project_2 start
app ALL=(root) NOPASSWD: /usr/bin/service jobworker-project_1 restart
app ALL=(root) NOPASSWD: /usr/bin/service jobworker-project_1 reload
app ALL=(root) NOPASSWD: /usr/bin/service jobworker-project_1 stop
app ALL=(root) NOPASSWD: /usr/bin/service jobworker-project_1 start

かといって、こうしてしまうと、全てのUpstart管理のデーモンをパスワード無しで操作出来てしまうのでかなり危険です。

app ALL=(root) NOPASSWD: /usr/bin/service

なんかうまい方法無いかなとsudoersのmanpageを引いていたらワイルドカードが使えるらしいので、こうしてみました。 これなら権限を絞りつつ、記述も簡潔になって良い感じです。

app ALL=(root) NOPASSWD: /usr/bin/service webapp-* *
app ALL=(root) NOPASSWD: /usr/bin/service jobworker-* *

※ この記述あくまで一例だからこのまま使ってることを意味しないです。念為

fabricで現在実行中のhostを取りたい

A. env.host を使うと良い。

hostによって配るcrontabが違っていて、レポジトリ的には ${HOSTNAME}.crontab みたいな感じでhost名を含むファイル名で置いてあるときに、どうしたらうまく配れるかなと考えた結果 env.host で実行中のhost名が取れるのでそいつを利用した。

from fabric.api import sudo, env
from fabric.decorators import task

@task
def some_task(project):
    src = "/opt/%s/config/crontab/%s.crontab" % (project, env.host)
    dst = "/etc/cron.d/%s" % project
    sudo("if [ -e $src ];then cp %s %s; fi" % (src, dst))

わざわざワークツリーに移動しなくてもgit操作したい

今まで、ワークツリーにいちいち移動してから、gitの操作してたんですが、 --git-dir で指定してあげればその必要も無いという知見を得ました。

今まではこうしてたのを、

cd /path/to/repos/
git log

こうしてあげることで、ディレクトリの移動が必要無くgitの操作ができます。

git --git-dir=/path/to/repos/.git --work-tree=/path/to/repos/ log

古めのgitは上記の方法じゃないとダメなんですが、1.8.5からは -C オプションが使えるようになってるので、こちらを利用した方が良いです。

git -C /path/to/repos/ log

べんり。