CDNのキャッシュクリアのシェルを作ってAnsibleのロールに組み込んだ話
CDNのキャッシュをshellコマンドで消せたらいいよね、から始まった初shellでした。
を目標にやってみました。
キャッシュクリアはcurlでキャッシュを消したい画像のパスを指定することでできました。
curlコマンドでホストヘッダに完全修飾ドメイン名を記載し、各サーバのIPアドレスを叩く感じでした
使ったcurlオプションは
です。
今度は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