AnsibleをGitHubからSSM経由で実行する

最近Ansibleを使うようになってきました。 Ansibleを使う際には、該当のサーバーのSSHポートを開けて置く必要があります。 ローカルマシン→EC2 の場合は特に問題はないですが、GitHubActionsのようなCIツールから実行するにはどうすればよいでしょうか。IPが変わるので、セキュリティグループを全開放にするのもやりたくないですよね

ここでSSMを利用してAnsibleを実行していきます。

ベストプラクティスにそった構成でも実行できるので、特別なことをする必要はありません。

大事なこと

大事なことなのですが、Ansibleのファイルたちはzipにまとめる必要があるようです。
最初まとめないで実行して苦労しました。

Ansible

ファイル構成は以下です とりあえずテストで、gitとvimのインストールをしています

ansible
├── roles
│   └── common
│       ├── handlers
│       ├── tasks
│       │   ├── install_git.yml
│       │   ├── install_vim.yml
│       │   └── main.yml
│       └── template
└── site.yml

handlerstemplateは空ですが、そのうち使いそうな気がするのでこのままにしておきます。

site.yml

---
- name: apply Initial setting
  hosts: localhost

  roles:
    - common

main.yml

---
- include: install_git.yml
- include: install_vim.yml

install_git.yml

---
- name: install git
  become: yes
  yum: name=git

install_vim.yml

---
- name: install vim
  become: yes
  yum: name=vim

SSM実行

AWSコンソールからも実行できますが、CIを意識するために aws cli で実行します GitHubリポジトリがシークレットの場合は別途SSMのパラメータを設定する必要があります。 詳細はこちら => https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/parameter-create-console.html

aws ssm --profile {{profile.name}} send-command \
 --document-name "AWS-ApplyAnsiblePlaybooks" \
 --document-version "1" \
 --targets '[{"Key":"InstanceIds","Values":["i-xxxxxxxxxxxx"]}]' \
  --parameters '{"SourceType":["GitHub"],"SourceInfo":["{ \"owner\": \"username\", \"repository\": \"repo.name\",  \"getOptions\": \"branch:main\", \"path\": \"ansible.zip\", \"tokenInfo\": \"{{ssm-secure:myTokenName}}\" }"],"InstallDependencies":["True"],"PlaybookFile":["ansible/site.yml"],"ExtraVariables":["SSM=True"],"Check":["False"],"Verbose":["-v"],"TimeoutSeconds":["3600"]}' \
 --timeout-seconds 600 \
 --max-concurrency "50" \
 --max-errors "0" \
 --region ap-northeast-1

結果

SSMのコンソールからoutputが見れます 一部抜粋したものを載せます

PLAY [apply Initial setting] ***************************************************

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

