文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

ansibleを学ぶ:vol02:Oracle JDK1.8のインストール、ユーザパスワード設定等

ansibleの勉強シリーズ第2回です。


f:id:treeapps:20160219001058p:plain

今回は、

  • Oracle JDK1.8のインストール。
  • グループ・ユーザを追加し、ユーザのパスワードを設定する。
  • yumのgroupinstallをする。

です。

Oracle JDK1.8のインストール

OpenJDKであれば、yumで簡単にインストールできますね。
しかし・・・

[vagrant@localhost nginx]$ yum search openjdk
java-1.6.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.6.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.6.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.6.0-openjdk-javadoc.x86_64 : OpenJDK API Documentation
java-1.6.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle


うーん、バージョン1.8は無いかあ

OpenJDKってネット上ではOracle JDKと比較して遅いという意見があったりしますね。

今回はようやく登場した1.8を入れたいので、openjdkではなくOracleのJDK v1.8をインストールします。。しかしOracke JDKはダウンロードページに行くと、Oracleのアカウントを作って、そのユーザID・パスワードを入力しないとダウンロードできません。

今回ansibleからこのOracle JDKをインストールする訳ですが、実はユーザID・パスワード無しでダウンロードが可能なので、やってみます。

common.yml(vars_filesで読み込む)

JAVA_DL_URL: http://download.oracle.com/otn-pub/java/jdk/8u5-b13/jdk-8u5-linux-x64.rpm
JAVA_DL_PATH: /usr/local/src/jdk-8u5-linux-x64.rpm

main.yml

---
- name: download oracle jdk 1.8
  command: 'wget -q -O {{JAVA_DL_PATH}} --no-cookies --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" {{JAVA_DL_URL}} creates={{JAVA_DL_PATH}}' 
  poll: 10

- name: install oracle jdk
  yum: name={{JAVA_DL_PATH}}

ポイントは、

  • クッキーを設定する事。
  • rpmをyumモジュールでインストールし寡等性を維持する。

という点です。

実はクッキーを設定すると、wget等で直接rpmをダウンロードできちゃいます。

ユーザの追加とユーザパスワードの設定

続いてOSにグループとユーザを追加し、追加したユーザにパスワードを設定します。

common.yml(vars_filesで読み込む)

DEFAULT_GROUP: hoge
DEFAULT_USER: hoge
DEFAULT_USER_PASSWORD: hoge

main.yml

---
- name: add group "{{DEFAULT_GROUP}}"
  group: name={{DEFAULT_GROUP}}

- name: add user "{{DEFAULT_USER}}"
  user: name={{DEFAULT_USER}} group={{DEFAULT_GROUP}} home=/home/{{DEFAULT_USER}} password={{DEFAULT_USER_PASSWORD}}

一見するとこれでいけそうに見えますが、これでは駄目です。
パスワードは平文では駄目で、SHA-512で非可逆圧縮されたハッシュ値を設定しないといけません。

How do I generate crypted passwords for the user module?

The mkpasswd utility that is available on most Linux systems is a great option:

mkpasswd --method=SHA-512
If this utility is not installed on your system (e.g. you are using OS X) then you can still easily generate these passwords using Python. First, ensure that the Passlib password hashing library is installed.

pip install passlib
Once the library is ready, SHA512 password values can then be generated as follows:

python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('')"

http://docs.ansible.com/faq.html#how-do-i-generate-crypted-passwords-for-the-user-module

オフィシャルにはこういう説明があります。
mkpasswdはランダムなパスワードジェネレータです。
今回はパスワードを指定したいので、pythonのPasslibを使った方法になります。

macでPasslibをインストール

passlibはpip(pythonのパッケージ管理システム)からインストールできます。
ansibleを使う人なら既にpython環境は大体揃っていると思うので、pipのインストール方法は省略します。

今回はmacでpasslibをインストールしてみました。

treemacpro-2:~ tree$ sudo pip install passlib
Password:
Downloading/unpacking passlib
  Downloading passlib-1.6.2.tar.gz (408kB): 408kB downloaded
  Running setup.py (path:/private/tmp/pip_build_root/passlib/setup.py) egg_info for package passlib

Installing collected packages: passlib
  Running setup.py install for passlib

