るいすときのこの物語

オタクエンジニアの雑記

AnsibleでコピーするときはSynchronizeモジュール使ったほうが幸せになれる


背景

Ansibleでターゲットホストに何かをコピーするとき copyモジュールを使ってる人はとても多いと思います。

しかし恐ろしいぐらい遅いため、ansible copy slow何かで調べると 色々対策が書かれている記事があると思います。

まあそれを試しても劇的な改善はなく、結果として意味のないものです。

 

Synchronizeモジュールを使う

Ansible - synchronize

Copyモジュールと同等のことをやってみます。

1. ターゲットホストにファイルを配置する

- name: Copy Web API to /home/node
  synchronize:
    src: Web-API
    dest: /home/node
    recursive: yes
    use_ssh_args: yes

 

2. パーミッションを変更する

- name: Change permission to /home/node/Web-API
  file:
    path: /home/node/Web-API
    owner: node
    group: node
    recurse: yes
    mode: 0755

Synchronizeモジュールにもownergroupオプションはあるんですが これは Ansible 実行マシンに存在するユーザー、グループで且つ、 ターゲットホストにも存在しないといけないという制約があるので、 別タスクでパーミッション等を変更する必要があります。

 

比較

全部で350行ぐらいある Playbook の中のcopyモジュール版と Synchronizeモジュール版で比べた結果です。

Copy

real 4m25.575s

Synchronize

real 2m12.755s

圧倒的