ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

AnsibleでEC2にSSH接続してファイルをアップロードする

仕事でAnsibleを少し触る機会があったのですが、初見でさっぱり分からなかったので
復習を兼ねてインストールからやってみました。

タイトルにも書きましたが、やったことは

  • Ansibleにて既存のEC2にSSH接続する
  • SSH経由でEC2内にフォルダを作る
  • 同じくSSH経由でファイルをアップロードする

です。

以下、やったことのメモとなります。

Ansibleのインストール

ローカルマシンにAnsibleをインストールします。私はWSLのUbuntuを使ったので、公式の以下の手順を参考にしました。
https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#latest-releases-via-apt-ubuntu

Ansibleはエージェントレスで動き、先にも書いたようにSSHで接続して操作を行うため、EC2に何かをインストールする必要はありません。

プロジェクト作成

ローカルの任意のフォルダをプロジェクトフォルダとし、以下のファイルを用意します。

  • ssh_config ・・・ SSHでの接続先を定義
  • inventory.ini ・・・ ssh_configで定義した接続先を指定
  • ansible.cnf ・・・ SSHの接続オプションを指定
  • sample.yml ・・・ 実行するタスク(今回はフォルダの作成、ファイルのアップロード)を定義
  • test.txt ・・・ アップロードするファイル

以下、各ファイルについてです。

ssh_config

SSHの接続先を定義します。今回はEC2にキーペアで接続しました。
こんな感じとなります。(~/.ssh/configを使ったSSH接続と同じ内容です)

Host my-ec2
  HostName ec2-xx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
  User ec2-user
  IdentityFile your_pem_fullpath.pem
  ServerAliveInterval 15

用意したらこのファイル単体でSSH接続できるかを確認します。

$ ssh -F ssh_config my-ec2

inventory.ini

ssh_configで定義した接続先を指定します。

[mysection]
my-ec2

ansible.cnf

SSHの接続オプションを指定します。

ssh_args = -F ssh_config

sample.yml

実行するタスクを定義します。今回は

  • /home/ec2-user に workフォルダを作成
  • workフォルダにローカルのtext.txtをアップロード

を行っています。

- hosts: my-ec2
  tasks:
    - name: make dir
      file:
        path: /home/ec2-user/work
        state: directory
        mode: 0755
    - name: file copy
      copy:
        src: ./test.txt
        dest: /home/ec2-user/work/
        mode: 0755

test.txt

特にこだわりはないです。適当なテキストファイルを用意します。

実行

ここまで用意したら実行してみます。
AnsibleはDry Runが可能なので、まずはDry Runで確認してみます。

$ ansible-playbook ./sample.yml -i inventory.ini --check

「--check」を付けることでDry Runとなります。
本番実行は以下のようになります。

$ ansible-playbook ./sample.yml -i inventory.ini