클라우드 아카이브

[Ansible] 앤서블 겔럭시를 사용하여 유저/그룹 생성 및 삭제 본문

Cloud Native Solution/[IaC] ansible

[Ansible] 앤서블 겔럭시를 사용하여 유저/그룹 생성 및 삭제

Cloud Engineer 2021. 11. 3. 15:56

개요

앤서블 겔럭시를 사용하여 Role을 기반으로 한 리눅스 사용자 및 그룹을 생성/삭제하는 플레이북을 작성하겠습니다. 앤서블의 공식 홈페이지에 게시된 앤서블 모듈 관련 레퍼런스를 기반으로 해당 코드를 참고했으며 공식 문서를 보고싶으신 분들은 여기를 클릭해주시면 감사하겠습니다.

앤서블 겔럭시에 대한 개념과 디렉토리 구조에 대한 학습을 하고싶으신 분들은 여기를 클릭해주시면 됩니다.

디렉토리 구조

.
├── 01-make-user-and-group	# 유저/그룹 생성을 이행하기 위한 Role
│   ├── README.md
│   ├── tasks			# Playbook 역할을 담당하는 디렉터리
│   │   └── main.yml
│   └── vars			# 해당 Role에서 사용할 변수 (우선순위 높음)
│       └── main.yml
├── README.md
├── inventory.yaml		# 작업 대상 서버들 지정
└── main.yml			# 전체 role의 이행 순서를 중앙에서 관리

구현 프로세스

1. 앤서블 겔럭시 role 생성

# 앤서블 겔럭시 신규 role 생성
$ ansible-galaxy role init 01-make-user-and-group

2. 앤서블 인벤토리 작성

작업 대상을 지정하기 위해 인벤토리를 작성하도록 하겠습니다. 인벤토리 작성 방법은 2가지가 있는데 cfg 파일 형식으로 작성하거나 yaml 파일로 작성하는 것입니다. 타 블로그에서 cfg 파일 형식으로 작성해놓은 예제가 많기 때문에 본 포스팅에서는 yaml 파일로 작성해보겠습니다.

# ./my-inventory.yml
---
server-group:	# 그룹 지정
    hosts:
        my-server:  # 호스트 지정
            ansible_host: 1.1.1.1 # 작업 대상 호스트의 IP 입력
            ansible_port: 22
            ansible_user: admin
            ansible_password: "12345"
            ansible_connection: ssh	# ssh | winrm | ...

server-group이라는 호스트 그룹을 만들고 my-server라는 호스트이름을 가진 서버를 server-group에 소속시키켰습니다.

3. Role 관리를 담당하는 플레이북 생성

중앙에서 Role을 관리하는 플레이북을 생성해줍니다. 해당 플레이북을 통해 여러 개의 Role을 중앙에서 이행할 수 있는 편의성을 제공합니다.

./main.yml
---
- name: 유저/그룹 생성 및 삭제
  hosts: server-group
  become: yes	# root 권한 허용
  roles:
    - 01-make-user-and-group

4.  유저 생성/삭제 및 그룹 생성 플레이북 작성

신규 그룹 생성 - 신규 유저 생성 및 소속 그룹 지정 - 사용자가 원할 경우 특정 유저 삭제 순서로 플레이북 모듈을 작성하겠습니다.

# 01-make-user-and-group/tasks/main.yml
---
- name: create new group	# 신규 그룹 생성
  group:
    name: "{{ new_group }}"	# vars/main.yml에 명시된 변수 호출
    state: present

- name: create new user and belonging new_group	# 신규 유저 생성 및 소속 그룹 지정
  user:
    name: "{{ new_username }}"	# 유저 명
    password: "{{ new_user_password }}"	# default 패스워드 입력
    group: "{{ new_group }}"
    shell: /bin/bash
    state: present

- name: remove specific user
  user:
    name: "{{ removed_username }}"	# defaults/main.yml에 명시된 변수 호출
    state: absent
    remove: yes
  when: is_remove_user == True	#defaults/main.yml에 명시한 변수가 True일 경우 해당 모듈 실행