TASK [common : install git] ****************************************************
changed: [localhost] => {"changed": true, "changes": {"installed": ["git"]}, "msg": "", "rc": 0, "results": ["Loaded plugins: extras_suggestions, langpacks, priorities, update-motd\n216 packages excluded due to repository priority protections\nResolving Dependencies\n--> Running transaction check\n---> Package git.x86_64 0:2.32.0-1.amzn2.0.1 will be installed\n--> Processing Dependency: perl-Git = 2.32.0-1.amzn2.0.1 for package: git-2.32.0-1.amzn2.0.1.x86_64\n--> Processing Dependency: git-core-doc = 2.32.0-1.amzn2.0.1 for package: git-2.32.0-1.amzn2.0.1.x86_64\n--> Processing Dependency: git-core = 2.32.0-1.amzn2.0.1 for package: git-2.32.0-1.amzn2.0.1.x86_64\n--> Processing Dependency: emacs-filesystem >= 27.1 for package: git-2.32.0-1.amzn2.0.1.x86_64\n--> Processing Dependency: perl(Term::ReadKey) for package: git-2.32.0-1.amzn2.0.1.x86_64\n--> Processing Dependency: perl(Git::I18N) for package: git-2.32.0-1.amzn2.0.1.x86_64\n--> Processing Dependency: perl(Git) for package: git-2.32.0-1.amzn2.0.1.x86_64\n--> Running transaction check\n---> Package emacs-filesystem.noarch 1:27.2-4.amzn2.0.1 will be installed\n---> Package git-core.x86_64 0:2.32.0-1.amzn2.0.1 will be installed\n---> Package git-core-doc.noarch 0:2.32.0-1.amzn2.0.1 will be installed\n---> Package perl-Git.noarch 0:2.32.0-1.amzn2.0.1 will be installed\n--> Processing Dependency: perl(Error) for package: perl-Git-2.32.0-1.amzn2.0.1.noarch\n---> Package perl-TermReadKey.x86_64 0:2.30-20.amzn2.0.2 will be installed\n--> Running transaction check\n---> Package perl-Error.noarch 1:0.17020-2.amzn2 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package              Arch       Version                   Repository      Size\n================================================================================\nInstalling:\n git                  x86_64     2.32.0-1.amzn2.0.1        amzn2-core     126 k\nInstalling for dependencies:\n emacs-filesystem     noarch     1:27.2-4.amzn2.0.1        amzn2-core      67 k\n git-core             x86_64     2.32.0-1.amzn2.0.1        amzn2-core     4.8 M\n git-core-doc         noarch     2.32.0-1.amzn2.0.1        amzn2-core     2.7 M\n perl-Error           noarch     1:0.17020-2.amzn2         amzn2-core      32 k\n perl-Git             noarch     2.32.0-1.amzn2.0.1        amzn2-core      43 k\n perl-TermReadKey     x86_64     2.30-20.amzn2.0.2         amzn2-core      31 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package (+6 Dependent packages)\n\nTotal download size: 7.8 M\nInstalled size: 38 M\nDownloading packages:\n--------------------------------------------------------------------------------\nTotal                                               30 MB/s | 7.8 MB  00:00     \nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : git-core-2.32.0-1.amzn2.0.1.x86_64                           1/7 \n  Installing : git-core-doc-2.32.0-1.amzn2.0.1.noarch                       2/7 \n  Installing : 1:perl-Error-0.17020-2.amzn2.noarch                          3/7 \n  Installing : 1:emacs-filesystem-27.2-4.amzn2.0.1.noarch                   4/7 \n  Installing : perl-TermReadKey-2.30-20.amzn2.0.2.x86_64                    5/7 \n  Installing : perl-Git-2.32.0-1.amzn2.0.1.noarch                           6/7 \n  Installing : git-2.32.0-1.amzn2.0.1.x86_64                                7/7 \n  Verifying  : perl-TermReadKey-2.30-20.amzn2.0.2.x86_64                    1/7 \n  Verifying  : git-core-doc-2.32.0-1.amzn2.0.1.noarch                       2/7 \n  Verifying  : perl-Git-2.32.0-1.amzn2.0.1.noarch                           3/7 \n  Verifying  : 1:emacs-filesystem-27.2-4.amzn2.0.1.noarch                   4/7 \n  Verifying  : git-2.32.0-1.amzn2.0.1.x86_64                                5/7 \n  Verifying  : git-core-2.32.0-1.amzn2.0.1.x86_64                           6/7 \n  Verifying  : 1:perl-Error-0.17020-2.amzn2.noarch                          7/7 \n\nInstalled:\n  git.x86_64 0:2.32.0-1.amzn2.0.1                                               \n\nDependency Installed:\n  emacs-filesystem.noarch 1:27.2-4.amzn2.0.1                                    \n  git-core.x86_64 0:2.32.0-1.amzn2.0.1                                          \n  git-core-doc.noarch 0:2.32.0-1.amzn2.0.1                                      \n  perl-Error.noarch 1:0.17020-2.amzn2                                           \n  perl-Git.noarch 0:2.32.0-1.amzn2.0.1                                          \n  perl-TermReadKey.x86_64 0:2.30-20.amzn2.0.2                                   \n\nComplete!\n"]}

TASK [common : install vim] ****************************************************
ok: [localhost] => {"changed": false, "msg": "", "rc": 0, "results": ["2:vim-enhanced-8.1.1602-1.amzn2.x86_64 providing vim is already installed"]}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

おわりに

これとGitHubActionsを組み合わせて実行したい…! いちいちzip作ってアップロードとかしたくないですよね さらなる自動化に向けてがんばります