能否通过Bash脚本自动填充elasticsearch-setup-passwords密码?
完全可以通过Bash脚本实现自定义密码的自动化配置,不需要依赖elasticsearch-setup-passwords的交互流程或者随机密码生成参数。elasticsearch-setup-passwords本质是对Elasticsearch安全配置API的封装,单节点首次启动阶段,从本地localhost发起的请求默认持有节点超级用户权限,可以直接调用API完成所有内置账号的自定义密码设置,全程无交互。
实现步骤
- 首次启动Elasticsearch前修改
elasticsearch.yml配置,开启安全功能并适配单节点模式:
xpack.security.enabled: true # 若开启HTTP SSL,后续API请求需对应替换为HTTPS xpack.security.http.ssl.enabled: false discovery.type: single-node
- 在Bash部署脚本中预定义所有内置账号的自定义密码,等待ES服务启动就绪后,直接调用安全API批量设置密码:
#!/bin/bash # 预定义自定义凭证,可根据需求修改 declare -A ES_PASSWORDS=( ["elastic"]="your_elastic_custom_password" ["kibana_system"]="your_kibana_custom_password" ["apm_system"]="your_apm_custom_password" ["logstash_system"]="your_logstash_custom_password" ["beats_system"]="your_beats_custom_password" ["remote_monitoring_user"]="your_remote_monitor_custom_password" ) # 轮询等待ES启动完成 until curl -s -f http://localhost:9200 >/dev/null; do echo "Elasticsearch未就绪,5秒后重试..." sleep 5 done # 遍历设置所有账号密码 for USER in "${!ES_PASSWORDS[@]}"; do curl -s -X POST "http://localhost:9200/_security/user/${USER}/_password" \ -H "Content-Type: application/json" \ -d "{\"password\":\"${ES_PASSWORDS[$USER]}\"}" echo "已完成账号 ${USER} 的密码配置" done
注意事项
- 如果开启了Elasticsearch HTTP SSL,将请求地址替换为
https://localhost:9200,同时在curl命令中添加-k参数(跳过本地证书校验)或通过--cacert指定本地CA证书路径即可。 - 如果自定义密码包含引号、斜杠等特殊字符,建议安装
jq工具生成JSON请求体,避免手动转义出错,替换请求体参数部分为-d "$(jq -n --arg pwd "${ES_PASSWORDS[$USER]}" '{"password":$pwd}')"即可。 - 密码配置完成后,后续操作Elasticsearch API就需要携带
-u 账号:对应密码的认证参数,Kibana配置文件中直接写入预定义的kibana_system账号密码即可正常对接。 - 不推荐使用
expect等交互模拟工具适配elasticsearch-setup-passwords,不同版本ES的交互提示可能存在差异,直接调用官方API的方案兼容性更强,也不需要额外安装依赖。 - 初始化流程完成后,可重启Elasticsearch服务加载正式生产配置,关闭本地默认超级用户上下文。
内容的提问来源于stack exchange,提问作者Maury Diaz
相关产品推荐
相关产品推荐

