자격 증명을 파일에 저장하지 않으면 서 Ansible Azure 플레이 북을 어떻게 실행합니까?


13

배경

  1. Ansible을 사용하여 Azure 인프라를 프로비저닝하고 관리합니다. 현재 Ansible을 "수동으로" 실행 합니다. 즉 , 다양한 자동화 된 작업에 대해 수동으로 플레이 북실행 합니다. CI 인프라가 없습니다.
  2. 아마도 관련이 없지만 동적 스크립트를 사용하여 인벤토리를 관리합니다 azure_rm.py.
  3. 우리는 가능한 한 안전해야합니다.
    1. Vault 비밀번호를 ~/.vault_pass로컬 파일 또는 로컬 파일에 저장하지 마십시오
    2. Azure 비밀을 저장하지 마십시오 ~/.azure/credentials
    3. 에 안전한 것을 보관하지 마십시오 .bashrc.

이러한 시나리오에서 위의 지침에 따라 내 플레이 북이 Azure 비밀에 액세스 할 수 있도록 일관된 전략을 세우는 데 어려움을 겪고 있습니다.

질문

플레이 북이 파일에 액세스 할 수 있도록하면서 Ansible Vault 및 Azure 자격 증명을 파일에 저장하지 않으려면 어떻게해야합니까?

내가 시도한 것

지금까지 래퍼 스크립트를 만들었습니다.

  1. 사용자에게 Vault 비밀번호를 묻습니다.
  2. 이를 사용하여 Vaulted Shell 스크립트의 암호를 해독합니다
  3. Azure 환경 변수를 환경에로드하는 스크립트를 평가합니다.
  4. 설정된 환경에서 플레이 북을 실행합니다.

더 나은 (더 우아하고, 덜 복잡하고, 더 "안성있는") 솔루션이 있습니까?


이 워크 플로우에서 가장 귀찮은 것은 무엇입니까?
Konstantin Suvorov

1
@KonstantinSuvorov 주로 컴플라이언스가 많은 기업에서 상당히 일반적인 요구 사항을 달성하기 위해 점프 해야하는 후프 수입니다.
Vish

답변:


8

금고 비밀번호

우선, 볼트 암호 파일이 실행 가능한 스크립트 일 수 있다는 사실에 익숙해 져야합니다. 이 경우 Ansible이이를 실행하고 비밀번호를 출력으로받을 것으로 예상합니다.

예를 들어 실제 비밀번호를 사용 gpg-agent하거나 keychain저장하여 필요할 때 잠금을 해제 할 수 있습니다. 이 블로그 게시물에서 자세한 내용을 확인하십시오 : https://benincosa.com/?p=3235

약간 편집증 환자라면 다음과 같이 비밀번호 스크립트가 호출 될 때 알림을 추가 할 수 있습니다.

#!/bin/bash
PARENT_PROCESS=$(ps -p $PPID -o args | tail -n 1)
osascript -e "display notification \"Vault password used by ${PARENT_PROCESS}\" with title \"Ansible\" sound name \"default\""
gpg --batch --use-agent --no-tty --decrypt key.gpg 2>/dev/null

이 볼트 비밀번호 스크립트는 key.gpg실제 볼트 키로 사용 되며 스크립트를 사용할 때 상위 프로세스 이름과 함께 팝업 알림 (MacOS 용)을 표시합니다. Gpg 에이전트 캐시는 일정 시간 동안 비밀번호 잠금을 해제하므로 플레이 북을 시작할 때마다 비밀번호를 입력 할 필요가 없습니다.

에 설정 vault_password_file = ./vault_pass.sh하십시오 ansible.cfg.

환경

azure_rm.py동적 인벤토리 스크립트로 사용한다고 말했습니다 . 즉, 사용 가능한 플레이 북을 시작하기 전에 환경 변수에 자격 증명을 설정해야 사용할 수 있습니다.

두 개의 파일을 만들 수 있습니다.

secure_env (볼트로 암호화) :

export AZURE_SECRET=xxx;export AZURE_SUBSCRIPTION_ID=xxx;

set_env (일반 텍스트):

