petitviolet blog

    Ansibleでローカルのディレクトリをリモートにコピーする

    2014-09-27

    QiitaAnsible

    まとめ

    Ansible でローカルのファイル/ディレクトリをリモートに持っていくためには synchronizeではなくcopyモジュールを使えば良い

    synchronizecopy

    ansible directory copy - Google 検索すると、copysynchronizeの 2 つのコマンドが出てくるkobito.1411812903.512220.png

    copy

    ファイルをコピーするためのコマンドっぽい document のサンプルでも

    sample
    # Example from Ansible Playbooks
    - copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644
    
    # The same example as above, but using a symbolic mode equivalent to 0644
    - copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode="u=rw,g=r,o=r"
    
    # Another symbolic mode example, adding some permissions and removing others
    - copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode="u+rw,g-wx,o-rwx"
    
    # Copy a new "ntp.conf file into place, backing up the original if it differs from the copied version
    - copy: src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes
    
    # Copy a new "sudoers" file into place, after passing validation with visudo
    - copy: src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'
    

    全てファイルのコピーを行っている

    synchronize

    rsyncコマンドを実行するモジュールっぽい

    sample
    # Synchronization of src on the control machine to dest on the remote hosts
    synchronize: src=some/relative/path dest=/some/absolute/path
    
    # Synchronization without any --archive options enabled
    synchronize: src=some/relative/path dest=/some/absolute/path archive=no
    
    # Synchronization with --archive options enabled except for --recursive
    synchronize: src=some/relative/path dest=/some/absolute/path recursive=no
    

    recursiveとかあるし、ディレクトリを持って行くにはsynchronizeモジュールが適切っぽく思われる

    しかし、synchronizeで実行すると、

    error
    msg: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
    rsync: connection unexpectedly closed (0 bytes received so far) [sender]
    rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.1]
    

    と出てしまってコピー出来なかった。 ssh を使ったrsyncのはずが、何故かパスワードを求められていて、Permission denied となってしまっている。

    ディレクトリのコピー

    最初のまとめにも書いた通り、

    copy: src={{ src_dir }} dest={{ dest_dir }}
    

    だけで良かった。

    なお、ディレクトリを丸ごとコピーするには

    src_dir: /src/path/local_dir
    dest_dir: /dest/path/remot_dir
    

    とする。 これでローカルの/src/path/local_dirというディレクトリが、リモートの/dest/path/remote_dirという名前でコピーされる

    src_dir: /src/path/local_dir/
    dest_dir: /dest/path/remot_dir/
    

    とすると、 /src/path/local_dir/*/dest/path/remote_dir/にコピーされる

    from: https://qiita.com/petitviolet/items/dbff0b1a949b54efc5af