구현 모듈에서 state를 명시하는 이유
앤서블의 강력한 특징 중 하나인 멱등성을 지키기 위해서입니다. 동일한 명령어를 반복해서 실행시키더라도 상태가 항상 동일하게 유지되어야 하기 때문에 이를 state를 통해 명시하는 것입니다. 앤서블의 개념 및 특징에 대해 더 학습하고 싶으신 분들은 여기를 클릭해주시면 감사하겠습니다.

4. 우선순위가 낮은 변수 지정 (defaults)

유저 삭제와 관련된 변수를 지정해줍니다. is_remove_user의 변수값을 True로 할 경우 유저 삭제 모듈을 이행하고, remove_user라는 유저를 삭제하겠다는 의미입니다.

# 01-make-user-and-group/defaults/main.yml
---
# 유저 삭제 모듈을 이행할지 여부
is_remove_user: True      # True | False

# 삭제할 유저이름
removed_username: remove_user

5. 우선순위가 높은 변수 지정 (vars)

생성할 유저 및 그룹에 대한 변수값을 지정해줍니다.

---
new_username: oracle
new_user_password: admin123
new_group: dba

6. 실행 결과

$ ansible-playbook -i my-inventory.yaml main.yml -vvv
ansible-playbook [core 2.11.6]
  config file = None
		...
  python version = 3.9.7 (default, Oct 12 2021, 22:38:23) [Clang 13.0.0 (clang-1300.0.29.3)]
  jinja version = 3.0.2
  libyaml = True
No config file found; using defaults
		...
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
Skipping callback 'default', as we already have a stdout callback.
Skipping callback 'minimal', as we already have a stdout callback.
Skipping callback 'oneline', as we already have a stdout callback.

PLAYBOOK: main.yml *************************************************************************************************
1 plays in main.yml

PLAY [유저/그룹 생성 및 삭제] **********************************************************************************

TASK [Gathering Facts] *********************************************************************************************
task path: ./main.yml:2
		...
ok: [my-server] => {
    "append": false,
    "changed": false,
    "comment": "",
    "group": 1002,
    "home": "/home/oracle",
    "invocation": {
        "module_args": {
            "append": false,
            "authorization": null,
            "comment": null,
            "create_home": true,
            "expires": null,
            "force": false,
            "generate_ssh_key": null,
            "group": "dba",
            "groups": null,
            "hidden": null,
            "home": null,
            "local": null,
            "login_class": null,
            "move_home": false,
            "name": "oracle",
            "non_unique": false,
            "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
            "password_expire_max": null,
            "password_expire_min": null,
            "password_lock": null,
            "profile": null,
            "remove": false,
            "role": null,
            "seuser": null,
            "shell": "/bin/bash",
            "skeleton": null,
            "ssh_key_bits": 0,
            "ssh_key_comment": "ansible-generated on ip-172-31-41-22.ap-northeast-2.compute.internal",
            "ssh_key_file": null,
            "ssh_key_passphrase": null,
            "ssh_key_type": "rsa",
            "state": "present",
            "system": false,
            "uid": null,
            "update_password": "always"
        }
    },
    "move_home": false,
    "name": "oracle",
    "password": "NOT_LOGGING_PASSWORD",
    "shell": "/bin/bash",
    "state": "present",
    "uid": 1001
}
		...
META: role_complete for my-server
META: ran handlers
META: ran handlers

PLAY RECAP *********************************************************************************************************
my-server                  : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

$

마무리

앤서블 겔럭시를 사용하여 Role 기반으로 유저/그룹 생성 및 삭제하는 구성관리 코드를 작성해봤습니다. 앤서블의 경우 관련 레퍼런스가 굉장히 잘 되어있고, 도구 사용자층이 두꺼울 뿐만 아니라 RedHat에서 후원하는 도구이기 때문에 신뢰성이 굉장히 높습니다. 또한 Chef 등의 구성관리 도구와 다르게 Agentless 방식으로 앤서블 코어 서버와 작업 대상 서버가 SSH 통신을 한다는 강력한 특징으로 인하여 사용자가 많이 유입된 것도 있겠지요. (Agent를 설치할 경우 작업 대상 서버에서 Agent 프로세스를 관리해야할 뿐만 아니라 프로세스 간 충돌 등의 문제에서 자유로워질 수 없겠지요 ^^)

이상으로 앤서블 겔럭시를 사용하여 유저/그룹 생성 및 삭제 모듈을 구현하는 포스팅을 마치겠습니다. 감사합니다.

Comments