Commit 0dd430df authored by JooHan Hong's avatar JooHan Hong

ansible, 2021-03-08, update1

parent da619204
Pipeline #5110 passed with stages
in 2 seconds
......@@ -2,7 +2,7 @@
# Ansible 활용
> IaC(Infrastructure as Code) 도구 중 Ansiable에 대한 Playbook을 제공
> IaC(Infrastructure as Code) 도구 중 하나인 Ansiable에 대한 Playbook을 제공
# Table of Contents
......
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# Ansible을 이용한 사용자계정 관리
> 사용자의 추가/제거을 수행하고, 추가적으로 ssh의 Allow 설정을 적용한 후 txt 파일로 수행하는 시스템(PC 또는 서버)에 증적을 남긴다.
## 주요 기능
- 리눅스 사용자에 대한 추가를 수행한다.
- ssh 설정에 **AllowUsers** 또는 **AllowGroup** 설정을 수행할 수 있다.
- 수행 후 증적을 위해 현재 로컬에 *IP주소*/*날짜*(YYYY-MM-DD)/*사용자아이디*/*사용자아이디_허용*IP.txt 파일을 기록한다.
## Inventory 설정
```bash
# cat hosts
[USERS]
172.16.0.100 managed_ip=172.16.0.100 des="test user add, 2020-12-03"
[USERS_OK]
```
대상 호스트는 172.16.0.100이며, 추가는 2020-12-03에 수행한다. 참고적으로 **USERS_OK** 호스트 그룹은 작업이 완료된 호스트의 history를 위한 그룹이다.
## Host Variables 설정
```bash
# cat host_vars/172.16.0.100
ansible_ssh_host: 172.16.0.100
ansible_ssh_port: SSH_포트번호
ansible_ssh_user: 사용자 아이디
ansible_ssh_pass: "사용자 패스워드"
ansible_become: yes
ansible_become_method: su
ansible_become_user: root
ansible_become_pass: "!root_패스워드"
ansible_python_interpreter: python2.7
```
## Playbook 설정
- `사용자 추가`
```python
---
- name: System User Additional
hosts: USERS
vars:
add_user_name: '사용자 아이디'
user_password: '사용자 패스워드'
allow_ip: '사용자의 PC IP주소'
time: "{{lookup('pipe','date \"+%Y-%m-%d\"')}}"
allow_user_check: '{{ add_user_name }}@{{ allow_ip }}'
tasks:
- name: Local Directory Create
local_action: command mkdir -p USER_ADD/{{ managed_ip }}/{{ time }}/{{ user_name }}
- name: New System User Add
user:
name: "{{ add_user_name }}"
password: "{{ user_password | password_hash('sha512') }}"
shell: /bin/bash
- name: wheel Group Add
group:
name: wheel
state: present
- name: User Add Wheel Group
shell: usermod -G wheel {{ add_user_name }}
- name: AllowUsers checking
shell: cat /etc/ssh/sshd_config |grep "AllowUsers {{ allow_user_check }}" |wc -l
register: allowuser_exist
- debug: var=allowuser_exist.stdout
- name: /etc/ssh/sshd_config Add AllowUsers
shell: echo "AllowUsers {{ allow_user_check }}" >> /etc/ssh/sshd_config
when: allowuser_exist.stdout == "0"
- name: sshd Daemon Restart
service:
name: ssh.service
state: reloaded
enabled: yes
when: allowuser_exist.stdout == "0"
- name: System User AllowIP Result
local_action: copy content={{ allow_ip }} dest=USER_DEL/{{ managed_ip }}/{{ time }}/{{ user_name }}/{{ user_name }}_allowip.txt
when: allowuser_exist.stdout == "0"
```
`사용자 추가`에 대한 Playbook 분석
* [ ] **추가하려는 사용자**에 대한 아이디(add_user_name)/패스워드(user_password)/IP주소(allow_ip)는 변수로 설정한다.
* [ ] **root 유저로의 전환**은 wheel 그룹에 속한 사용자만 가능하므로, wheel 그룹에 추가한다.
* [ ] 만약 기존 사용자의 정보가 존재한다면, AllowUsers 설정이 불필요하므로, 체크한다(**allowuser_exist 변수**).
* [ ] 사용자가 존재하지않는다면(**allowuser_exist.stdout == "0"**), /etc/ssh/sshd_config에 AllowUsers 설정을 추가한 sshd 서비스데몬을 reload 한다.
- `사용자 제거`
```python
---
- name: System User Additional
hosts: USERS
vars:
del_user_name: '사용자 아이디'
allow_ip: '사용자의 PC IP주소'
time: "{{lookup('pipe','date \"+%Y-%m-%d\"')}}"
tasks:
- name: Local Directory Create
local_action: command mkdir -p USER_DEL/{{ managed_ip }}/{{ time }}/{{ user_name }}
- name: System User Exist Check
shell: id -u "{{ user_name }}"
register: user_exists
ignore_errors: True
- name: System User Remove
user: name={{ user_name }}
state=absent
force=yes
remove=yes #사용자 홈디렉토리를 포함한 모든 설정을 지운다.
when: user_exists.rc == 0
- name: User Remove Whell Group
shell: usermod -G "" {{ user_name }}
when: user_exists.rc == 0
- name: User Remove sshd_config AllowUsers
lineinfile:
dest: /etc/ssh/sshd_config
regexp: "^AllowUsers {{ user_name }}@{{ allow_ip }}"
state: absent
ignore_errors: True
when: user_exists.rc == 0
- name: sshd Daemon Restart
service:
name: ssh.service
state: reloaded
enabled: yes
when: user_exists.rc == 0
- name: System User Password Modify Result
local_action: copy content={{ user_exists }} dest=USER_DEL/{{ managed_ip }}/{{ time }}/{{ user_name }}/{{ user_name }}_result.txt
when: user_exists.rc == 0
- name: System User AllowIP Result
local_action: copy content={{ allow_ip }} dest=USER_DEL/{{ managed_ip }}/{{ time }}/{{ user_name }}/{{ user_name }}_allowip.txt
when: user_exists.rc == 0
```
`사용자 제거`에 대한 Playbook 분석
* [ ] **제거하려는 사용자**에 대한 아이디(del_user_name)/IP주소(allow_ip)는 변수로 설정한다.
* [ ] 사용자의 모든 그룹을 제거한다. 물론 이 과정은 wheel에 추가된 내역을 지우는데 목적이 있다.
* [ ] 사용자를 제거한다. 여기서 주의할 사항은 `remove=yes`로 인해 홈 디렉토리의 데이터까지 모두 제거된다.
* [ ] /etc/ssh/sshd_config 파일에 AllowUsers 설정을 지우는데, 해당 유저정보가 Match하면 지우게 된다.
## playbook 실행
- `사용자 추가`
```bash
# ansible-playbook -i hosts user_add.yml
```
- `사용자 제거`
```bash
# ansible-playbook -i hosts user_del.yml
```
## 수행 결과
```bash
# ls USER_DEL/172.16.0.100/2020-12-03/test/test_allowip.txt
USER_DEL/10.130.10.79/2021-03-08/test/test_allowip.txt
# cat USER_DEL/172.16.0.100/2020-12-03/test/test_allowip.txt
172.16.0.100
```
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment