본문 바로가기
Skills/IaC

Ansible 설치 및 SSH ProxyCommand 적용방법

by 부르르 2021. 3. 17.

ansible은 SSH기술을 이용하여 원격지 서버에 구성관리 할수 있도록 지원하는 도구이다.

ansible과 SSH ProxyCommand 옵션을 이용하면, ssh 접속이 가능한 공인망과 내부망 자원에 대해 구성관리가 가능하다.

크게 두 단계로 요약이 가능하다

  1. ansible이 ssh config 파일을 참조하도록 한다.
  2. ssh config 에 호스트 접속정보 (ip, user, port, private key, proxycommand) 를 정의한다.

1. Ansible 서버 생성

  • OS: CentOS 7.6
  • Spec: 1core X 2GB
  • Public IP: 211.254.212.35
  • Port: 22

2. Ansible 설치 및 버전 확인

[root@kgh-ansible ~]# yum -y install ansible
[root@kgh-ansible ~]# ansible --version
ansible 2.9.13
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.8/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.8.5 (default, Nov  1 2020, 01:23:35) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

3. ansible.cfg 수정

[root@kgh-ansible ~]# vim /etc/ansible/ansible.cfg
[defaults]
host_key_checking = False
remote_user = root

[ssh_connection]
ssh_args = -F /root/.ssh/config -o ControlMaster=auto -o ControlPersist=30m -o ForwardAgent=yes
control_path = /root/.ssh/ansible_test-%%r@%%h:%%p

host_key_checking: target 서버의 host_key 확인 여부

remote_user: ansible 사용할 시스템 계정 (공식 문서에 따르면 root보단 ansible 전용 계정 생성 권장함)

ssh_args: ssh 인수 참조할 파일 및 옵션 설정

-F /root/.ssh/config : config file 을 /root/.ssh/config로 지정 .ssh 인수를 참조하는 파일
-o ControlMaster=auto : 자동으로 하나의 네트워크 연결로 여러 세션을 공유
-o ControlPersist=30m : 30분동안 초기 연결이 닫혀도 세션이 유지 되도록 설정
-o ForwardAgent=yes : 인증 에이전드에 대한 연결을 전달

control_path: ControlPath 소켓을 저장하는 곳을 지정

4. sftp로 key.pem 파일 업로드 및 퍼미션 설정

개인 PC에서 Ansible 서버로 key.pem 파일 업로드한다.

# sudo sftp -P 22 -i ~/mykey.pem root@211.254.212.35
sftp> put <파일경로/key.pem>
sftp> quit

Ansible 서버에서 key.pem 파일 권한 변경

[root@kgh-ansible ~]# chmod 400 kgh-zabbix-key.pem

5. vim ~/.ssh/config 생성 및 편집

[root@kgh-ansible ~]# vim /root/.ssh/config

jump 서버 및 target 서버 설정. 특히 target 서버의 경우 ProxyCommand 설정 꼭 해줌

Host jump
    HostName 211.253.26.189
    User root
    Port 22
    IdentityFile /root/kgh-zabbix-key.pem

Host target
    HostName 10.28.13.13
    User root
    Port 22
    IdentityFile /root/kgh-zabbix-key.pem

jump 서버를 통한 target 서버 Proxy 테스트

[root@kgh-ansible ~]# ssh -o ProxyCommand='ssh -W %h:%p root@jump' root@target
Last login: Tue Sep 15 00:42:10 2020 from 10.28.13.9
[root@kgh-agent ~]# exit
logout
Connection to 10.28.13.13 closed.
Killed by signal 1.
[root@kgh-ansible ~]#

target 호스트 마지막에 ProxyCommand 설정 추가

Host jump
    HostName 211.253.26.189
    User root
    Port 22
    IdentityFile /root/kgh-zabbix-key.pem

Host target
    HostName 10.28.13.13
    User root
    Port 22
    IdentityFile /root/kgh-zabbix-key.pem
    ProxyCommand ssh -W %h:%p jump

6. Ansible 인벤토리 편집

[root@kgh-ansible ~]# vim /etc/ansible/hosts
[jumps]
jump ansible_ssh_host=jump

[targets]
target ansible_ssh_host=target

7. Ansible Ad-hoc 테스트

Ad-hoc 커맨드를 이용해서 해당 host에 접속해 명령어 실행 및 응답 확인

[root@kgh-ansible ~]# ansible targets -m shell -a "hostname"
target | SUCCESS | rc=0 >>
kgh-agent

8. Ansible Playbook 작성 (test.yml)

---
- name: Edit file
  become: true

  tasks:
  - name: modify line
    replace:
      path: $HOME/test_conf/test.conf
      regexp: "Server IP="
      replace: "# Server IP="

9. Ansible Playbook 실행

[root@kgh-ansible ~]# ansible-playbook --limit target ~/proj/testproj/test.yml
[WARNING]: Invalid characters were found in group names but not replaced, use
-vvvv to see details

PLAY [Edit File] *****************************************************************

TASK [Gathering Facts] ***********************************************************
ok: [target]

TASK [modify line] *****************************************************
changed: [target]

PLAY RECAP ***********************************************************************
target                     : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

10. Target 서버에 접속해서 확인

Ansible Playbook 실행 전

[root@kgh-agent ~]# cat ~/test_conf/test.conf
Server ip = 123
Server IP= 123
Server IP= 123
Server IP = 123
server ip= 123
serverip=123
 server ip=123
 Server IP =123

Ansible Playbook 실행 후

[root@kgh-agent ~]# cat ~/test_conf/test.conf
Server ip = 123
# Server IP= 123
# Server IP= 123
Server IP = 123
server ip= 123
serverip=123
 server ip=123
 Server IP =123

참고문헌

 

 

 

728x90
반응형

댓글