echo -n "Setting secure vars... "
eval $(ansible-vault view secure_env)
echo "done."

자동화 작업을 수행하기 위해 새 터미널을 열면 다음을 실행해야합니다.

source set_env

이 시점에서 bash는 평가 set_env하고 secure_env(단단한 볼트를 통해 해독). 이 명령 후에 현재 셸에 대해 Azure 자격 증명이 정의되어 있으므로 평소와 같이 플레이 북을 실행할 수 있습니다.

ansible-playbook provision-my-azure-instances.yml

따라서이 두 가지 접근 방식을 사용 하여 저장소에 저장 key.gpg하고 저장할 수 있습니다 secure_env. 그런 다음 새 터미널 호출 source set_env에서 gpg 암호를 한 번 입력하십시오 (key.gpg의 향후 사용을 잠금 해제하기 위해). 그런 다음 ansible-playbook암호없이 원하는만큼 전화 하십시오.


답장을 보내 주셔서 감사합니다. 일주일 내내 이것을 시험해 봅시다.
Vish

원래 접근 방식에 비해 가장 큰 장점은 캐싱 이점을 제공하는 GPG를 사용한다는 것입니다. 환경 접근 방식은 내가 생각해 낸 것과 비슷합니다.
Vish

1
OP에서 플레이 북을 실행할 때마다 래퍼를 사용한다는 것을 알고 있습니다. source접근 방식을 사용하면 터미널 세션 당 한 번 환경을 설정할 수 있으며 래퍼없이 모든 플레이 툴, 인벤토리 스크립트, Azure CLI 등 모든 범위의 도구를 개별적으로 사용할 수 있습니다.
Konstantin Suvorov

아 이해 했어 나는 이것을 우리 팀에게 던질 것이다. 답을보다 편리한 솔루션으로 받아들입니다. 연구와 설명에 감사드립니다! 또한, 나는 당신의 블로그를 좋아했습니다 :)
Vish

GPG (또는 macOS 또는 Linux의 키 체인)를 사용하면 얻을 수있는 주요 이점은 각 팀 구성원에게 고유 한 개인 키 잠금을 해제하기위한 자체 인증이 있다는 것입니다. 그런 다음이 키를 사용하여 공유 암호 인 Ansible Vault 암호를 잠금 해제합니다. 어쨌든 Vault 암호를 포함하여 누군가 팀을 떠나면 모든 비밀을 바꿔야하지만 최소한 GPG / 키 체인 암호를 변경할 필요는 없습니다.
RichVel

2

Ansible 2.4는 https://docs.ansible.com/ansible/2.4/vault.html을 읽으십시오 --vault-id @prompt.

ansible-ault를 사용하여 파일을 암호화하십시오.

ansible-vault encrypt /path/to/encrypted/file

플레이 북을 실행하면 다음과 같은 결과가 발생합니다.

fatal: [localhost]: FAILED! => {"msg": "A vault password or secret must be
specified to decrypt /path/to/encrypted/file"}

파일을 해독하는 여러 가지 옵션이 있습니다 @prompt.

ansible-playbook some-playbook --vault-id @prompt

프롬프트 :

Vault password (default):

볼트 암호를 입력하면 플레이 북이 성공합니다.


1
페이지를 읽으면 해결책이있는 것처럼 보이지만 링크 만 사용하여 알아낼 수는 없습니다. 좀 더 자세히 설명해 주시겠습니까?
Vish

정교한 감사합니다. 이전 --ask-vault-pass옵션을 사용하여 사용자에게 볼트 암호를 묻는 것이 실제로 필요합니다 . 그리고 그것을 대체 --vault-id하는 것이 더 나은 워크 플로우의 더 큰 질문에 어떻게 대답 할 수 있는지 이해하지 못했습니다 .
Vish

이 링크에 저를 언급 할 때 나는 않은 하나의 흥미로운 옵션을 참조하십시오 ansible-playbook --vault-id my-vault-password.py. 나는 아마도 당신이 파이썬 스크립트를 사용하는 것에 대한 해결책을 가지고 있다고 생각했다. :) 나는 이것에 대해 약간의 생각을하고있다.
Vish
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.