梅雨の季節がやって参りました。
Ansibleのs3モジュールを使ってディレクトリごとアップロードする方法を覚え書きとして。

 

認証情報を環境変数に入れておく

Ansibleで使うAWSの認証情報はPlaybookに書き込むか
環境変数を使うかで選べます。

万が一のことを考えて環境変数で管理したほうが良いと思います。

export AWS_ACCESS_KEY="AK..."
export AWS_SECRET_KEY="i8/..."

 

ファイルのアップロード

- name: Upload systemd script to s3
s3:
bucket: BUCKET_NAME
object: /script/startup-api.service
src: /tmp/startup-api.service
mode: put
overwrite: true
delegate_to: 127.0.0.1

 

ディレクトリごとアップロード(Ansible 2.3以降)

- name: Upload source code to s3
s3_sync:
bucket: BUCKET_NAME
key_prefix: source/
file_root: /tmp/sourcecode
delegate_to: 127.0.0.1

key_prefixがないとバケット直下にファイルが展開されちゃうので
key_prefixを設定しておきます。

こうすると
BUCKET_NAME/source/<sourcecodeの中身> ってなる。

 

boto required for this module

Ansibleを実行するホストでAWSの操作をする場合、
botoとかいうPythonのモジュールをインストールします。
加えてdelegate_to: 127.0.0.1をタスクに追加しないとリモート先で実行されてしまって
エラーが消えないのでご注意を。

逆にリモート先で行うならリモート先で実行します。

yum で Ansible をインストールした場合
$ sudo yum install python-boto -y
pip で Ansible をインストールした場合(多分いける)
$ sudo pip install boto boto3

 

それでも解決できない場合

引数にansible_python_interpreterをつけて実行する

ansible-playbook -i production/hosts api.yml --extra-vars "ansible_python_interpreter=`(which python)" --user root --ask-pass

hostsファイルにansible_python_interpreterをつける

[api]
api.luis.local ansible_python_interpreter=/usr/bin/python