ansible.cfg 파일이란?

ansible 엔진은 ansible 명령을 실행할 때 모든 환경설정 및 세팅이 들어있는 ansible.cfg를 참고하여 명령을 실행한다. 

 

 

ansible.cfg 파일 사용하기

ansible 엔진은 ansible 명령을 실행할 때 모든 환경설정 및 세팅이 들어있는 ansible.cfg를 참고하여 명령을 실행한다. 이 ansible.cfg 파일은 여러 위치에 있을 수 있고, ansible 엔진은 아래 명시된 순서대로 구성파일을 확인한다. 그리고 가장 먼저 확인된 파일을 사용한다.  즉, 여러개가 있어도 우선순위 가장 높은걸 쓰고 다른 것은 무시된다.

 

1. ansible 명령이 실행되는 디렉토리에 있는 ansible.cfg 파일 (보통 이걸 많이 쓰는 듯 하다)

2. 홈디렉토리/.ansible.cfg : ansible은 사용자의 홈디렉토리에서 ansible.cfg를 찾는다. 이게 없으면 default 구성파일을 사용한다. (홈디렉토리의 특성상 파일의 맨 앞에 . 이 붙는다. 이렇게 숨김파일로 하는 것은 관례적으로 하는 것이며 계정의 설정파일은 대부분 히든파일로 되어 있는것도 같은 맥락이다. 특정 유저 홈디렉토리의 bashrc는 숨김파일이지만, /etc/bashrc는 그냥 파일이다.)

3. /etc/ansible/ansible.cfg : default 구성 파일. 다른 구성 파일이 없는 경우 사용된다.

 

이를 통해 관리자는 다양한 환경이나 프로젝트가 별도의 디렉토리에 저장되는 디렉토리 구조를 생성할 수 있고, 각 디렉토리에는 고유 설정 집합으로 맞춤화된 구성파일이 포함된다. 

 

또한 ansible.cfg 파일은 변경한 후 따로 서비스 등을 재시작할 필요가 없으며 변경하고 저장하면 바로 적용된다.

 

 

 

# 참고 : 설정의 default값은?

- 일반적으로, conf 파일에서 주석처리된 기본 내용이 default 값으로 보면 된다. (ansible.cfg 뿐만 아니고 다른 conf도)

- 아래처럼 /etc/ansible/ansible.cfg 은 ansible 설치시 생성되는 가장 근본이 되는 cfg파일이며, 여기에 많은 예시와 default 값들이 명시되어 있다.

 

현재 사용하고 있는 인벤토리 파일, ansible.cfg파일 확인하기

ansible --version 명령을 사용하여 현재 사용하고 있는 ansible.cfg가 어떤 파일인지 확인할 수 있다. 아래 config file = 부분을 확인하면 된다.

 

명령어에서 -v 옵션을 쓰면, 어떤 구성파일을 쓰고 있는지 확인할 수 있다.

예시 : ansible all -i /ansible_test/inventory -v --list-hosts

 

 

 

ansible.cfg 구성파일 내용

ansible.cfg에는 크게 2가지 섹션이 있다. 

 

- [default]  : ansible 작업의 기본 환경설정 값을 구성
- [privilege_escalation] : 관리 호스트에서 ansible이 권한 에스컬레이션을 수행하는 방법을 구성

 

[default]

inventory = ./inventory

사용할 인벤토리 파일의 경로
- 정적 인벤토리 파일 또는 여러개의 정적 인벤토리 파일이 있는 디렉토리를 명시
- 동적 인벤토리 스크립트를 포함하는 디렉토리 명시

remote_user = user

관리 호스트에 연결할 사용자의 이름. 관리 호스트에서 사용하므로 관리 호스트에 해당 유저가 존재해야 한다.
이 구문을 따로 명시하지 않으면 ansible은 ansible 명령을 실행하는 로컬 사용자명을 사용하여 관리 호스트에 연결한다. 따라서 다른 원격 사용자를 지정하려면 여기에 해당 유저명을 넣는다.
또한 여기서 명시된 유저를 사용하여 [privilege_escalation]을 적용한다. (물론 명시하지 않으면 ansible 명령을 실행하는 로컬 사용자 이름을 사용한다)

ask_pass = false

ssh암호를 요청하는 메시지 표시 여부를 결정
제어노드에서 관리 호스트에 연결할 사용자에 대해 인증할 수 있는 키가 구성된 경우 따로 비밀번호를 물어보지 않고 자동으로 로그인된다. 이런 경우에는 ssh 암호를 요청할 필요가 없으므로 false로 설정한다. default는 false 이다.
위 경우가 아닌, 비밀번호를 입력해야 하도록 설정된경우, true로 설정하여 로컬 사용자에게 원격 사용자가 사용하는 암호를 요청하는 메시지가 표시하도록 해야 한다. 만약 비밀번호를 써야하는데 false로 되어있으면, 아예 비밀번호를 입력할 기회 자체가 없어진다.

 

[privilege_escalation] 

become = true

