るいすときのこの物語

オタクエンジニアの雑記

Ansibleのs3モジュールを使ってディレクトリごとアップロードする


梅雨の季節がやって参りました。 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