こういうくだらない事もたまにはいいものですよ〜
ログイン時に情報表示しよう!
AWSでec2のサーバにsshログイン時に以下のような表示をよく見ますね。
__| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2013.03-release-notes/ [ec2-user ~]$
これは、motd(message of the day)という機能で、このメッセージはカスタマイズする事ができます。
今回は、ここにちょっとイカしたメッセージを表示したいと思います。
figlet
例えば「Ansible」という文字をfigletで表示してみると、以下のようになります。
では、ホスト名をfigletで出力してみます。
こんな感じです。
ホスト名motdに書き込む事で、動的にmotdを生成できるようになるので、motdをいちいち手で作らなくてよくなるので、楽になります。
Amazon linux EC2の特殊なmotd事情
ec2はcronで定期的にmotdが書き換えられてしまう特殊な環境になっています。
詳しくは以下をご覧下さい。
dev.classmethod.jp
ec2の場合に動的にmotdを書き換えるには、/etc/update-motd.d/ 以下に、標準出力するシェルスクリプトを配置すると、その標準出力内容がmotdに追記されます。
サンプル
task
- block: - yum: name=figlet state=latest - shell: "figlet {{ ansible_hostname }}" register: motd_text - template: src=99-banner.sh dest=/etc/update-motd.d/99-banner mode=0755 group=root owner=root become: yes
figletをyumでインストールし、figletの結果をregisterで変数に保存して、保存した変数をtemplateに渡します。
99-banner.sh
#!/bin/sh # {{ ansible_managed }} cat << \EOF {% for line in motd_text.stdout_lines %}{{ line }} {% endfor %} IP Address: [ {{ ansible_eth0.ipv4.address }} ] Host: [ {{ ansible_hostname }} ] EOF
はい。ここがちょっとトリッキーになっています。
タスク側でregisterしておいた変数motd_textを、template内でstdout_linesで複数行で取得し、ループして1行づつmotdを書き込んでいます。
普通に考えると以下のように書きたくなりますが、これではダメなのです。
{% for line in motd_text.stdout_lines %} {{ line }} {% endfor %}
このままでは以下のように2重に改行表示されてしまいます。
_ _ _ __ ___ __| | ___/ | | '_ \ / _ \ / _` |/ _ \ | | | | | (_) | (_| | __/ | |_| |_|\___/ \__,_|\___|_|
なので、以下のように {{ line }} の前に改行が入らないようにします。↑で余計な改行が入っていたのは、{{ line }}の改行部分だったのです。
{% for line in motd_text.stdout_lines %}{{ line }} {% endfor %}
出力結果
最終的に以下のような99-bannerが配置され、ec2のcronによって以下が標準出力され、motdに書き込まれます。IP等も一緒に表示するようにすると、sshした時に間違えて別のサーバにログインしても、気付きやすくなるかと思います。
[vagrant@node1 ~]$ cat /etc/update-motd.d/99-banner #!/bin/sh # Ansible managed: /usr/local/vagrant/test/playbook/roles/motd/templates/99-banner.sh modified on 2016-06-23 23:45:00 by tree on tree.local cat << \EOF _ _ _ __ ___ __| | ___/ | | '_ \ / _ \ / _` |/ _ \ | | | | | (_) | (_| | __/ | |_| |_|\___/ \__,_|\___|_| IP Address: [ 10.0.2.15 ] Host: [ node1 ] EOF [vagrant@node1 ~]$
最終的なmotd表示
この状態でsshでログインすると、めでたく以下のようになり、sshする度にフヒヒ・・とニヤニヤする事になります。
_ _ _ __ ___ __| | ___/ | | '_ \ / _ \ / _` |/ _ \ | | | | | (_) | (_| | __/ | |_| |_|\___/ \__,_|\___|_| IP Address: [ 10.0.2.15 ] Host: [ node1 ] __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2013.03-release-notes/ [ec2-user ~]$
ちょっとEC2の表示が邪魔くさいですが、yum updateされていないパッケージの通知等も一緒に表示されたりするので、元のEC2の方はそのままにする方がいいでしょう。
雑感
最近はsshしない設計にする事が多いので、こういうしょうもない事に凝ったりする事も減りましたね。
qiita.com
↑のように普通にif文でmotdに表示する内容を変更する事が可能なので、私のようにsshしない設計になっていない現場の方々は、息抜きにmotdで遊んでみましょう!
Ansible実践ガイド 第2版 (impress top gear)
- 作者: 北山晋吾,塚本正隆,畠中幸司
- 出版社/メーカー: インプレス
- 発売日: 2018/03/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
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ブログ