みなさん、こんにちは。ピクトリンク事業部インフラ課の藤本佳世です。
フリュー Advent Calendar 2018の12/18分の記事になります。
先日、SSL証明書の更新をAnsibleで実施しようとコードを書いていた時にはまった
「Ansibleで連番の複数ホストを指定できなかった件」について、シェアしたいと思います。
みなさんも、「これで動きそうなんだけど、なぜ動かない!!」と思ったことあるかと思います。
今回、私もそんな状況になってしまいました。
※Ansibleについては、以前ブログを書いているのでこちらをご覧ください。
やりたかったこと
今回やりたかった作業はSSL証明書の更新です。この作業をAnsibleで実施しようと考えました。
サーバ | ドメイン |
test-web-01~05 | hoge.com |
test-web-06~10 | fuga.com |
SSL証明書の場所は下記の通りです。
Webサーバ証明書ファイル | /usr/local/ssl/server.crt |
Webサーバの秘密鍵ファイル | /usr/local/ssl/private.key |
中間CA証明書ファイル | /usr/local/ssl/server_ca.crt |
ここで注意ポイントがあります。
test-web-01~test-web-05はドメインhoge.comの証明書
test-web-06~test-web-10まではドメインfuga.com証明書
のように、サーバによって証明書が異なることです。
実際のAnsibleコード
role配下のmain.ymlはこんな感じで書きました。
# SSLキーファイルの送信 - name: deploy apache ssl key files copy: src: "{{ CERT }}/{{item}}" dest: "/usr/local/ssl/{{item}}" owner: "{{ CERT_OWNER }}" group: "{{ CERT_OWNER }}" mode: 0644 with_items: - server.crt - private.key - server_ca.crt
playbook.ymlはこんな感じです。
--- - name: ssl-deploy hosts: test roles: # SSL証明書暗号化スクリプトのデプロイ - { role: config/ssl, CERT: "hoge_com", CERT_OWNER: "hoge", when: "'test-web-[01-05]' in inventory_hostname", tags: "hoge" } - { role: config/ssl, CERT: "fuga_com", CERT_OWNER: "fuga", when: "'test-web-[06-10]' in inventory_hostname", tags: "fuga" }
サーバによって証明書が異なるので、when句を使って
test-web-01~test-web-05はhoge_com
test-web-06~test-web-10はfuga_com
のように指定したつもりでしたが、うまくいきませんでした。
ex) test-web-05, test-web-10に対して実行した結果
PLAY [ssl-deploy] ******************************************************************************************************************************************************************************* TASK [Gathering Facts] ************************************************************************************************************************************************************************** ok: [test-web-10] ok: [test-web-05] TASK [config/ssl : deploy apache ssl key files************************************************************************************************************************************************** skipping: [test-web-05] => (item=server.crt) skipping: [test-web-05] => (item=private.key) skipping: [test-web-05] => (item=server_ca.crt) skipping: [test-web-10] => (item=server.crt) skipping: [test-web-10] => (item=private.key) skipping: [test-web-10] => (item=server_ca.crt) PLAY RECAP ************************************************************************************************************************************************************************************** test-web-05 : ok=2 changed=0 unreachable=0 failed=0 test-web-10 : ok=2 changed=0 unreachable=0 failed=0
エラー出力されませんが、すべてskippingされた状態になりました。
対処法
下記のようにplaybook.ymlを修正しました。
- { role: config/ssl, CERT: "hoge_com", CERT_OWNER: "hoge", when: "inventory_hostname.split('-')[2]|int <= 5", tags: "hoge" } - { role: config/ssl, CERT: "fuga_com", CERT_OWNER: "fuga", when: "inventory_hostname.split('-')[2]|int >= 6", tags: "fuga" }
inventroy_hostname(ホスト名)の数字の部分だけを取り出し、「5以下」、「6以上」と識別するようにしました。
公式ドキュメントにも書いている通り、CentOSのバージョンによって処理を分けることもできます。
Tip: Sometimes you’ll get back a variable that’s a string and you’ll want to do a math operation comparison on it.
このTipsは今後も使えそうです!
だめだった方法
記述方法をいろいろ替えてやってみましたが、うまくいかず。。。
- { role: config/ssl, CERT: "hoge_com", CERT_OWNER: "hoge", when: "'test-web-[01:05]' in inventory_hostname", tags: "hoge" } - { role: config/ssl, CERT: "fuga_com", CERT_OWNER: "fuga", when: "'test-web-[06:10]' in inventory_hostname", tags: "fuga" }
こちらの記事を参考にしてみましたが、うまいかず。。。
- { role: config/ssl, CERT: "hoge_com", CERT_OWNER: "hoge", when: "'test-web-[01-05:]' in inventory_hostname", tags: "hoge" } - { role: config/ssl, CERT: "fuga_com", CERT_OWNER: "fuga", when: "'test-web-[06-10:]' in inventory_hostname", tags: "fuga" }
うまくいかなかった問題に関しては、また時間がある時に調べてみたいと思います。
最後に
2018年度の私の投稿はこの記事で最後になります。
2018年は大変お世話になり、ありがとうございました。来年もどんどんブログを書くつもりなので、
今後ともどうぞよろしくお願い致します。
みなさまにとって2018年は素敵な年となりましたでしょうか?
願わくは、2019年も素敵な年となりますように★