ブログ
Ansibleでcopyモジュールで変更がなかったらApacheやnginxを再起動させない方法
[markdown]
Ansibleでcopyモジュールを使ってファイル更新しないのに、
Apacheとかnginxなどミドルウェアを再起動してしまって時間かかったりするのがイヤな時ってありますよね。
その時にこうやるといいよ〜ってやり方です。
ちなみにAWSの**Lightsail**上のnginxインスタンスを使っております。
こちらは**bitnami**というツールで構成されているのでパスもそれに合わせた形になっております。
## 修正前のソース
“`
– name: copy files
copy:
src: “../../files/nginx/{{ item.name }}”
dest: “/opt/bitnami/nginx/conf/bitnami/{{ item.name }}”
owner: root
group: root
mode: 0644
with_items:
– { name: bitnami-apps-vhosts.conf }
– name: nginx restart
command: /opt/bitnami/ctlscript.sh restart nginx
args:
chdir: /opt/bitnami
“`
copyモジュールの一番最後に実行結果を格納するために**registerモジュール**を追加します。
**registerモジュール**を利用すると以下のような形式で実行結果が格納されます。
今回は**result**という変数に実行結果を格納してみました。
ちなみに以下に**result**の内容を記載しています。
**changed**の値でcopyモジュールで更新したか否かがわかります。
* 変数resultの内容
“`
ok: [hostsの名前] = {
“result”: {
“changed”: false, ← ここの値がflaseだと変更なし。trueだと変更あり。
“msg”: “All items completed”,
“results”: [
{
“_ansible_item_result”: true,
“_ansible_no_log”: false,
“_ansible_parsed”: true,
・
・
・
“`
## 修正後のソース
これでcopyモジュールで配布されない限り、ミドルウェアは再起動されません。
whenブロックで**result変数**の中の**changed**の値を確認しています。
whenブロックの式の内容がtrueであればcommandモジュールが実行されます。
“`
– name: copy files
copy:
src: “../../files/nginx/{{ item.name }}”
dest: “/opt/bitnami/nginx/conf/bitnami/{{ item.name }}”
owner: root
group: root
mode: 0644
with_items:
– { name: bitnami-apps-vhosts.conf }
register: result
# copy fileに変更がなければnginxは再起動しない。
– name: nginx restart
command: /opt/bitnami/ctlscript.sh restart nginx
args:
chdir: /opt/bitnami
when: result.changed == true
“`
[/markdown]
関連記事
2024.09.30
2024.09.30
2024.04.08