Linux의 .yaml 파일에서 환경 변수 설정 및 테스트

Linux의 .yaml 파일에서 환경 변수 설정 및 테스트

아래와 같이 사용자 이름과 비밀번호 매개변수가 포함된 abc.yml 파일이 있습니다. 이러한 매개변수를 Linux 사용자의 env 변수에 저장했지만 응용 프로그램이 abc.yml 파일을 실행할 때 env 변수의 값이 인쇄되지 않습니다. 환경 변수만 인쇄합니다.

abc.yml:

type: MYSQL

host: localhost
port: 3307

username: '${user_mysql}'
password: '${pass_mysql}'

Linux 터미널 환경 변수 확인:

[arc@rnd-2 conn]$ echo ${user_mysql}
root
[arc@rnd-2 conn]$ echo ${pass_mysql}
notmypassword

abc.yml 파일 실행 시 로그:

Caused by: java.sql.SQLInvalidAuthorizationSpecException: (conn=375) Access denied for user '${user_mysql}'@'localhost' (using password: YES)
Current charset is UTF-8. If password has been set using other charset, consider using option 'passwordCharacterEncoding'

답변1

Java(?) 프로그램이 특정 모양을 볼 때 환경 변수를 찾는 방법을 알지 못하면 ${variable}로컬에서 작동하지 않습니다.

그러나 YAML 파일을 구문 분석하고 변수 값을 바꾼 다음 프로그램에서 처리된 YAML 파일을 사용하도록 할 수 있습니다. 이 문제를 해결하는 데 도움이 되는 도구는 다음과 같습니다.envsubst

답변2

YAML 파일의 변수를 일치시키려는 대신 YAML 인식 도구를 사용하여 최상위 username및 키 값을 설정할 수 있습니다. password이것의 장점은 문서에 맞게 값을 인코딩할 수 있다는 것입니다.

아이디어는 YAML 문서를 읽는 소프트웨어와 함께 사용하기 전에 YAML 문서를 적절하게 수정(또는 수정된 복사본을 생성)하는 것입니다.


다음이 사용됩니다yqAndrey Kislyuk이 제공하는 Python 기반 도구이는 잘 알려진 JSON 프로세서를 둘러싼 래퍼입니다 jq.

비밀번호는 임의의 문자열을 지원함을 나타내기 위해 리터럴 탭으로 끝납니다. 또한 슬래시와 백슬래시(암호에서 볼 수 있는 문자)도 삽입했습니다.

user_mysql=ruut
pass_mysql='not\/my\/password   '

yq -y \
   --arg username "$user_mysql" \
   --arg password "$pass_mysql" \
   '. += $ARGS.named' abc.yml

이것이 작동하기 위해 입력에 키가 존재할 필요는 없지만, 존재하는 경우 해당 값은 명령줄에 전달된 인수에 의해 재정의됩니다.

질문의 입력 문서가 주어지면 다음이 출력됩니다.

type: MYSQL
host: localhost
port: 3307
username: ruut
password: "not\\/my\\/password\t"

"제자리에서" 변경하려면 해당 옵션 이나 옵션 yq과 함께 사용하세요 .--in-place-i


당신은 또한 이것을 할 수 있습니다yqMike Farah가 제공하는 Go 기반 도구:

user_mysql=ruut
pass_mysql='not\/my\/password   '

export user_mysql pass_mysql

yq '.username = strenv(user_mysql) |
    .password = strenv(pass_mysql)' abc.yml

이 경우 값을 설정하는 구문이 약간 다릅니다. 환경을 통해 변수를 전달하고 표현식 strenv()내부의 값을 읽습니다 yq. 이는 두 변수를 모두 내보내거나 yq프로세스 환경에서 사용할 수 있도록 해야 함을 의미합니다.

옵션이 제공되면 yq유틸리티는 "내부" 편집을 수행할 수도 있습니다 -i.

문제의 문서의 출력을 제공합니다.

type: MYSQL
host: localhost
port: 3307
username: 'ruut'
password: "not\\/my\\/password\t"

관련 정보