こんにちわ、Mitsuoです。

構成管理ツールであるAnsibleは、サーバに対する設定をプレイブックと呼ばれるYAML形式のファイルを用いて自動化する事が可能です。
プレイブックの中でロールと呼ばれる実行するタスクを定義することでインフラ設定を行います。
プログラミングの知識が不要でコーディグに疎いインフラエンジニアでも使いやすいツールではあるのですが、ゼロベースで書くと中々に試行錯誤が必要です。
出来れば有識者のナレッジを用いて出来るだけ楽にAnsibleを活用したいですよね。
そう言った悩みを解決する手段の一つである「Ansible Galaxy」について紹介します。

対象読者

Ansibleの概念を知っている方
※ プレイブックやロールとは何か、どのように実行するか程度で良いです
Ansibleが何かは、RedHatのCustomer Portalにも記載がありますので参考ください。

Ansible Galaxyとは?

Ansible Galaxyとは、Ansibleのコミュニティが開発したロールを共有するWebサービスになります。
また、現在は、コレクション(プレイブック、ロール、プラグインをパッケージ化したもの)の共有も可能です。
ざっくりいうと「Ansibleの有識者が作ったロールを無償で使う事が出来るサイト」です。
ただし、Ansible Galaxyに登録すれば、ロールは共有出来てしまいます。そのため、ロールの動作保証は利用者自身で行う必要があります。

詳細については、以下のURLを参考ください。
Galaxy ユーザガイド
Galaxy 公式

前提条件

  • CLIでNew Relic Agentのインストールを行います。
  • 具体的な手順や制約については、New Relic社によって公開されているGitHubのリポジトリを参考にしてください。
  • 実行する環境でAnsibleをインストールしておく必要があります。
  • ansible-galaxyコマンドは、Ansibleにバンドルされており、バージョンは1.4.2以降であれば別途対応が不要でコマンド利用できるようです。
  • Ansibleを実行する環境は人によって異なるため、全てのパターンに適応した手順にはなっていないことをご留意ください。
  • コレクションのインストール方法やTarboallなどを解説に含みません。

インストール手順

実際の手順を以下に示していきます。

コマンドの書式

ansible-galaxyのインストールコマンド書式は以下の通りです。

ansible-galaxy install namespace.role_name

namespaceがロールのオーナー、role_nameがロール名です。
今回でいうとnewrelicがnamespaceで、new-relicがrole_nameです。

上記のスクリーンショットはGalaxyのWEBサイトでnewrelic.newrelic-infraを検索したものです。

ロールのインストール

以下のコマンドを実行します。

ansible-galaxy install newrelic.newrelic-infra -p `Roleディレクトリまでの相対パスあるいは絶対パス`

pオプションを用いない場合は、手動でRoleディレクトリ配下に配置する必要があります。

ダウンロード後にTreeコマンドを実行した結果は以下のようになります。

.
└── newrelic.newrelic-infra
    ├── CHANGELOG.md
    ├── CODE_OF_CONDUCT.md
    ├── CONTRIBUTING.md
    ├── LICENSE
    ├── LICENSE.md
    ├── README.md
    ├── defaults
    │   └── main.yml
    ├── handlers
    │   └── main.yml
    ├── library
    │   └── merge_yaml.py
    ├── meta
    │   └── main.yml
    ├── molecule
    │   ├── configure
    │   │   ├── INSTALL.rst
    │   │   ├── converge.yml
    │   │   ├── create.yml
    │   │   ├── destroy.yml
    │   │   ├── fixtures
    │   │   │   └── newrelic-infra-expected.yml
    │   │   ├── molecule.yml
    │   │   └── verify.yml
    │   ├── default
    │   │   ├── Dockerfile.centos7
    │   │   ├── Dockerfile.centos8
    │   │   ├── Dockerfile.oraclelinux8
    │   │   ├── Dockerfile.ub1804
    │   │   ├── Dockerfile.ub2004
    │   │   ├── INSTALL.rst
    │   │   ├── converge.yml
    │   │   ├── fixtures
    │   │   │   └── newrelic-infra-expected.yml
    │   │   ├── molecule.yml
    │   │   └── verify.yml
    │   └── targz
    │       ├── INSTALL.rst
    │       ├── converge.yml
    │       ├── create.yml
    │       ├── destroy.yml
    │       ├── fixtures
    │       │   └── newrelic-infra-expected.yml
    │       ├── molecule.yml
    │       └── verify.yml
    ├── requirements.txt
    ├── requirements.yml
    ├── tasks
    │   ├── configure_agent.yml
    │   ├── install_dist_pkgs.yml
    │   ├── install_integrations_pkgs.yml
    │   ├── install_targz.yml
    │   ├── main.yml
    │   ├── setup_agent_service.yml
    │   └── setup_logging.yml
    ├── templates
    │   ├── newrelic-infra.yml.j2
    │   └── newrelic-logging.yml.j2
    └── vars
        └── main.yml

