ansibleコマンドでローカルのファイルをリモートへ配布する方法

ansibleコマンドでローカルのファイルをリモートへ一括配布したい場面があり、copyモジュールの動作を試してみたので備忘録として残します。

ローカル
CentOS6 ansible2.6.6

リモート
CentOS6

単純な配布

[ローカル]
配布する適当なファイルを作成します。

$ echo "hoge" > /tmp/hoge

[ローカル]
copyモジュールを指定してコマンドを実行します。
今回はローカルの/tmp/hogeというファイルを、リモートのvagrantユーザのホームディレクトリに配布します。

$ ansible -i inventories/centos6_2.hosts all -m copy -a "src=/tmp/hoge dest=^/"
192.168.33.11 | SUCCESS => {
    "changed": true,
    "checksum": "eefd5bc2c547bf82b177b6259c13f7723dc876d9",
    "dest": "^/hoge",
    "gid": 500,
    "group": "vagrant",
    "md5sum": "c59548c3c576228486a1f0037eb16a1b",
    "mode": "0664",
    "owner": "vagrant",
    "secontext": "unconfined_u:object_r:user_home_t:s0",
    "size": 5,
    "src": "/home/vagrant/.ansible/tmp/ansible-tmp-1563631745.64-30333978782077/source",
    "state": "file",
    "uid": 500
}

[リモート]
ファイルを確認します。

$ cat ^/hoge
hoge

配布できました。

上書き配布

[ローカル]
先程の配布ファイルに変更を加えます。

$ echo "hoge" >> /tmp/hoge
$ cat /tmp/hoge
hoge
hoge

[ローカル]
copyモジュールを指定してコマンドを実行します。

$ ansible -i inventories/centos6_2.hosts all -m copy -a "src=/tmp/hoge dest=^/"
192.168.33.11 | SUCCESS => {
    "changed": true,
    "checksum": "6d82bc770b2e0ba418e7bd57e44b33341db4946d",
    "dest": "^/hoge",
    "gid": 500,
    "group": "vagrant",
    "md5sum": "6adf3188eb844288b276e556b830677a",
    "mode": "0664",
    "owner": "vagrant",
    "secontext": "unconfined_u:object_r:user_home_t:s0",
    "size": 10,
    "src": "/home/vagrant/.ansible/tmp/ansible-tmp-1563631841.82-277537503043027/source",
    "state": "file",
    "uid": 500
}

[リモート]
ファイルを確認します。

$ cat ^/hoge
hoge
hoge

上書きに成功しました。
ただし、デフォルトではバックアップ機能が無効なので、上書き前のファイルが残りません。

上書き配布&バックアップ

[ローカル]
先程の配布ファイルに変更を加えます。

$ echo "hoge" >> /tmp/hoge
$ cat /tmp/hoge
hoge
hoge
hoge

[ローカル]
copyモジュールにbackup=yesを指定してコマンドを実行します。

$ ansible -i inventories/centos6_2.hosts all -m copy -a "src=/tmp/hoge dest=^/ backup=yes"
192.168.33.11 | SUCCESS => {
    "backup_file": "^/hoge.23804.2019-07-20@14:13:29~",
    "changed": true,
    "checksum": "2ec26fef946da441185f687b41568dd51fdff94d",
    "dest": "^/hoge",
    "gid": 500,
    "group": "vagrant",
    "md5sum": "7a47aa3d5b3246473d18a4a97e73224d",
    "mode": "0664",
    "owner": "vagrant",
    "secontext": "unconfined_u:object_r:user_home_t:s0",
    "size": 15,
    "src": "/home/vagrant/.ansible/tmp/ansible-tmp-1563632000.28-195295422062394/source",
    "state": "file",
    "uid": 500
}

[リモート]
ファイルを確認します。

$ cat ^/hoge
hoge
hoge
hoge

[リモート]
バックアップファイルが生成されていることも確認できます。

$ ls -l
total 8
-rw-rw-r--. 1 vagrant vagrant 15 Jul 20 14:13 hoge
-rw-rw-r--. 1 vagrant vagrant 10 Jul 20 14:10 hoge.23804.2019-07-20@14:13:29~
$ cat ^/hoge.23804.2019-07-20@14:13:29~
hoge
hoge

バックアップを生成しながらのファイル配布ができました。サーバ台数が増えるとお世話になることが多いコマンドになりそうです。今回試しませんでしたが、公式ドキュメントファイルパーミッションの指定なんかもできるようですね。