AWS Systems Manager Run Command を利用した Ansibleの実行
こんにちは、tkgです。
AWS環境で多数のEC2インスタンスにミドルウェアをインストールする時、オートスケーリング環境であれば最初に手法として上げられるのはゴールデンイメージの更新になるかと思います。
しかし、あまり効果的に利用できない場合や、オートスケーリングできない環境もあるかと思いますので、その時に利用できそうなAWS Systems Manager Run CommandでのAnsibleの実行の手法を試してみました。
今回利用するAnsibleのコード
今回は New Relic のAgentをインストール、Configの書き換えを行うものとしました。
※ New Relic公式では ansible-galaxyを使った手法が提供されています。
様々な環境に利用するケースで利用が難しいと判断したため、CLIインストールの手順をなぞった形のAnsible Playbookを作成しました。
- hosts: localhost become: yes environment: NEW_RELIC_ACCOUNT_ID: "{{ account_id }}" NEW_RELIC_API_KEY: "{{ license_key }}" vars: instance_name: "{{ lookup('url', 'http://169.254.169.254/latest/meta-data/tags/instance/Name') }}" tasks: - name: Check New Relic agent ansible.builtin.stat: path: /usr/local/bin/newrelic register: nr_installed - name: Get install script ansible.builtin.uri: url: https://download.newrelic.com/install/newrelic-cli/scripts/install.sh return_content: yes register: nrinstall when: not nr_installed.stat.exists - name: Run install script ansible.builtin.shell: cmd: "{{ nrinstall.content }}" when: - not nr_installed.stat.exists - name: Install New Relic ansible.builtin.shell: cmd: /usr/local/bin/newrelic install -y when: not nr_installed.stat.exists - name: Configuration update ansible.builtin.blockinfile: path: /etc/newrelic-infra.yml block: | metrics_system_sample_rate: 180 metrics_process_sample_rate: 180 metrics_storage_sample_rate: 180 metrics_network_sample_rate: 180 display_name: {{ instance_name }} - name: Restart New Relic agent ansible.builtin.service: name: newrelic-infra state: restarted
こちらのplaybookは、New Relic Agentがインストールされていなかったらインストールを実施、その後Configの修正を行う というものとしています。
前提となる設定
- AWS EC2の インスタンスメタデータのタグを許可する
- EC2からAnsible Playbookを配置しているS3へのアクセス権限
- 実際の運用ではGitHubなどバージョン管理ツールのほうが好ましいですが、今回は検証のためS3からplaybookを取得します。
AWS Systems Manager Run Command で実行する
それでは、上記playbookを用いて Ansibleを各サーバー上で実行していきます。
- 任意のS3にAnsible Playbookをアップロードする
Ansibleをzipで固めてS3にアップロードします。
-
Run Commandを実行する
それでは実際に Run Commandを実行します。
2-1. コマンド実行画面に移動し、AWS-ApplyAnsiblePlaybooks
を選択します。
2-2. コマンドパラメータは下記の通りとします。
Source Type: S3
Source Info: { “Path”: “https://[S3の名前].s3.ap-northeast-1.amazonaws.com/[ファイル配置先]” }
Install Dependencies: True
Playbook File: playbook.yml (zipで固めた中のymlの名前)
Extra Variables: SSM=Ture account_id=[New RelicのアカウントID] license_key=[NRAKから始まるapi-key]
それ以降: 初期値
2-3. ターゲットの設定は任意で設定します。
今回はインストール対象サーバーにEnvironment:dev
のタグを付与していたのでそちらを指定します。
Addボタンを押し忘れないようにしましょう。
その他、設定は任意で設定します。
2-4. コマンドを実行する
設定が完了したら右下の実行ボタンで実行します。すると処理が開始されます。
更新ボタンにて、適宜ステータスが更新可能です。
少しするとステータスが成功になりました。
インスタンスIDをクリックすると、各種出力内容が表示可能でした。
これらを利用してデバッグなども可能そうです。
おわりに
今回は起動したばかりのサーバーでAnsibleがインストールされていませんでしたので、
Install Dependencies オプションで Trueにした通り、 Ansibleのインストールが実行されます。
そのため少し時間がかかりましたが、Ansibleの実行環境ごと作成されるので、既存環境へのデプロイとしては素早い実行が可能でした。
また、Ansibleでべき等性を考慮したコードにすることで、すべての環境で同じ状態とできることもメリットかなと感じます。
IaCをうまく利用して、運用効率を上げていきたいですね。
テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!
Follow @twitter2016年入社のインフラエンジニアです。 写真が趣味。防湿庫からはレンズが生え、押入れには機材が生えます。 2D/3DCG方面に触れていた時期もありました。
Recommends
こちらもおすすめ
-
AWS CodeシリーズでAnsible自動実行環境を構築する
2024.2.26
Special Topics
注目記事はこちら
データ分析入門
これから始めるBigQuery基礎知識
2024.02.28
AWSの料金が 10 %割引になる!
『AWSの請求代行リセールサービス』
2024.07.16