尝试使用Terraform管理Splunk Enterprise的资源【Splunk】

首先

Splunk是一种适用于各种数据的集成日志平台。通过使用名为SPL的搜索语言,可以从日志中提取所需的信息,并利用命令进行聚合处理和数据处理等多种操作。

如果您想更加详细地了解Splunk本身或各种命令的详细说明,请参考Cheat Sheet或官方文档。日本语版本的手册也非常丰富。

试试看

参考Splunk的博客《使用Terraform作为代码管理Splunk基础架构》,将尝试使用Terraform来管理本地环境Splunk的资源。
要创建的具体资源如下所示。

    • ロール

 

    • ユーザー

 

    • インデックス

 

    ダッシュボード

除了仪表板之外,其他几乎都是按照Splunk博客上的相同步骤进行的。

利用环境

这次我在本地环境安装了Splunk的免费试用版,并在该环境中尝试了一下。
免费试用版在数据导入量上有一天最多500MB的限制,但可以免费使用Splunk的各种功能60天。
60天后,可以选择应用付费版本的许可证,否则可以转换到免费版的许可证,但可操作的功能将显著减少。

前期准备

    • ローカル環境にSplunkをインストール(こちらの手順は割愛)

ブラウザからhttp://localhost:8000/でインストール時に作成したadminアカウントでローカルのSplunkに接続できることを確認

TerraformのSplunk ProviderのRequirementsがv0.12のため手元の環境をtfenvを利用して手元のTerraformをv0.12以上に設定

# terraformのVersion管理の補助ツールであるtfenvをインストール
$ brew install tfenv

# インストール可能なversionを確認
$ tfenv list-remote

# 任意のversionをインストール
$ tfenv install <任意のVersion>

# 利用するTerraformのversionを設定
$ tfenv use <任意のVersion>

    適当なSampleデータが欲しいのでこれもSplunkのチュートリアルからzipを手元にダウンロード

使用Terraform在Splunk上创建资源。

如果准备工作完成,我们会尝试使用Terraform来管理Splunk的资源。

使用Terraform与Splunk建立连接

我們創建一個用於Terraform作業的目錄(本例使用splunk),然後進入該作業目錄並創建main.tf。

$ mkdir ./splunk
$ cd ./splunk
$ touch main.tf

在创建的main.tf文件中,写入提供者信息。

terraform {
  required_providers {
    splunk = {
      source = "splunk/splunk"
      version = "1.4.17"
    }
  }
}

provider "splunk" {
  url                  = "localhost:8089"
  username             = "<Splunkインストール時に設定したAdminアカウント>"
  password             = "<Splunkインストール時に設定したAdminパスワード>"
  insecure_skip_verify = true
}

确认初始化作业目录命令成功执行。

$ terraform init

如果显示“Terraform已成功初始化!”则表示已完成。

执行计划

$ terraform fmt
$ terraform plan

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are
needed.

在这种状态下,由于尚未使用Terraform管理资源,因此会显示”没有更改”。

与用户的索引创建

我們將在 main.tf 中加入以下內容以創建 Splunk 的測試用戶、角色和索引。


// Role
resource "splunk_authorization_roles" "role01" {
  name           = "terraform-user01-role"
  default_app    = "search"
  imported_roles = ["power", "user"]
  capabilities   = ["accelerate_datamodel", "change_authentication", "restart_splunkd"]
}

// User
resource "splunk_authentication_users" "user01" {
  name              = "user01"
  email             = "sample@sample.sample"
  password          = "<任意のパスワード>"
  force_change_pass = false
  roles             = ["terraform-user01-role"]
  depends_on = [
    splunk_authorization_roles.role01
  ]
}

// Index
resource "splunk_indexes" "index01" {
  name                   = "index01"
  max_total_data_size_mb = 1000000
}

我已经描述了用于测试的角色和用户、索引的资源定义。在这个状态下执行计划,如果没有问题就应用它。

$ terraform fmt

# Plan実行、Plan: 3 to add, 0 to change, 0 to destroy.と表示されればOK
$ terraform plan

# Apply実行、Apply complete! Resources: 3 added, 0 changed, 0 destroyed.と表示されればOK
$ terraform apply -auto-approve
image.png
image.png

将测试数据插入已创建的索引中。

测试数据可以是任何数据,但这次我们决定使用Splunk教程中使用的数据。

image.png
index="index01" host="test" 
| timechart span=1h count
image.png

我想用Terraform创建一个使用这个SPL的仪表板。

创建仪表板

用户和索引的创建基本上是根据Splunk的博客实施的,但是既然来了,我们也会尝试创建仪表板。
仪表板可以在Terraform的splunk提供者中使用”splunk_data_ui_views”进行定义。
参数:需要在eai:data中使用XML定义仪表板,但是从零开始构建仪表板的XML对我来说有点困难,所以这次我决定手动创建一次仪表板,在Splunk的GUI上查看源代码的XML,直接复用它。

手动创建原始仪表板并复制XML。

image.png
image.png

在主要配置文件 main.tf 中添加 splunk_data_ui_views。

resource "splunk_data_ui_views" "terraform_operations" {
  name     = "Terraform"
  eai_data = <<-EOT
<form version="1.1">
  <label>test-terraform</label>
  <fieldset submitButton="false">
    <input type="time" token="field1">
      <label></label>
      <default>
        <earliest>0</earliest>
        <latest></latest>
      </default>
    </input>
  </fieldset>
  <row>
    <panel>
      <chart>
        <search>
          <query>index=index01 host=test | timechart span=1h count</query>
          <earliest>$field1.earliest$</earliest>
          <latest>$field1.latest$</latest>
        </search>
        <option name="charting.chart">column</option>
        <option name="charting.drilldown">none</option>
        <option name="refresh.display">progressbar</option>
      </chart>
    </panel>
  </row>
  <row>
    <panel>
      <chart>
        <search>
          <query>index=index01 host=test sourcetype=access_combined_wcookie | top categoryId</query>
          <earliest>$field1.earliest$</earliest>
          <latest>$field1.latest$</latest>
        </search>
        <option name="charting.chart">pie</option>
        <option name="charting.drilldown">none</option>
      </chart>
    </panel>
  </row>
</form>
  EOT
  acl {
    app     = "search"
    owner   = "admin"
    sharing = "app"
  }
}

我将先前复制的XML粘贴到Argument:eai:data中。为了避免重复,我进行了一些label的更改。
并且为了在应用内共享,我定义了acl并将此共享对象设置为app。如果不特别指定,它将成为私有仪表板。

我们会在这种情况下制定计划并进行申请。

$ terraform fmt

# Plan実行、Plan: 1 to add, 0 to change, 0 to destroy.と表示されればOK
$ terraform plan

# Apply実行、Apply complete! Resources: 1 added, 0 changed, 0 destroyed.と表示されればOK
$ terraform apply -auto-approve
image.png
image.png

结束

这次我们试着使用Terraform来管理Splunk Enterprise本地环境的一些资源。
除了我们创建的这些资源外,似乎还可以使用Terraform来管理各种不同的资源,例如警报等。
可以利用GitHub等工具,实现状态的差异追踪和便于审查的环境配置,还可以与CI/CD相结合进行更好的利用。
虽然此次我们在Splunk Enterprise上进行了验证,但我也希望今后能够验证Splunk Cloud的情况。

请参考以下文章。

    • Manage Your Splunk Infrastructure as Code Using Terraform

 

    • https://registry.terraform.io/providers/splunk/splunk/latest

 

    https://github.com/splunk/terraform-provider-splunk
广告
将在 10 秒后关闭
bannerAds