remote_user로 연결한 유저를 sudo 또는 su를 사용하여 특정 상급 유저로 전환할지 여부
사용하는 모듈에 따라 원래 유저의 권한만으로 충분할 수도 있고, 상급유저(root)의 권한이 필요할 수도 있다. 이에 따라 true/false가 달라질 것이다. 상급 유저로 전환하려면, true를 설정한다. default 값은 false이다.
다만, 이렇게 설정해도 ansible 명령 또는 ansible-playbook 실행 시 다양한 방법으로 이를 재정의할 수 있다. 예를 들어 특정 ansible-playbook은 권한 상승이 필요없는 경우 false로 재정의할 수 있다. 이 방법은 이후에 다시 설명한다.

become_method = sudo

상급 유저로 전환하는 방법을 명시한다.
default는 sudo이고, su는 옵션이다. 일반적으로 sudo 그대로 사용한다.

become_user = root

상급 유저로 전환할 때, 어떤 유저로 전환할지 명시한다.
default는 root 이다.

become_ask_pass = false

become_method의 암호를 요청하는 메시지 표시 여부
default는 false 이다. 상급 유저로 전환할 때 sudoers 설정을 따로 하지 않아 상급유저의 암호를 입력해야 한다면, 이 값을 true로 해야 한다. 위 [inventory] 항목에서 remote_user 로 설정한 유저가 sudo 권한이 있다면 이 값은 false로 하면 된다.

* 구성파일 내에서 주석 사용하기

- ansible .cfg 구성파일은 #와 ; 로 주석을 사용할 수 있다.

- # 는 줄 맨앞에 넣으며 전체 줄을 주석처리한다.

- ; 는 해당 줄에서 ; 의 오른쪽에 있는 모든 내용을 주석처리한다.

 

 

제어노드에서 관리호스트로 연결하고 task를 실행하는 과정

* ansible.cfg 예시파일

[defaults]
remote_user = jason
inventory = /home/jason/ansible/inventory
roles_path = /home/jason/ansible/roles:/usr/share/ansible/roles
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false

 

* 절차

1. 제어노드에서 jason라는 유저명으로 관리호스트에 ssh 접속을 수행한다.

2. 키가 설정되어있다면, 비밀번호를 입력하지 않고 바로 로그인되고, 키가 설정되어 있지 않다면 비밀번호를 물어본다. (비밀번호 입력 부분)

3. 로그인을 완료했으면, ansible에서 명시한 task를 실행할 때 root 권한의 sudo를 사용하여 실행한다.

4. 관리호스트의 sudoers에서 jason 유저에 대해 비번 없이 sudo를 사용할 수 있도록 설정했다면 바로 task 가 실행된다.

5. 따로 sudoers의 설정을 하지 않았다면, sudo 실행시 jason의 비밀번호를 물어본다. (비밀번호 입력 부분)

 

위 순서대로 연결하여 task를 실행하므로, 비밀번호를 2번 물어볼 수 있는 상황이 있다. 일반적으로 운영에서 사용할 때, 편의를 위해 ansible 명령어를 쳤을 때 어떤 비밀번호도 입력하지 않도록 하기를 원할 것이다. 따라서 둘다 비밀번호를 물어보지 않게 하기 위해 2가지 설정을 한다.

 

1. 제어노드에서 ssh 키설정으로 비밀번호를 물어보지 않도록 한다.

2. 관리호스트에서 sudoers를 적절히 설정하여 비밀번호를 물어보지 않도록 한다.

 

이후 실제 운영에서는 필요에 따라 위 설정을 수행할수도 있고 하지 않을수도 있다. 이 강의의 예제에서는 이 설정들을 기본적으로 적용한 것으로 간주하고 예제를 수행한다.

 

 

비밀번호를 묻지 않도록 설정하기 - ssh 키 설정

관리 호스트에서 리눅스 제어노드와 openssh를 사용한다면, ssh 키 기반 인증을 설정할 수 있다. 이렇게 하여 ask_pass = false 설정을 하고, 비밀번호를 따로 입력하지 않고 넘어갈 수 있다.

 

 

1. ansible을 사용할 유저로 로그인한 후, 현재 ~/.ssh 에 값이 있는지 확인한다.

- devops 계정을 사용하며, ~/.ssh 디렉토리는 없다.

 

2. ssh-keygen 명령을 실행한다.

- 실행 후 그냥 엔터 엔터 엔터로 진행하면 된다. 아래와 같이 결과를 확인할 수 있다.

- 또한 아래 경로에 두개의 파일이 생성되는 것을 확인할 수 있다.

id_rsa : private key (열쇠로 생각하면 된다. 접속을 시도하는 호스트가 가지고 있다)

id_rsa.pub : public key (열쇠구멍이라고 생각하면 된다. 접속을 당할 클라이언트에 해당 파일이 있어야 한다)

 

 

3. public key를 접속할 서버에 복사하기

- # ssh-copy-id 유저@서버주소

- 여기서 유저는 ansible에서 사용당할 서버의 유저, 즉 remote_user = 에 명시되는 유저이다.

- 아래 예제에서는 해당 유저를 jason으로 설정한다. (이 유저는 ansible host가 아닌, ansible client에 있는 유저이다)