Successfully installed passlib
Cleaning up...
treemacpro-2:~ tree$

PasslibでSHA-512で非可逆圧縮されたパスワードを生成する

treemacpro-2:work tree$ python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('hoge')"
$6$rounds=100000$830C/SLSEa1r2O5c$EHYXmozzoQWbTvpV5rp2jFaZ0rxNTLKXLY9JXKT9CbA/l9VndMR.a7Lkm/FhzppDuns4bVXSJmlLb/bc5GI9X1

暗号文字列が出力されましたね。これを設定すればよいのです。

変更後のcommon.yml(vars_filesで読み込む)

DEFAULT_GROUP: hoge
DEFAULT_USER: hoge
DEFAULT_USER_PASSWORD: $6$rounds=100000$830C/SLSEa1r2O5c$EHYXmozzoQWbTvpV5rp2jFaZ0rxNTLKXLY9JXKT9CbA/l9VndMR.a7Lkm/FhzppDuns4bVXSJmlLb/bc5GI9X1

これでユーザの追加とパスワードの設定ができます。
試しに以下のようにsuしてみて、設定したパスワードでログインできればOKです!

[vagrant@localhost ~]$ su hoge
パスワード:
[hoge@localhost vagrant]$

yumのgroupinstallをする

groupinstallと言えば「Development Libraries」や「Development tools」ですね。
公式サイトのyumモジュールのexampleをよーく見ると、一番下にこっそりとgroupinstallのサンプルコマンドが書いてます。

- name: install the 'Development tools' package group
  yum: name="@Development tools" state=present

よくみると@が付いています。
@について全く説明がありませんが、@をつけると「yum install」が「yum groupinstall」になるようです。ちなみに@を付けないでインストールしようとすると以下のようになりました。

TASK: [tool | install the 'Development Libraries' package group] **************
failed: [node1] => {"changed": false, "failed": true, "item": "", "rc": 0, "results": []}
msg: No Package matching 'Development Libraries' found available, installed or updated
failed: [node2] => {"changed": false, "failed": true, "item": "", "rc": 0, "results": []}
msg: No Package matching 'Development Libraries' found available, installed or updated

FATAL: all hosts have already failed -- aborting

では@を利用して、Development LibrariesとDevelopment toolsを入れていましょう。

---
- name: install the 'Development Libraries' package group
  yum: name="@Development Libraries" state=present

- name: install the 'Development tools' package group
  yum: name="@Development tools" state=present

雑感


ユーザのパスワードの設定の仕方とか、インフラエンジニアでない自分には分からん事だな。passwdコマンドで対話式でしか設定した無いから、SHA-512で管理されてるは思わなかったな。


そうだな。アプリの開発者としてはこういう基本的な概念をちゃんと学ぶ必要性に迫られてきてる訳だな。


覚える範囲が広くなってきて大変だとは思いますが、一度playbookを作れば簡単に使いまわせるので、めげずに頑張りましょう


(くそ!!アプリ開発してた奴らが俺らインフラ屋の領域に踏み込んできてやがる・・・!!やべえ・・・やるおに仕事を取られるなんて屈辱だ・・・!!!)

Ansible実践ガイド 第2版 (impress top gear)

Ansible実践ガイド 第2版 (impress top gear)

ansibleを学ぶ:vol01:vagrantを使ってansibleを動かしてみる - 文系プログラマによるTIPSブログ
ansibleを学ぶ:vol02:Oracle JDK1.8のインストール、ユーザパスワード設定等 - 文系プログラマによるTIPSブログ
ansibleを学ぶ:vol03:実行中のホスト名を書き込む、変数の値に変数を使用する - 文系プログラマによるTIPSブログ
ansibleを学ぶ:vol04:よくハマる部分とその解決法 - 文系プログラマによるTIPSブログ
ansibleを学ぶ:vol05:対象サーバのid_rsa.pubを対象サーバのauthorized_keysに登録する - 文系プログラマによるTIPSブログ
ansibleを学ぶ:vol06:mysql-serverのインストールからcreate databaseまでを自動化する - 文系プログラマによるTIPSブログ
ansibleを学ぶ:vol07:figletで動的にホスト名をmotdに書き込んでニヤニヤする - 文系プログラマによるTIPSブログ