エージェント用ロールを実行するためのプレイブック作成

次にnewrelic.newrelic-infraロールを呼び出すために以下のプレイブックを作成します。

ファイル名:newrelic.yaml

- name: configure newrelic agent
  hosts: `対象ホストを指定`
  become: yes
  roles:
    - name: newrelic.newrelic-infra
      vars:
        nrinfragent_config:
          license_key: `NewRelicにおける対象アカウントのライセンスキー(INGEST-LICENSE)`

nrinfragent_configが必須項目になります。
その中でlicense_keyを指定します。

Playbookの実行

以下コマンドを実行する。

ansible-playbook -i `Inventory hostsファイルのパス` playbookのyamlファイルのパス

Ansibleの諸設定が適切にされており、対象のサーバへの疎通が出来ればコマンドが実行されエージェントのインストールが始まります。

サーバ側のプロセス確認

サーバ上にインストールしたエージェントの状態を確認します。

systemctl status newrelic-infra.service 
● newrelic-infra.service - New Relic Infrastructure Agent
   Loaded: loaded (/etc/systemd/system/newrelic-infra.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2024-02-04 11:34:46 UTC; 1h 35min ago
 Main PID: 4498 (newrelic-infra-)
   Memory: 21.9M (limit: 1.0G)
   CGroup: /system.slice/newrelic-infra.service
           ├─4498 /usr/bin/newrelic-infra-service
           └─4504 /usr/bin/newrelic-infra

エージェントがインストールされていますね!

最後に

Ansible Galaxyに有識者の方が作ったロールが数多く公開されており、様々な知見を得ることが出来ます。
ゼロベースで作成するのではなく、雛形として参考に出来るようであれば活用していきましょう。
また、IaCツールのTerraformと同様にAnsibleにも、ベストプラクティスを意識したロールも多くあり、なぜこのようなディレクトリ構成になっているかを考えるだけでも理解に繋がると思います。

それでは、Mitsuoでした!

補足事項

New Relicのライセンスキーの参照方法

筆者は、Full platform userの権限を有しており、その前提で書いていることをご留意ください。

  • ライセンスキーはNew RelicのAPIキー一覧から確認可能です。
  • 定期的にコンソール画面のレイアウトが変わるため正しい確認方法は公式ドキュメントのNew Relic API keysを参考にしてください。
  • 2024年2月現在では、こちらからAPI Key一覧に飛ぶ事が出来ます。ここで検索をかけてライセンスキーを調べてください。

設定ファイル(newrelic-infra.yml)について

  • 設定ファイルnewrelic-infra.ymlは、対象サーバがLinuxOSの場合、デフォルトでetc配下に格納されます。
  • playbookのyamlでnrinfragent_config_fileを指定する事で設定ファイルの格納先を変更する事が可能です。
  • 同様にyaml内のnrinfragent_config内で設定を行うと、デフォルトの設定を上書きする事が出来ます。
  • エージェントに対する設定の優先順位は、環境変数、Agent Config File、Agent Defaltsの順です。

詳細については、New Relic公式ドキュメントのConfigure the infrastructure agentを参考にしてください。

参考資料

RedHat
第3章 Ansible の概念について
Ansible
ベストプラクティス
Ansible Galaxy
Galaxy ユーザガイド
Galaxy 公式
newrelic.newrelic-infra
New Relic
infrastructure-agent-ansible(Git Hub)
New Relic API keys
Configure the infrastructure agent