Ansibleで連番の複数ホストを指定できなかったのでその原因と対策


目次

みなさん、こんにちは。ピクトリンク事業部インフラ課の藤本佳世です。

フリュー 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年も素敵な年となりますように★