제 동료와 저는 Ansible을 사용하여 서버 그룹을 관리합니다.
로컬 홈 디렉터리의 .ansible.cfg 파일을 사용하여 로컬 환경을 설정하고 플레이북을 git repo에 유지합니다.
서버에 인증할 때 저는 user1을 사용하고 그 사람은 user2를 사용합니다. 우리 서버의 95%가 이러한 계정을 가지고 있지만 역사적으로 몇몇 서버에는 "사용자" 계정만 있습니다.
우리는 문제의 소수 서버에 대해 remote_user 변수를 설정하기 위해 host_vars를 사용하고 있습니다.
그러나 플레이북에서는 일반적으로 "all"을 사용하여 어떤 서버를 공격할지 지정하고, 명령줄에서 --limit 매개변수를 사용하여 업데이트를 받아야 할 서버를 정확하게 지정합니다. 우리 서버 팜은 잘못 설계되어 몇 년 후에 폐기될 때까지 온라인으로 유지되어야 하는 서버의 유산이며, 우리는 이 접근 방식이 우리 요구 사항에 가장 적합하다는 것을 알았습니다.
문제는 remote_user 매개변수가 .ansible.cfg 파일에 설정되어 스크립트 변수가 아닌 환경 변수로 노출된다는 것입니다.
이는 우리 작업에 다음이 포함된 경우를 의미합니다.
remote_user: "{{ remote_user }}"
해당 변수가 정의된 호스트에서만 작동합니다.
이 변수를 정의하지 않은 호스트의 95%에 대해서는 작업이 실패합니다.
정의된 변수만 사용하는 방법이 있나요?
예를 들어
Remote_user가 정의되어 있으면 이를 사용하고, 그렇지 않은 경우 .ansible.cfg에 설정된 환경 변수를 사용하십시오.
참고: 다음을 사용할 수 있다는 것을 알고 있습니다.
- name: Do something
remote_user: "{{ remote_user }}"
when: remote_user is defined
작업 정의에서는 해당 작업에만 적용되며 모든 작업을 업데이트하고 싶지는 않습니다.
내가 정말로 필요한 것은 호스트 정의에서 해당 조건을 사용할 수 있는 것입니다. 즉:
---
- hosts: all
remote_user: "{{ remote_user }}"
when: remote_user is defined
하지만 이는 Ansible에서는 불법입니다.
답변1
늘 그렇듯 여기에 질문을 올리는데 2시간을 미루다가 질문을 올리고 5분 만에 답을 찾았습니다!
정말 간단합니다. 기존 플레이북에 많은 해킹을 적용하지 않고 개별 시스템에 대해 다른 Remote_user를 설정하려면 인벤토리의 호스트에 var를 추가하기만 하면 됩니다.
[web_servers]
server1 ansible_ssh_user=user
server2
이 경우 플레이에 server1이 포함될 때마다 "사용자"가 SSH 사용자로 사용됩니다. server2의 경우 ansible.cfg 파일의 remote_user 값이 사용됩니다(예: 로컬 환경에 따라 user1, user2 등).