저는 쉘 스크립트 모음에서 Ansible 플레이북으로 전환하는 새로운 Ansible 사용자입니다. 현재 사용자 관리 시스템에서는 해당 사용자에게 해당 서버 클래스, 위치 및 환경에 대한 액세스 권한이 부여된 경우(또는 이들 중 하나가 와일드카드/임의로 설정된 경우)에만 시스템에 사용자를 추가할 수 있습니다.
서버 클래스, 위치 및 환경은 다음과 같은 (루트 읽기/쓰기만 가능) 파일 형식으로 클라이언트 서버 자체에 로컬로 저장됩니다.
LD_CLASS="app"
LD_LOC="dfw"
LD_ENV="prod"
내가 원하는 것과 유사하다고 생각되는 몇 가지 예를 찾았습니다. Ansible 클라이언트에서 변수를 가져오는 방법과 추가하기 전에 3가지 클래스, 위치 및 환경 요구 사항이 모두 충족되는지 확인하는 방법은 여전히 확실하지 않습니다. 사용자. 나는 다음과 같은 변수 파일을 구상합니다.
users:
-name: user1
uid: 60001
gid: 60001
class: app
location: any
env: dev
-name: user2
uid: 60002
gid: 60002
class: app
location: dfw
env: prod
구성 중인 Ansible 클라이언트에서 수집된 변수를 기반으로 다음과 같은 사용자 모듈 항목을 사용합니다(실제로 이를 어떻게 수행할지 모르기 때문에 의사 코드에 유의하세요).
- user:
name: '{{ item.name }}'
state: '{ (If $LD_LOC matches location variable, or is set to any) & ($LD_ENV matches env variable, or is set to any) & ($LD_CLASS matches class variable, or is set to any) } present{% else %}absent{% endif %}'
uid: '{{ item.uid }}'
with_items: users
나는 ansible 역할에 의존하지 않고 대신 ansible 클라이언트 자체에서 클래스, 위치 및 환경 데이터를 가져오는 것을 선호합니다. 적어도 부분적으로는 이것이 현재 우리가 가지고 있는 시스템이고 일부를 유지하면서 ansible로 쉽게 전환하는 데 도움이 되기 때문입니다. 기존의 친숙한 도구. 내가 찾고 있는 것이 가능한 일인가?
답변1
이라는 기능이 있습니다.지역 사실앤서블에서:
"속성" 파일을 다음과 같이 수정하고 에 저장한
/etc/ansible/facts.d/server_meta.fact
후 원하는 대로 권한을 적용하세요.[settings] ld_class=app ld_loc=dfw ld_env=prod
그런 다음 플레이북을 실행하고 매개변수에서 해당 사실을 참조하세요
state
.state: "{{ (ansible_local.server_meta.settings.ld_loc == 'dfw' and ansible_local.server_meta.settings.ld_class == 'app' and ansible_local.server_meta.settings.ld_env == 'prod' ) | ternary('present', 'absent') }}"