본문 바로가기
DevOps

2. Ansible (앤서블) 로 전체 서버 계정 추가하기 - CLI로 계정 추가하기

by 창천향로 창천향로 2019. 7. 23.
반응형

이번 시간엔 앤서블 CLI를 통해 각 호스트에 루트 권한을 가진 계정을 추가해보겠습니다.

2-1. 모듈?

실습에 들어가기 앞서 앤서블의 모듈에 대해 간단하게 소개하겠습니다.
앤서블의 공식 홈페이지에선 모듈에 대해 다음과 같이 소개합니다.

모듈 (Task 플러그인, 라이브러리 플러그인 이라고도 함) 은 CLI나 플레이북 작업에서 사용할 수 있는 별도의 코드 단위입니다.

공식 홈페이지에서 소개한것과 같이 모듈은 일종의 라이브러리 플러그인입니다.

  • OS 작업 (패캐지 설치/사용자 관리 등)
  • 파일 작업 (복사 등)
  • 데이터베이스 작업 (사용자/테이블 관리 등)

등의 작업들이 모듈이라는 미리 정의된 플러그인으로 쉽게 작업할 수 있습니다.

여기서 한가지 의문이 드실텐데, 쉘 스크립트로 명령 수행해도 다 할 수 있는 일들인데? 라고 생각할 수 있습니다.

근본적으로 쉘로 직접 수행하기 보다는 모듈을 통해서 작업하는 이유는 다음과 같습니다.

  • 멱등성을 보장해줍니다.
    • 앤서블의 모듈은 작업을 실행하기 전에 그 시점의 상태를 확인하고 변경이 있을때만 실제의 작업을 수행하도록 설계되어있습니다.
    • 즉, 중복 실행되서 문제가 될 여지가 사전 차단 됩니다.
    • 이걸 쉘로 구현하기에는 너무 부담스럽겠죠?
  • 가독성이 좋습니다.
    • 명확한 파라미터가 있어 쉘 명령어를 외울 필요가 없습니다.
  • 부가 정보도 확인 가능합니다.
    • 이 명령어가 수행되어서 실제로 변경이 되었는지 등을 확인 가능합니다.
  • 리눅스 배포판간 호환성 보장이 됩니다.
    • 하나의 앤서블 파일 혹은 명령어로 서로 다른 리눅스 배포판에서 호환이 가능합니다.
    • 쉘 스크립트는 결국 배포판에 맞게 명령어를 작성해야하니 호환하기가 어렵습니다.

자 그럼 이제 이 모듈을 통해서 계정 추가를 진행해보겠습니다.

2-2. user 모듈로 계정 추가

ansible에선 user라는 모듈이 계정 추가/삭제 기능을 지원하고 있습니다.
이 모듈을 사용해서 다음과 같이 명령어를 수행하면 계정이 생성됩니다.
(앤서블 서버에선 root계정 상태입니다.)

ansible all -m user -a "name=jojoldu" -u ec2-user
  • -m user
    • 사용할 모듈 (Module) 을 지정합니다.
    • 여기서는 앤서블의 user 모듈을 사용합니다.
  • -a "name=jojoldu"
    • user 모듈에 사용될 파라미터를 지정합니다.
    • user 모듈에는 name 이라는 기본 파라미터가 있습니다.
    • 이 name 파라미터가 실제 생성될 계정명을 나타냅니다.
    • 파라미터=값 으로 지정하면 해당 모듈에서 값을 인식해서 사용됩니다.

명령어를 수행하시면 아래와 같이 권한 거부 에러가 발생합니다.

1

이는 현재 호스트 접근 계정인 ec2-user에 sudo 권한이 없기 때문입니다.
이를 해결하기 위해 ec2-user가 아닌 root 계정으로 접근하기엔 부담스럽습니다.

그래서 명령어를 수행할때마다 sudo 가 함께 수행될 수 있게 설정값을 추가해보겠습니다.

아래 명령어로 ansible.cfg 을 열어서

sudo vim /etc/ansible/ansible.cfg

아래와 같이 [privilege_escalation] 항목을 설정합니다.

[privilege_escalation]
become=True

2

  • ansible.cfg은 앤서블의 설정 파일입니다.
  • /etc/ansible/ansible.cfg 은 글로벌 설정 파일입니다.
    • 우선 순위가 가장 낮습니다.
    • 이보다 높은 우선 순위는 현재 디렉토리 (ansible.cfg), 현재 사용자의 홈 디렉토리 (~/.ansible.cfg) 이 있습니다.
    • 글로벌 설정을 피하고 싶다면 위 설정 위치를 사용하시면 됩니다.

설정이 다 되셨다면 다시 명령어를 수행해봅니다.

3

정상적으로 계정이 생성된 것을 확인할 수 있습니다!

실제로 각 서버에 계정이 추가되었는지 확인도 ansible로 해봅니다.

ansible all -m shell -a "tail -n 1 /etc/passwd" -u ec2-user

그럼 다음과 같이 home 디렉토리에 계정이 추가된 것을 확인할 수 있습니다.

4

2-3. 임의 추가된 계정 삭제하기

다음으로 방금 추가한 계정을 삭제해보겠습니다.

삭제는 간단합니다.
기존 계정 생성 명령어에 state=absent remove=yes 만 추가하면 됩니다.

