helen's blog

ずっとおもしろいことしてたいな。

CDNのキャッシュクリアのシェルを作ってAnsibleのロールに組み込んだ話

CDNのキャッシュをshellコマンドで消せたらいいよね、から始まった初shellでした。

  • 複数のコンテンツのキャッシュを一回で消せること
  • 複数のCDNサーバに対応すること

を目標にやってみました。
キャッシュクリアはcurlでキャッシュを消したい画像のパスを指定することでできました。
curlコマンドでホストヘッダに完全修飾ドメイン名を記載し、各サーバのIPアドレスを叩く感じでした

使ったcurlオプションは

  • -Hオプション:HTTPヘッダにHEADERを追加もしくは変更する
  • -kオプション:SSL/TLSのエラーをスキップ

です。

今度はshellにしていきます。

#!/bin/bash

# Argument
# hoge/fuga/より下のディレクトリ名/ファイル名
#
# Output
# curlの実行結果
#
# Example
# ./clear_cache.sh images/01.jpg images/02.jpg 

# bashはエラーがあっても止まらないため、
# -e エラーで止まる
# -u 未定義の変数で止まる(今回は引数がない場合)
# を設定
set -eu

# 引数を配列argvに入れます
# ()で配列、引数は$@に文字列で全部繋がって入っている
argv=("$@")

# foreachみたいに配列の要素ごとに処理
for arg in "${argv[@]}"; do
  echo  "$(curl -H ~~~~~~~~~~~~~~~$arg -k)"
done

# 正常終了として0を返す
exit 0
./clear_cache.sh <filename> <filename>

で実行できます。

初shellではめられたのは

  • 変数はダブルクオートか何もつけない場合に展開される
  • シングルクオートでは展開されない
  • 文字列結合に+とか . がいらない

ところでした

これをAnsibleでVagrantにコピーするタスクを組み込みます。

実際の作業としては

  • ansible/role/scripts/files:コピーしたいshellファイルを入れる
  • ansible/role/scripts/tasks/main.yml :scripts.ymlを読むように設定
  • ansible/role/scripts/tasks/scripts.yml :/scripts/files内のファイルをコピーするように設定
  • ansible/playbook.yml:scriptRoleを追加

となります。

scripts.ymlの中身

- name: copies scripts.
  # Ansibleのコピーモジュールを利用します
  copy: src={{ item }} dest="/usr/local/bin/" mode=0755
  with_fileglob: 
    -* # デフォルトでfilesを見るので*で良い

withi_fileglobでfilesの中身を1つずつ参照し、itemに入れてからdest先にコピーします。
withi_fileglobはsrcかcontentがないとエラーがでます。

scripts.ymlのオプションで使ってるオプション
  • name: タスク名
  • copy: コピータスク
  • src: ローカルにあるコピーするファイルのパス(相対、絶対可)
  • dest: コピー先の絶対パスの指定
  • mode: chmodコマンドで設定できる権限設定
  • sudo: noでAnsibleの接続ユーザ権限でコマンド実行

コピー先は

  • bin:コマンド系
  • sbin:suユーザのコマンド
  • user/bin:ユーザがインストールしたもの
  • user/local/bin:ユーザがつくったもの

なのでuser/local/binにコピーしました。

参考
Loops — Ansible Documentation
Ansible ~copyモジュール~ - Qiita