RPM包构建【loki/promtail.rpm】

版本:3.0.0

编译

git clone -b v3.0.0 https://github.com/grafana/loki.git
 
cd loki
 
yum install -y systemd-devel
go build --tags=promtail_journal_enabled ./clients/cmd/promtail
 
#./promtail
#./tools/packaging/promtail.service
#./README.md
#./LICENSE

打包

PACKAGE_DIR=promtail-3.0.0
mkdir                               ${PACKAGE_DIR}
mv promtail                         ${PACKAGE_DIR}
mv tools/packaging/promtail.service ${PACKAGE_DIR}
mv README.md                        ${PACKAGE_DIR}
mv LICENSE                          ${PACKAGE_DIR}
  
cat << "EOF" > ${PACKAGE_DIR}/config.yml
server:
  http_listen_port: 9080
  grpc_listen_port: 0
 
positions:
  filename: /var/lib/promtail/positions.yaml
 
clients:
  - url: http://127.0.0.1:3100/loki/api/v1/push
 
scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      job: varlogs
      host: localhost
      agent: promtail
      __path__: /var/log/*log
 
- job_name: nginx
  static_configs:
  - targets:
      - localhost
    labels:
      job: nginx
      host: localhost
      agent: promtail
      __path__: /var/log/nginx/*log
EOF
 
tar -zcvf ${PACKAGE_DIR}.tgz ${PACKAGE_DIR}

Rpmbuild

which rpmbuild || dnf -y install rpm-build
 
mkdir -p /root/rpmbuild/SOURCES/
mv ${PACKAGE_DIR}.tgz /root/rpmbuild/SOURCES/
cat << "EOF" > promtail.spec
%define debug_package %{nil}
  
Name: promtail
Version: 3.0.0
Release: 1%{?dist}
Summary: Loki Promtail for Linux-x86_64
  
URL: https://github.com/grafana/loki
  
Source: promtail-3.0.0.tgz
  
License: MIT
  
%description
Loki Promtail for linux-x86_64
  
%prep
%setup -q
 
%pre
getent group promtail >/dev/null || groupadd -f promtail
getent passwd promtail >/dev/null || \
    useradd -r -g promtail -d /var/lib/promtail -s /sbin/nologin \
    -c "promtail daemon" promtail
exit 0
  
%post
chown -R promtail:promtail /var/lib/promtail
 
%preun
systemctl stop promtail
 
%postun
systemctl daemon-reload
userdel promtail
 
%build
  
%install
install -m 755 -d %{buildroot}%{_bindir}
install -m 755 -d %{buildroot}/usr/lib/systemd/system/
install -m 755 -d %{buildroot}/var/lib/promtail/
 
install -Dm755 promtail %{buildroot}/usr/bin/promtail
install -Dm644 config.yml %{buildroot}/etc/promtail/config.yml
install -Dm644 promtail.service %{buildroot}/usr/lib/systemd/system/promtail.service
 
%files
/var/lib/promtail/
/usr/lib/systemd/system/promtail.service
/usr/bin/promtail
/etc/promtail/config.yml
  
%doc README.md LICENSE
EOF

构建

rpmbuild -bb promtail.spec
 
ls -l /root/rpmbuild/RPMS/x86_64/promtail-3.0.0-1.el9.x86_64.rpm
<think>我们面对的是一个Promtail配置文件解析错误,具体错误信息是:`yaml: line 13: did not find expected key`。 同时,用户还提到了`-config.expand-env=true`标志,这个标志用于在解析配置文件时展开环境变量。 根据引用[1][2][4]中的错误信息,这类错误通常是由于YAML格式问题引起的,特别是: - 缩进不正确(使用了错误的空格数) - 冒号后面没有空格 - 键名重复或错误 - 使用了制表符代替空格 - 多行字符串的格式不正确 由于错误指向第13行,我们应该首先检查第13行及其附近行的语法。 另外,如果使用了`-config.expand-env=true`,那么配置文件中可以使用环境变量,如`${VAR}`或`$VAR`。这时需要确保环境变量引用没有破坏YAML结构。 解决步骤: 1. **检查第13行附近的缩进和语法** 首先,打开`/etc/promtail/promtail.yaml`,定位到第13行。检查: - 这一行是否是一个有效的键值对?键后面必须紧跟冒号,然后空格,然后是值。 - 检查缩进是否与其父级保持一致(通常使用2个空格,但整个文件必须一致)。 - 确保没有使用制表符(Tab),必须用空格。 - 检查是否有重复的键名。 2. **检查环境变量引用** 如果使用了`-config.expand-env=true`,那么环境变量引用(如`${VAR}`)可能会引起问题,特别是当引用了一个未定义的环境变量或者引用语法不正确时。注意: - 环境变量引用不应破坏YAML结构。例如,如果环境变量引用出现在键的位置,那么必须确保整个键被正确引用(但通常不建议在键的位置使用环境变量)。 - 值中的环境变量引用是安全的,只要它们被正确使用。例如: ```yaml key: ${ENV_VAR}/path ``` 如果`ENV_VAR`未定义,那么展开后就是`/path`,这可能导致路径错误,但不会引起YAML解析错误。 - 但是,如果环境变量引用导致了一个无效的YAML结构,比如在需要标量的地方变成了映射或列表,那么就会出错。 3. **验证YAML格式** 可以使用在线YAML验证工具或者命令行工具(如`yamllint`)来检查配置文件。 4. **查看上下文** 有时真正的错误可能出现在第13行之前,比如第12行缺少了一个冒号,那么解析器可能会在第13行报告错误。 5. **关闭环境变量展开测试** 如果不确定是否是环境变量展开导致的问题,可以尝试暂时不使用`-config.expand-env=true`启动Promtail,看看是否还会出现同样的错误。如果错误消失,那么问题就与环境变量有关。 6. **注意特殊字符** 如果环境变量中含特殊字符(如冒号、双引号等),在展开后可能会破坏YAML结构。建议在引用环境变量时,如果环境变量值可能含特殊字符,应使用引号括起来,例如: ```yaml key: "${ENV_VAR}" ``` 根据引用[4]中的例子,空格问题可能导致这个错误。例如: 错误示例: tags: - latest dockerfile: Dockerfile # 这里dockerfile的缩进和tags下的列表项相同,会被认为是tags的列表项,但实际上dockerfile应该是与tags同级的键。 正确示例: tags: - latest dockerfile: Dockerfile 因此,请检查第13行及其前几行的缩进是否对齐。 由于用户没有提供配置文件内容,我们只能给出一般性的建议。 具体操作步骤建议: 步骤1:检查第13行附近的内容 - 使用文本编辑器打开`/etc/promtail/promtail.yaml`,转到第13行。 - 检查第13行及其前后行的缩进是否正确(比如与同级元素保持一致)。 - 确保键后面有冒号和空格(如果该键有值的话)。 步骤2:检查环境变量 - 如果第13行含环境变量引用(如`${VAR}`),尝试替换为实际值,然后验证YAML格式。 步骤3:使用工具验证 - 安装`yamllint`(如果还没有安装): ```bash # 对于Ubuntu/Debian sudo apt install yamllint ``` - 运行: ```bash yamllint /etc/promtail/promtail.yaml ``` 这将给出具体的错误和警告。 步骤4:手动排查 - 如果第13行看起来没有问题,那么检查第12行或第14行,因为错误有时会传递。 步骤5:关于`-config.expand-env=true` - 这个标志的作用是在解析配置文件时展开环境变量。如果配置文件中有环境变量引用,则必须设置此标志,否则这些引用会作为字面字符串。 - 但是,如果环境变量引用格式错误(比如不完整的`${`)或者引用了不存在的变量,那么展开后可能导致YAML结构错误。 - 使用此标志时,建议在配置文件中用双引号将含环境变量的字符串括起来,以避免特殊字符问题。 如果用户提供了配置文件内容(特别是第13行附近的内容),我们可以更准确地帮助分析。 由于用户没有提供配置文件内容,我们只能给出上述一般性解决方案。 如果按照上述步骤仍然无法解决,建议用户提供配置文件内容(注意脱敏)以便进一步分析。 相关问题: 1. 如何检查YAML文件的语法正确性? 2.Promtail配置文件中使用环境变量有哪些注意事项? 3. 如何解决环境变量展开导致的配置错误? 4. Promtail配置文件的基本结构是怎样的? </think>针对 Promtail 配置文件 `/etc/promtail/promtail.yaml` 的解析错误 `yaml: line 13: did not find expected key`,以下是系统性解决方案及 `-config.expand-env=true` 标志说明: --- ### 错误原因分析 此错误表示 YAML 解析器在第 13 行遇到语法问题[^1][^2][^4],常见原因括: 1. **缩进错误**:子项未正确缩进(要求 2 空格/级) 2. **键值分隔符缺失**:键后缺少冒号 `:` 或冒号后缺少空格 3. **环境变量格式错误**:当启用 `-config.expand-env=true` 时 `${VAR}` 语法错误 4. **特殊字符未转义**:含 `#`、`:` 等未转义的字符 5. **制表符使用**:YAML 严禁使用制表符(必须用空格) --- ### 逐步解决方案 #### 第一步:检查第 13 行语法 ```yaml # 错误示例 ❌ server http_listen_port: 9080 # 缺少根键冒号 # 正确示例 ✅ server: http_listen_port: 9080 ``` 重点检查: 1. 键后必须有冒号(如 `scrape_configs:`) 2. 冒号后必须有空格(如 `port: 9080`) 3. 列表项必须用 `- ` 开头(如 `- job_name: logs`) #### 第二步:验证环境变量语法(若启用 `-config.expand-env=true`) ```yaml # 错误示例 ❌ path: /logs/$APP_NAME/*.log # 未使用 ${} 裹 # 正确示例 ✅ path: /logs/${APP_NAME}/*.log ``` ⚠️ 要求: 1. 变量必须完整裹在 `${}` 中 2. 变量名仅支持 `A-Za-z0-9_` 3. 空变量会导致解析失败 #### 第三步:检查缩进层级 YAML 严格要求缩进(建议 2 空格): ```yaml scrape_configs: # 层级 0 - job_name: app_logs # 层级 1 (用 - 开头) static_configs: # 层级 1 - targets: [localhost] # 层级 2 labels: # 层级 2 env: prod # 层级 3 ``` 用 `yamllint` 验证: ```bash # 安装验证工具 sudo apt install yamllint # 检测配置文件 yamllint /etc/promtail/promtail.yaml ``` #### 第四步:转义特殊字符 ```yaml # 错误示例 ❌ regex: "ERROR: .* at (.*)" # 括号未转义破坏结构 # 正确示例 ✅ regex: "ERROR: .* at \\(.*\\)" # 用反斜杠转义 ``` --- ### `-config.expand-env=true` 标志说明 #### 作用原理 ```mermaid graph LR A[启动命令] --> B["-config.expand-env=true"] B --> C[解析配置文件] C --> D{发现 ${VAR}} D --> E[读取系统环境变量] E --> F[替换原始配置] F --> G[生成最终配置] ``` #### 使用场景 | 场景 | 示例配置 | 启动命令 | |--------------------|----------------------------|----------------------------------| | 动态日志路径 | `path: /var/log/${APP}/*` | `APP=nginx promtail ...` | | 环境区分标签 | `env: ${DEPLOY_ENV}` | `DEPLOY_ENV=prod promtail ...` | | 多租户认证 | `password: ${LOG_PWD}` | 通过 K8s Secret 注入变量 | #### 注意事项 1. **变量未定义**:会导致空值(可能引发逻辑错误) 2. **安全性**:避免在配置中直接暴露敏感变量 3. **类型兼容**:环境变量始终是字符串,需手动转换数字/布尔值 4. **启动顺序**:必须在 Promtail 进程启动前设置环境变量 --- ### 完整调试流程 1. **隔离问题**: ```bash # 不使用环境变量展开 promtail -config.file=/etc/promtail/promtail.yaml # 启用环境变量展开 promtail -config.file=/etc/promtail/promtail.yaml -config.expand-env=true ``` 2. **环境变量检查**: ```bash # 打印所有环境变量 printenv # 检查特定变量 echo "APP_NAME=${APP_NAME}" ``` 3. **配置验证工具**: ```bash # 安装 yq (YAML 处理器) sudo snap install yq # 模拟环境变量展开 APP_NAME="nginx" yq eval 'explode(.)' promtail.yaml ``` 4. **日志分析**: ```bash journalctl -u promtail -f | grep "yaml" ``` --- ### 典型修复案例 **错误配置**: ```yaml # Line 13 附近问题 clients: url: http://${LOKI_HOST:3100}/loki/api/v1/push # 错误1:默认值语法错误 batchwait: 1s batchsize: 102400 timeout 10s # 错误2:缺少冒号 ``` **修复后**: ```yaml clients: url: http://${LOKI_HOST}:3100/loki/api/v1/push # 修正1:分离端口 batchwait: 1s batchsize: 102400 timeout: 10s # 修正2:添加冒号 ``` > 参考资料:YAML 1.2 规范要求键值对必须使用 `key: value` 格式[^3] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值