- 명령어 입력 후 yes를 입력하고, jason의 비밀번호를 입력한다.

- 위와 같이 완료 후, ansible-client1의 jason 계정 홈디렉토리에 들어가면, .ssh가 새로 생긴 것을 확인할 수 있다.

- .ssh에 들어가면, authorized_keys 라는 파일이 있는 것을 확인할 수 있는데, 이 파일은 ssh-keygen으로 만든 id_rsa.pub와 동일한 내용이다. 즉 public key가 ansible-client1 서버 안에 있는 jason 유저에 저장된 것이다. 

 

4. 접속 테스트

- 이제 ansible host에서 ansible-client1에 접속할 때 아래와 같이 jason계정으로 접속하면, 비밀번호 입력 없이 그대로 접속되는 것을 확인할 수 있다.

- 이렇게 다 되었으면, ansible.cfg에서 remote_user = jason 으로 설정하여 ansible에서 해당 유저 사용 시 비밀번호를 입력하지 않고 명령을 수행할 수 있다.

 

# 참고

localhost 즉 앤서블호스트인 자기자신도 ansible에서 사용하기 위해서는 ansible 호스트에 해당 유저를 생성하고, 그 유저에 대해서 키를 동일하게 복사해주어야 한다. 그리고 ssh jason@localhost 이런식으로 접속 테스트를 수행하면 된다. 

 

 

비밀번호를 묻지 않도록 설정하기 - sudo 설정

RHEL에서는 기본적으로 /etc/sudoers에서 wheel 그룹의 모든 사용자에게 자신의 암호로 sudo를 사용하여 root 권한으로 명령을 실행할 수 있는 기능이 있다. 여기서는 특정 유저가 아예 비밀번호를 쓰지 않고 sudo 명령을 써서 root 권한으로 명령을 실행하도록 설정한다. 이 부분은 ansible.cfg파일의 become = true 부분과 연관이 있다.

 

또한 이러한 권한 상승 방법은 보안상의 영향을 충분히 고려해야 한다. 조직 및 배포 방식에 따라 고려해야 할 장단점이 서로 다를 수 있으므로 운영 장비에서는 심도있게 고려해야 한다.

 

 

1. ansible로 관리 당할 호스트의 root 유저로 아래와 같이 수행한다.

- # vi /etc/sudoers.d/jason(유저명)

- 다음과 같이 입력한다. jason ALL=(ALL) NOPASSWD:ALL (아래 캡쳐 참조)

- 이렇게 하면, 해당 유저는 암호를 입력하지 않고 sudo를 사용하여 root권한으로 명령을 실행할 수 있다.

 

2. sudo 명령으로 테스트해본다.

- /proc/vmallocinfo 는 루트만 읽을 수 있다. 이 파일로 테스트해보자. (아래 캡쳐 참조)

- 이렇게 다 되었으면, ansible.cfg 파일의 become = true 를 설정하여 권한상승을 할 때 비밀번호를 물어보지 않는다.

 

실습 : 테스트 수행

<인벤토리>

 

[servers]

web.example.com

db.example.com

was.example.com

localhost

 

<ansible.cfg>

 

[defaults]

inventory = inventory

remote_user = jason

ask_pass = false

 

[privilege_escalation]

become = true

become_method = sudo

become_user = root

become_ask_pass = false

 

# 참고 : 접속할 모든 클라이언트는 최초로 한번은 직접 ssh로 접속을 해서 yes를 입력해줘야 한다.

 

명령어 : ansible all -m ping

위의 모든 설정을 완료하고 방화벽에 문제가 없다면 이렇게 잘 나올 것이다. 참고로, 이 ping 모듈은 icmp ping이 아니다.

 

 

 

 

# 참고 : 패스워드를 입력하도록 설정하는 경우, ansible 클라이언트의 유저들은 패스워드를 모두 통힐해야 하는 것으로 보인다.

클라이언트 4대에 대해 각각 패스워드를 다르게 하고, 명령을 실행하면 패스워드를 물어보는데, 한번만 입력하며 그 패스워드 하나를 전체 클라이언트에 적용한다. 첫번째 것 맞는것만 들어가고 아래는 다 incorrect password가 뜬다.

 

참고 도움말 페이지

ansible(1)

ansible-config(1)

ssh-keygen(1)

ssh-copy-id(1)

 

구성파일 : ansible 설명서

https://docs.ansible.com/ansible/2.7/installation_guide/intro_configuration.html

 

Configuring Ansible — Ansible Documentation

Docs » » Configuring Ansible You are reading an unmaintained version of the Ansible documentation. Unmaintained Ansible versions can contain unfixed security vulnerabilities (CVE). Please upgrade to a maintained version. See the latest Ansible documentat

docs.ansible.com

 

'Ansible' 카테고리의 다른 글

6장. ansible에서 모듈 사용하기  (0) 2021.02.19
5장. ad-hoc 명령  (0) 2021.02.19
3장. Inventory 파일  (2) 2021.02.06
2장. Ansible 설치하기  (0) 2021.02.06
1장. Ansible 소개  (0) 2021.02.06

+ Recent posts