GitLab流水线部署EC2遇AWS credentials重复段错误的解决问询
问题解决:GitLab CI部署EC2时AWS凭证文件重复段错误
问题原因
GitLab CI Runner如果复用运行环境(比如容器、虚拟机),之前部署生成的/root/.aws/credentials文件不会自动清空。每次执行aws configure写入凭证时,会重复添加[default]段,导致Python的configparser解析时抛出DuplicateSectionError。
可行解决方案
方案1:执行认证前清理AWS凭证文件
在每次部署脚本开头,先清空或删除AWS相关配置文件,避免残留内容:
- 直接删除整个AWS配置目录(简单粗暴):
rm -rf ~/.aws || true mkdir -p ~/.aws - 仅清空凭证文件(保留其他可能的配置):
> ~/.aws/credentials && > ~/.aws/config - 精准删除
[default]段(适合需要保留其他配置的场景):sed -i '/\[default\]/,/^\[/d' ~/.aws/credentials # 删除default段及后续到下一个段前的内容
方案2:用环境变量传递AWS凭证(推荐)
Ansible和AWS CLI都支持通过环境变量读取认证信息,完全不需要写入本地文件,从根源避免文件残留问题:
在GitLab CI配置中直接定义环境变量:
deploy_job: stage: deploy variables: AWS_ACCESS_KEY_ID: "$AWS_ACCESS_KEY" # 从GitLab项目变量中读取 AWS_SECRET_ACCESS_KEY: "$AWS_SECRET_KEY" AWS_DEFAULT_REGION: "us-east-1" # 替换为你的EC2区域 script: - ansible-playbook deploy.yml
错误日志示例
Traceback (most recent call last): File "/usr/local/bin/ansible-playbook", line 10, in <module> sys.exit(main()) File "/usr/lib/python3/dist-packages/ansible/cli/playbook.py", line 157, in main cli.run() ... File "/usr/lib/python3.8/configparser.py", line 1064, in add_section raise DuplicateSectionError(section) configparser.DuplicateSectionError: [default]
原CI配置示例及修改
原问题配置(导致重复段)
deploy_job: stage: deploy script: - aws configure set aws_access_key_id $AWS_ACCESS_KEY - aws configure set aws_secret_access_key $AWS_SECRET_KEY - aws configure set default.region $AWS_REGION - ansible-playbook deploy.yml
修改后配置(清理文件方式)
deploy_job: stage: deploy script: - rm -rf ~/.aws || true - mkdir -p ~/.aws - aws configure set aws_access_key_id $AWS_ACCESS_KEY - aws configure set aws_secret_access_key $AWS_SECRET_KEY - aws configure set default.region $AWS_REGION - ansible-playbook deploy.yml
思路验证
你提出的「清理相关认证信息」思路是正确的,能直接解决重复段问题。但更推荐使用环境变量方案,因为它符合CI/CD流水线的无状态运行原则,减少文件操作带来的潜在问题,同时简化脚本逻辑。
内容的提问来源于stack exchange,提问作者Gashio Lee
相关产品推荐
相关产品推荐

