猫も杓子も記事を書く

140文字ではかけないことをかこうと思います。

Ansible越しにリモート(centos7)へミドルウェアの設定を突っ込みたい時のベタープラクティス

いいとは思うけど最適解ではないかもねという話。

例題

リモートサーバーのapacheのconfファイルを、予めアレンジしたものに書き換えたい。
Ansibleでインストールのタスクだけ流したあと、リモートログインして直接書き換えるのはあまりにもダサすぎる・・・

Templateについて

Ansibleでプロビジョニング目的でタスクをいろいろ設定して流す時、confファイルといった、各ツールの設定ファイルをそれ用に書き換えたい時ってどうしたらいいんだろうと考えていました。
Ansibleちゃんは賢いので、ちゃんとそれ用のプロセスを作ってくれていました。

template - Templates a file out to a remote server. — Ansible Documentation

Ansible公式には、

Templates are processed by the Jinja2 templating language

とあります。
Ansibleと同じく、Pythonのライブラリみたいですね。

Welcome to Jinja2 — Jinja2 Documentation (2.9)

いろいろ書き方が載っていますが、今回の場合、Jinja2フォーマットに書き換えなくてもよいです。
流したい設定ファイルをよしなに配置し、拡張子を.j2にしてあげればOK。

やってみる

例題の通り、リモートのhttpd.confを書き換えるというシナリオで進めます。タイトルにあるとおり、CentOS 7.1でやっています。
書き換える対象は、「httpd.conf sample」で一番上にでてきたこちらをお借りします。

https://collab.itc.virginia.edu/wiki/toolbox/example%20httpd.conf%20file.html

デフォルトのconfファイルをこちらに書き換えるという仮定ですね。

なお、インベントリなど、Ansibleの接続関連の設定は既に済みであるものとします。

配置する

上記、configファイルのサンプルをコピり、httpd.conf.j2ファイルとして配置します。
配置場所はplaybookで指定するのでどこでもOKなのですが、templatesディレクトリの配下とかにしてあげると見通しが良くなる気がします。
今回は全て見なくても先頭だけ見ればわかるように、コメントで一行追加しています。

# Ansibleのテンプレートのてすとだよ〜(o・∇・o)

playbookにタスクを追加する

今回はplaybook.ymlとしてymlファイルを置き、タスクを書いていきます。 念のため、httpdのインストールタスクも一緒に追加しています。
既にhttpdが入っていたらどうなるの?競合したりしないの?とお思いの方がいらっしゃるかもしれませんが、Ansibleは冪等性(何回繰り返しても必ず同じ結果になる)が重視されているため、もし既にインストールしていたとしても、何も変更を加えず次のタスクに移ってくれます。

- hosts: all
  remote_user: root
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: latest

    - name: change httpd.conf file
      template: 
        src: template/httpd.conf.j2
        dest: /etc/httpd/conf/httpd.conf
        owner: root
        group: root
        mode: 0644

フォルダ配置

ちなみにここまで、ファイルの配置はこんなんです。

|-- host
|-- playbook.yml
|
|-- template/
    |-- httpd.conf.j2

今回は1タスクなので適当の極みみたいなファイル配置ですが、実際に運用するとなると他に大量の処理をさせなければいけないので、
フォルダ配置はAnsible側でベストプラクティスが定義されています。
オレオレベストプラクティスをupされている方もたくさんいらっしゃいます。

qiita.com

動かす

ansible-playbookコマンドで動かします。自分の場合は鍵認証つきなのでこんなんです。

ansible-playbook -i hosts playbook.yml --private-key /Users/username/.ssh/id_rsa

okとかchangedとかが表示されていれば、タスクがちゃんと流れている証拠です。

結果

デフォルトだと先頭はこんなんですが、

[root@uminchu11 ~]# cat /etc/httpd/conf/httpd.conf
#
# This is the main Apache HTTP server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
# In particular, see
# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
# for a discussion of each configuration directive.
#

流した後のconfファイルを見てみると

[root@uminchu11 ~]# cat /etc/httpd/conf/httpd.conf
# Ansibleのテンプレートのてすとだよ〜(o・∇・o)

###*********************************************************
###*  Web-Developer Server Suite                           *
###*  external link: http://sourceforge.net/projects/webdeveloper         *
###*  devside_net@users.sourceforge.net                    *
###*  v1.95-httpd22-ssl                                    *
###*********************************************************

ちゃんと反映されています。上出来。

まとめ

今回のように、ミドルウェアに対して予め用意した設定ファイルを適用したい場合などはtemplateタスクはかんたんですし効果的です。viでカスタマイズして操作ミスって何度も泣きを見た自分のような方には特におすすめです。
またAnsibleのいいところは、リモートに特に何も設定をしなくても、sshで接続できさえすればよいというところですね。手軽に使えるのでみなさんもどんどんplaybookを書いて素敵なプロビジョニングライフを送りましょう。(ステマじゃないよ)