ansible all -m user -a "name=jojoldu state=absent remove=yes" -u ec2-user

5

다시 삭제되었는지 확인 해봅니다.

6

더이상 마지막 계정 표기에 jojoldu가 아닌 ec2-user만 노출된다면 정상적으로 삭제 된 것입니다.

테스트로 추가된 계정은 이렇게 삭제하면 되겠죠?

2-4. 패스워드 추가하기

자 그럼 계정을 생성하고 해당 계정에 비밀번호를 추가해보겠습니다.
(기존 계정의 비밀번호 변경도 같은 방법으로 가능합니다.)

2-2에서 계정을 삭제했다면 다시 같은 계정을 생성해주시고, 삭제하지 않으셨다면 그대로 진행하시면 됩니다.

아래 명령어로 본인이 원하는 비밀번호로 변경합니다.

ansible all -m user -a "name=jojoldu update_password=always password={{ '변경하고싶은 비밀번호' | password_hash('sha512') }}" -u ec2-user

저는 간단하게 1234 라는 비밀번호를 사용했습니다.

7

비밀 번호가 추가되었으면 한번 확인해보겠습니다.
호스트 서버들에 접속하신뒤 신규 생성 (+비밀번호가 추가된) 계정으로 로그인해봅니다.

8

제가 사용한 ec2 접속기는 ec2-gauza 입니다.
자세한 설치법은 이전 포스팅을 참고해주세요.

로그인이 잘 되신다면 비밀번호가 정상적으로 추가 된 것입니다!

2-5. sudo 권한 추가

마지막으로 신규 추가된 계정에 sudo 권한을 추가해보겠습니다.

기본적으로 리눅스의 경우 sudo 권한이 필요할시에 /etc/sudoers 파일에 계정을 추가해서 사용합니다.

다만, 이 파일이 너무 크리티컬한 파일이라서 잘못 수정했다가는 서버를 포맷해야되는 일이 발생할 수 있습니다.

그래서 직접 이 파일을 손대지는 않고, 계정만 안전하게 추가할 수 있는 방법이 있습니다.

바로 /etc/sudoers.d/ 에 계정의 권한을 가진 파일을 추가하는 것입니다.

해당 디렉토리에 포함된 파일이 아래와 같은 양식을 가지면 해당 계정은 sudo를 실행할 수 있습니다.

계정명 ALL=(ALL) NOPASSWD:ALL
  • 여기서 NOPASSWD:ALLsudo 실행시 패스워드를 입력받지 않겠다는 의미입니다.

실제로 본인의 서버에서 한번 확인해보시면 다음과 같이 root 계정이 등록되있는 것을 확인할 수 있습니다.

9

그래서 원래의 구조라면 모든 호스트 서버에 접속하여 아래의 명령어를 수행해야만 합니다.

echo 'jojoldu   ALL=(ALL)   NOPASSWD:ALL' > /etc/sudoers.d/jojoldu

하지만 앤서블을 사용하게 되면 한번에 가능합니다.
위의 쉘 명령어를 그대로 앤서블 쉘 명령어로 사용하면 아래와 같습니다.

ansible all -m shell -a "echo 'jojoldu   ALL=(ALL)   NOPASSWD:ALL' > /etc/sudoers.d/jojoldu"

하지만 실제 업무에서 위와 같이 쉘 명령어를 쓰진 않습니다.
이유는 글 최상단에서 한번 언급했으니 다시 참고하셔도 좋습니다.

최대한 앤서블이 지원하는 모듈로 해결합니다.
그래서 앤서블이 지원하는 파일 복사 모듈을 쓰면 다음과 같습니다.

ansible all -m copy -a "content='jojoldu ALL=(ALL) NOPASSWD: ALL' dest=/etc/sudoers.d/jojoldu mode=0644 validate='/usr/sbin/visudo -c -f \'%s\''"
  • copy
    • 앤서블의 파일 복사 모듈입니다.
  • content
    • 복사할 문자열 파라미터입니다.
    • 해당 문자열을 지정된 (dest) 곳으로 복사합니다.
    • 보통은 A 라는 파일을 복사하는데 이때는 src 파라미터를 사용하면 됩니다.
  • dest
    • 복사할 위치입니다.
    • content에 있는 내용을 각 호스트 서버의 /etc/sudoers.d/jojoldu 로 복사합니다.
  • mode
    • 복사할 파일의 권한을 관리합니다. (chmod를 생각하시면 됩니다.)
  • validate
    • 복사하기 전에 실행할 유효성 검사 명령입니다.
    • 유효성을 검사 할 파일의 경로는 '%s' 로 전달됩니다.
    • 쉘 명령어나 파이프라인 (|) 등이 수행되지 않도록 보호합니다.

위 명령어를 수행해보시면 아래와 같이 각 호스트에 파일 복사가 잘 이루어졌음을 알 수 있습니다.

10

그리고 호스트 서버에 접근해서 신규 계정으로 root 계정 변환을 시도해보면!

11

비밀번호 없이 잘 변경된 것을 확인할 수 있습니다.

2-6. 마무리

이번 시간에는 앤서블 CLI로 계정을 추가하는 모든 과정을 진행했습니다.
다음 시간에는 이 앤서블 CLI를 플레이북으로 변경하는 과정을 진행해보겠습니다.

반응형