(小ネタ)Ansibleでローカル/リモートのサーバにファイルをコピーする

はじめに

こんにちは。AC20周年のサントラ発売で浮かれている闘争を求める民佐々木です。

今回は小ネタですがAnsibleを使ったファイルコピーで検証したことがあったのでメモ程度に記事にしてみます。

やりたいこと

前提として実現したかったことは以下のようなことです。

  • Ansibleを使って所定のディレクトリへファイルをコピーしたい。ファイルはplaybookと一緒にリポジトリで管理する
  • Ansibleは次の2パターンで実行する
    1. ローカルからリモートのサーバへSSHへ実行する(ローカルからファイルをコピー)
    2. サーバ上でPlaybookをチェックアウトしてサーバ内でコピーする

できれば同じPlaybookでできたら嬉しいですね。いいか、俺は面倒が嫌いなんだ。

検証の方法

次のような方法で検証しました。

  1. ローカル→ローカルでファイルをコピーするPlaybookを作る
  2. 1.のPlaybookをリモートのホストに対して実行する

Playbook

Playbookはcopy moduleのドキュメントを参照して素直に下記のように記述しました。

- hosts: targets
  become: yes
  tasks:
  - name: copy files
    copy:
      src: "{{ item }}"
      dest: /tmp/copy_here/
      owner: root
      group: root
      mode: 0644
    with_fileglob:
    - ./files/*.txt

またインベントリファイルは下記の通りです。

[targets]
localhost ansible_connection=local
<リモートサーバのホスト名>  ansible_ssh_private_key_file=~/.ssh/your_key_is_here.pem

結果

下記の通り2つのホスト上でコピーが行えました。

ec2-user@ip-172-31-22-225 copy_ansible]$ ansible-playbook -i hosts copy_task.yml

PLAY [targets] *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *****************************************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost]
ok: [172.31.21.85]

TASK [copy files] **********************************************************************************************************************************************************************************************************************************************************************************************************************************************************
changed: [localhost] => (item=/home/ec2-user/copy_ansible/./files/hoge.txt)
changed: [172.31.21.85] => (item=/home/ec2-user/copy_ansible/./files/hoge.txt)
changed: [localhost] => (item=/home/ec2-user/copy_ansible/./files/fuga.txt)
changed: [172.31.21.85] => (item=/home/ec2-user/copy_ansible/./files/fuga.txt)

PLAY RECAP *****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
172.31.21.85               : ok=2    changed=1    unreachable=0    failed=0
localhost                  : ok=2    changed=1    unreachable=0    failed=0

ローカルで確認

[ec2-user@ip-172-31-22-225 copy_ansible]$ ls -l /tmp/copy_here/
合計 0
-rw-r--r-- 1 root root 0  7月 12 07:47 fuga.txt
-rw-r--r-- 1 root root 0  7月 12 07:47 hoge.txt

リモートで確認

[ec2-user@ip-172-31-22-225 copy_ansible]$ ssh -i ~/.ssh/ec2-default.pem ec2-user@172.31.21.85 "ls -l /tmp/copy_here/"
合計 0
-rw-r--r-- 1 root root 0  7月 12 07:47 fuga.txt
-rw-r--r-- 1 root root 0  7月 12 07:47 hoge.txt

最後に

世に平穏のあらんことを