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]

関連記事

  • 自宅に構築!仮想環境 ~BIG-IP VE導入編~
    【導入】 前回は、自宅サーバにProxmoxを導入しました。 今回はその上に仮想マシンとしてBIG-IP VE […]

    2024.09.30

  • 自宅に構築!仮想環境 ~Proxmox導入編~
    【導入】 以前から学習用に自宅仮想環境をつくりたく思っていたところ、BIG-IP(の仮想版)に触れる必要が出て […]

    2024.09.30

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

    2024.04.08

  • パートナー

  • 人材育成・採用情報