2016年5月29日日曜日

tmpwatchは一時ファイル削除以外にも使える!?

tmpwatchコマンドは指定した時間アクセスの無いファイルや
ディレクトリを削除するコマンドです。
/tmp/に生成される一時ファイルを掃除するために利用されています。

このコマンド別に/tmp/だけを対象としているわけではなく、ディレクトリを
指定すれば任意の場所で掃除を実行してくれます。
使い道としてはWebアプリケーションで生成した一時ファイルやユーザごとに
用意したディレクトリを定期的に掃除(削除)するために利用できます。
今まで削除用のプログラムを書いたりしていましたが、このコマンドが
あれば不要ですね。
tmpwatchは指定したディレクトリ以下を再帰的に走査してくれるので
ディレクトリが何階層になっていても対処できますね。

2016年5月22日日曜日

CentOS6 で rbenv を利用して Ruby をインストールする

Serverspecで必要なRubyをCentOS6にインストールします。
CentOS6にはRubyがデフォルトでありますが、バージョンが
1.8系と古いです。現在の安定版は2.3系です。

Serverspecのセットアップ方法を調べてみてもRubyの
インストールについては省略されていることが多く、普段利用しない
言語のインストールとなると慎重になるので調べてみました。

Rubyの複数のバージョンを簡単に管理できるrbenvを利用して
Rubyをインストールしてみます。

rbenvのインストールに必要なパッケージのインストール
sudo yum groupinstall -y development
sudo yum install -y openssl-devel readline-devel zlib-devel
rbenvのインストール
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
~/.rbenv/bin/rbenv init
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
type rbenv
rbenvでRubyをインストールするために必要なプラグインをインストール
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv実行例
# rbenvでインストール可能なRubyのバージョン一覧表示
rbenv install -l
# Ruby 2.3.1をインストール
rbenv install 2.3.1
# Ruby 実行バージョン(全体)を2.3.1に設定
rbenv global 2.3.1

2016年4月17日日曜日

Apache2.4 の Testing 123.. を非表示にする

Apacheをインストールして起動しているか確認のためにデフォルトで
用意されているテストページ。このテストページを表示させない方法です。

CentOS7でインストールされるバージョンはApache2.4系。
表示されるテストページは「Testing 123..」になります。
テストページが表示される設定は/etc/httpd/conf.d/welcome.confにあり
この設定ファイルを削除または設定ファイルの中身を全てコメントアウトすれば
表示されなくなりますが、ドキュメントルートにindex.htmlを設置せずhttpd.confを
何も編集しなければ、今度はインデックスページが表示されます。
デフォルトのドキュメントルートにindex.htmlを設置すれば解決します。
または普段は先のようなインデックスページを表示してディレクトリの中身を公開する
必要が無いのでOptions Indexesは無効にします。
するとForbiddenとなりエラーページが表示されます。

welcome.confの中にも書かれているのですが、ファイルを削除するとApacheが
アップグレードしたときにファイルが復活するようです。
削除ではなくリネームして空ファイルとして配置すれば問題ないかと思います。

2016年4月8日金曜日

IE11, Firefox, Chrome の JavaScript を無効にする方法

IE11、Firefox、Chrome の JavaScript を無効にする方法
ブラウザごとに手順が異なるので整理

IE11


ツール > インターネットオプションを選択し セキュリティ タブを選択
インターネットオプションでレベルのカスタマイズを選択
スクリプト の アクティブスクリプト で 無効にする を選択しOKを押す
はい を選択しセキュリティ設定を変更後、インターネットオプションのOKを押して
インターネットオプションのウィンドウを閉じる

Firefox


右上のメニューバーから開発ツールを選択
開発ツールを表示を選択
開発ツールのオプションを選択し
詳細な設定 の JavaScriptを無効 をチェックする
開発ツールを閉じるまで有効になり、開発ツールを閉じるとリセットされる

Chrome


右上のメニューバーから その他のツール > デベロッパーツールを選択し
デベロッパーツールを表示し右端の Customize and control DevTools を選択
Settings を選択し Disable JavaScript をチェックする
デベロッパーツールを閉じるまで有効になり、デベロッパーツールを閉じるとリセットされる

IE11 は JavaScript の呼び方が アクティブスクリプト となっているので探すのに戸惑うかも
IE11 で JavaScript の設定を有効に戻す場合はインターネットオプションで
レベルのカスタマイズから 有効にする を選択するか、既定のレベルを押す

2016年3月27日日曜日

Ansible でユーザのパスワード設定が簡単に行えるようになった

Ansible でユーザのパスワード設定が以前よりも簡単になっています。
対象のAnsibleのバージョンは1.9から利用できます。

