logo-sm

お問い合わせは Webフォームから

ブログ

Ansibleでcopyモジュールで変更がなかったらApacheやnginxを再起動させない方法

2017.11.24

[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]

関連記事

  • WindowsのWSL2上のDockerでup時に’ContainerConfig’のエラーが出た。
    当社の開発環境はMacとWindowsが混在したDocker上での開発を行っています。なのでMacでOKだけど […]

    2024.04.08

  • VSCode (内のPowerShell)でアドレス設定を切り替え!
    【経緯】 最近携わった案件で大量のNW機器のキッティングをした際、それぞれにSSHでの接続性などを確認するテス […]

    2023.10.13

  • PaloaltoでWindows NTPサーバに同期
    【事象と対処法】 オフライン環境のPaloaltoでNTPの機能確認をする必要があり、Windows標準のNT […]

    2023.10.13

  • パートナー

  • 人材育成・採用情報