読者です 読者をやめる 読者になる 読者になる

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

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

ansibleを学ぶ:vol07:figletで動的にホスト名をmotdに書き込んでニヤニヤする

ansible

こういうくだらない事もたまにはいいものですよ〜
f:id:treeapps:20160219001058p:plain

ログイン時に情報表示しよう!

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

github.com

例えば「Ansible」という文字をfigletで表示してみると、以下のようになります。
f:id:treeapps:20160624000621p:plain

では、ホスト名をfigletで出力してみます。
f:id:treeapps:20160624000631p:plain

こんな感じです。

ホスト名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

初めてのAnsible