ansible은 SSH기술을 이용하여 원격지 서버에 구성관리 할수 있도록 지원하는 도구이다.
ansible과 SSH ProxyCommand 옵션을 이용하면, ssh 접속이 가능한 공인망과 내부망 자원에 대해 구성관리가 가능하다.
크게 두 단계로 요약이 가능하다
- ansible이 ssh config 파일을 참조하도록 한다.
- 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
참고문헌
댓글