コードは下記になります。
# 変数passwordに入っている値をsha512でハッシュ化
# ハッシュ化した値をユーザのパスワードとして設定する
# ログイン時は変数passwordに入っていた値を入力
user: name={{ user_name }} password={{ password |password_hash('sha512') }}
ユーザのパスワードは平文ではなく必ずハッシュ化した値が必要です。
以前はハッシュ化した値を設定するためにPythonのコードをタスク中に
実行して結果を利用したり、事前にハッシュ化するコードを実行して結果を
直接埋め込んだりするなど手間がかかっていたのですが
password_hash()で簡単に設定ができるようになったと思います。
# このコードはAnsibleのドキュメントに記載されている方法
# Ansibleインストールマシンにpython-passlibを事前にインストールが必要
python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())"
# python-passlibをインストールせずに生成する方法
# $1$はMD5ハッシュの印
python -c 'import crypt; print crypt.crypt("password", "$1$mysalt$")'
# vars_promptでencryptを利用する変数を定義して
# Ansibleインストールマシンにpython-passlibをインストールしていない場合
# ERROR: passlib must be installed to encrypt vars_prompt values
# というエラーメッセージが表示され失敗します
vars_prompt:
    - name: "password"
      prompt: "ユーザーパスワードを入力"
      private: yes
      encrypt: "sha512_crypt"
      confirm: yes
      salt_size: 8
複数ユーザのパスワード一括設定で、ユーザごとにパスワードを
別々のものにする必要があるときpassword_hash()の方法は使いやすいです。
sha512ハッシュにしているのはCentOS6がsha512を利用しているので。

参考
Ansible - How do I generate crypted passwords for the user module?
Ansible - Jinja2 filters / Hashing filters

Ansible の変数を操作して動的に変更する

Ansibleの変数で一部分だけを取得したり数値に変換して結果を
利用したいケースがあったので調べてみました。

ドキュメントを見るかぎりAnsibleはPythonで動作し変数はJinja2の
テンプレートシステムを利用しています。
変数を操作するときの文法はJinja2、Pythonにならい、
Jinja2に組み込まれているフィルタのほか、Ansibleに用意されている
フィルタなどを利用して変数の内容を動的に変更できるようです。

数字を数値に変換する


{{ value|int + 10 }}
valueが数字10のときは20になる

文字列の一部分を取得する

Pythonのスライス表記という方法を利用して実現していると思います。

{{ value[0:1] }}
valueが test のとき t になる

{{ value[0:2] }}
valueが test のとき te になる

{{ value[1:2] }}
valueが test のとき e になる

{{ value[1:] }}
valueが test のとき est になる
valueが foo1 のとき oo1 になる
valueが foo11 のとき oo11 になる

{{ value[:2] }}
valueが test のとき te になる

{{ hoge[3:]|int + 20 }}
valueが foo1 のとき 21 になる
valueが foo11 のとき 31 になる

指定する範囲の数値からランダムに値を取得する


{{ 59 |random }}
0~59の範囲でランダムに値が選ばれる

{{ 59 |random(step=15) }}
{{ [0,15,30,45] |random }}
0, 15, 30, 45のうち、どれか1つの値がランダムに選ばれる

cronの実行時間をランダムにしたいとき便利です。

ハッシュした値を取得する


{{ 'test' |hash('sha1') }}
sha1のハッシュ値になる

{{ 'password' |password_hash('sha512') }}
sha512のパスワードハッシュ値になる(ソルトはランダム)

{{ 'password' |password_hash('sha512', 'salt_value') }}
ソルトを指定する場合

password_hashはユーザのパスワードを設定するときに
利用できると思います。

他にもいろいろとフィルタがあるようですが、主に利用するケースを
挙げてみました。
バージョンによっては利用できないフィルタがあるので利用するときは
バージョンの確認が必要です。

今回確認したOS・バージョン
CentOS 6.7
ansible 1.9.2

2016年2月22日月曜日

Sublime Text 3 のパッケージを Dropbox で共有するときは

Sublime Text 3でインストールしたパッケージを Dropbox で共有する方法は
こちらに公開されていますが、別マシンでパッケージを反映するときは事前に
Package Controlをインストールしていなければ Dropbox でパッケージの
インストール情報を反映してもパッケージは自動的にインストールされません。

"Packages"や"Installed Packages"フォルダを Dropbox で共有すると
その中に含まれているファイルはOSごとに別に用意されているみたいで
OSが違う環境で共有してしまうと問題が起きるようです。
公式にあるようにパッケージのインストール情報を管理している
"Packages/User"フォルダのみ Dropbox で共有すれば良いようです。

別マシンに共有する手順(Windows7)
1. 別マシンにSublime Text 3をインストール
2. Sublime Text 3を起動してこちらにある手順からPackage Controlをインストール
3. Sublime Text 3を終了する
4. スタートメニューから"コマンド プロンプト"を探し、右クリックして
   "管理者として実行"を選択
5. cd %HOMEPATH%\AppData\Roaming\Sublime Text 3\Packages
   コマンド プロンプトで目的のフォルダに移動
6. rmdir /S User
   Dropbox で共有するためコマンド プロンプトで"User"フォルダを削除
7. mklink /D User [Dropboxに設置しているSublime Text 3のパス]
   コマンド プロンプトで"User"フォルダのシンボリックリンクを作成
8. Sublime Text 3を再起動すれば自動でパッケージがインストールされる