변수파일에서 패스워드 부분
암호화 처리가 필요
암호화 -> CPU를 많이 사용 -> 필요한 부분만 암호화 -> 재사용 기법 사용
파일, 일부 텍스트를 암호화
관리 노드 접속 -> 키 쌍 인증
[vagrant@controller ~]$ ansible-vault create -h
optional arguments:
--ask-vault-pass ask for vault password
--vault-password-file VAULT_PASSWORD_FILES
#ansible-playbook 에도 볼트와 관련된 옵션들이 존재
[vagrant@controller ~]$ ansible-playbook -h
optional arguments:
--ask-vault-pass ask for vault password
--vault-id VAULT_IDS the vault identity to use
--vault-password-file VAULT_PASSWORD_FILES
AES 알고리즘 사용 (대칭키)
키는 나만 가지고 있으면 됨
컨트롤 노드에 플레이북에서 참조하는 파일들이 존재 -> 내 컴퓨터에 저장
실제 실행 시에는 풀어서 실행 -> 암호화된 데이터를 메모리에 올리고 메모리에서 풀기 -> 플레이북 실행
네트워크는 발생하지 않고 내 컴퓨터에서 실행되기 때문에 대칭키를 사용해도 무방
속도 비교 대칭키는 공개키보다 월등히 빠르다 -> 반대로 공개키는 대칭키에 비해 월등히 성능이 느려짐 -> 수학적인 알고리즘 때문에 -> 암호화 복호화 하는 키가 다르기 때문에 비용이 들어서
ansible-vault [SUB-COMMAND] <FILE>
암호화할 빈 파일을 생성
[vagrant@controller vault]$ ansible-vault create a.yaml
New Vault password:
Confirm New Vault password:
[vagrant@controller vault]$ cat a.yaml
$ANSIBLE_VAULT;1.1;AES256
64656462623230313931313839353863376266353035386337393837323631383163396361316131
6631343335303666393439666464656233316465613063330a353762323230373065633934393065
암호화 되어 있음 -> 직접 수정해서는 안됨
암호화 된 파일을 보기
[vagrant@controller vault]$ ansible-vault view a.yaml
Vault password:
- hosts: 192.168.100.11
tasks:
- debug:
msg: hello world
암호화된 파일 수정
[vagrant@controller vault]$ ansible-vault edit a.yaml
Vault password:
암호화된 파일 암호화 해제
[vagrant@controller vault]$ ansible-vault decrypt a.yaml
Vault password:
Decryption successful
[vagrant@controller vault]$ cat a.yaml
- hosts: 192.168.100.11
tasks:
- debug:
msg: hello world
기존 파일 암호화
[vagrant@controller vault]$ ansible-vault encrypt a.yaml
New Vault password:
Confirm New Vault password:
Encryption successful
[vagrant@controller vault]$ cat a.yaml
$ANSIBLE_VAULT;1.1;AES256
39373862393762613234346535356536393436356363373238306466313436393431656538353338
6662643565346432376264353930666664313030393035340a613835663363386137666262336633
암호화된 파일의 비밀번호 재설정
[vagrant@controller vault]$ ansible-vault rekey a.yaml
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful
--ask-valult-pass 기본 옵션
[vagrant@controller vault]$ echo "P@ssw0rd" > vaultpass
[vagrant@controller vault]$ cat vaultpass
P@ssw0rd
$ ansible-vault [SUB-COMMAND} <FILE> --vault-password-file vaultpass
$ ansible-vault rekey --help
optional arguments:
-new-vault-password-file NEW_VAULT_PASSWORD_FILE
new vault password file for rekey
$ ansible-vault rekey a.yaml --vault-password-file valutpass --new-vault-passwod-file newvaultpass
ssh 접속을 위해 배스쳔을 두듯이 앤서블 컨트롤러를 공동으로 사용하는 경우
sudo 권한이 가능한 시스템은 다른사람 사용자에게 접근할 수 있음
루트 안주면 좋지만 어쩔수없이 줘야할 때 -> 패스워드파일이 보안상 좋지 않을수도 있음
$ more /etc/ansible/ansible.cfg
---
# If set, configures the path to the Vault password file as an alternative to
# specifying --vault-password-file on the command line.
#vault_password_file = /path/to/vault_password_file
---
[vagrant@controller vault]$ vi ansible.cfg
[defaults]
vault_password_file = vaultpass
-vault-password-file vaultpass 옵션 없이 사용가능
ansible.cfg
암호파일을 숨김파일 지정후
[defaults]
vault_password_file = ./.vaultpass
.vaultpass
P@ssw0rd
암호파일의 소유자만 사용가능하도록 권한 설정
chmod 600 .vaultpass
ansible-playbook plaintext.yaml --ask-vault-pass
ansible-playbook plaintext.yaml --vault-password-file <File>
[vagrant@controller ~]$ ansible-playbook -h
optional arguments:
--ask-vault-pass ask for vault password
--vault-id VAULT_IDS the vault identity to use
--vault-password-file VAULT_PASSWORD_FILES
특정 값을 암호화 -> 변수를 암호화 하려고 할 때 많이 사용
[vagrant@controller vault]$ ansible-vault encrypt_string
New Vault password:
Confirm New Vault password:
Reading plaintext input from stdin. (ctrl-d to end input)
hello world
!vault |
$ANSIBLE_VAULT;1.1;AES256
36313965353138363262383633613563646136643263393531343538313439323162643234353862
6635313861363435343536303535313137396331373833350a396637666334613663663739343166
34326563336666303330613364653735363963303437366465616464356463383939633461313038
3633363063383633320a373561646261656162346636336134343631323436663565366437356630
6262
Encryption successful
원하는 내용 입력후 [ctrl+d] 2번 or [enter][ctrl+d]
!부터의 내용을 전부 복사
test.yaml
- hosts: 192.168.100.11
vars:
message: !vault |
$ANSIBLE_VAULT;1.1;AES256
36313965353138363262383633613563646136643263393531343538313439323162643234353862
6635313861363435343536303535313137396331373833350a396637666334613663663739343166
34326563336666303330613364653735363963303437366465616464356463383939633461313038
3633363063383633320a373561646261656162346636336134343631323436663565366437356630
6262
tasks:
- debug:
msg: "{{message}}"
변수에 암호화된 내용 붙여넣기
그냥 실행하면 복호화 할수 없다고 뜸
[vagrant@controller vault]$ ansible-playbook test.yaml
TASK [debug]
fatal: [192.168.100.11]: FAILED! => {"msg": "Attempting to decrypt but no vault secrets found"}
ansible.cfg에 암호파일을 지정해두었다면 상관없지만 파일을 지정하지 않아 위처럼 에러가 난다 -> 암호를 질의하여 실행 -> string 암호화 할때 썻던 비밀번호 입력
[vagrant@controller vault]$ ansible-playbook test.yaml --ask-vault-pass
Vault password:
TASK [debug]
ok: [192.168.100.11] => {
"msg": "hello world\n"
}
test.yaml
- hosts: 192.168.100.11
vars:
var.yaml
tasks:
- debug:
msg: "{{message1}} {{message2}"
var.yaml
message1: !vault |
$ANSIBLE_VAULT;1.1;AES256
30373636666531636139656666663036646335646466323863383639616131353538303530353561
3830373463346233376363313837386137653136326366340a376461633232633636323232316463
35376137386361616138666235323931376138336232343338396330376639346561343436353732
6161343565363930650a333832613134386334323764323333356235643139626261333039373236
3032
message2: !vault |
$ANSIBLE_VAULT;1.1;AES256
36646134343530303937666466343065333034323065353238343032353536636230316133633030
3938653064323162373665373661356665653636343336660a323634616136613661363136623238
66366334336463663237346530383061363830343732636530356639316161666262663232313064
6262346632626463390a306435313830316161393331306135656261376132373664643236653166
3366
두 변수에는 hello, world라는 단어를 각각 다른 패스워드로 암호화하여 저장
실행하게 되면 하나의 패스워드만 입력할 수 있기 때문에 하나는 복호화 하지못하여 결과적으로 실행이 불가 -> 그렇다면?! 멀티패스워드
--vault-id 옵션 사용
--vault-id rable@source
rable을 id로 이해하면 쉬움
id를 사용하여 다른 패스워드를 사용할수 있도록 만들어줌
관련 내용
test.yaml
- hosts: 192.168.100.11
vars_files:
- var1.yaml
- var2.yaml
tasks:
- debug:
msg: "{{ message1 }} {{ message2 }}"
echo "message1: hello" > var1.yaml
echo "message2: world" > var2.yaml
파일을 id와 함께 각각 다른 비밀번호로 설정
ansible-vault encrypt var1.yaml --vault-id user1@prompt
New vault password (user1):
Confirm new vault password (user1):
Encryption successful
ansible-vault encrypt var2.yaml --vault-id user2@prompt
New vault password (user2):
Confirm new vault password (user2):
Encryption successful
--vault-id user1@prompt 옵션을 실행시에도 적용시켜 각각 비밀번호를 묻게하여 복호화
ansible-playbook test.yaml --vault-id user1@prompt --vault-id user2@prompt
[vagrant@controller vault]$ ansible-playbook test.yaml --vault-id user1@prompt --vault-id user2@prompt
Vault password (user1):
Vault password (user2):
TASK [debug]
ok: [192.168.100.11] => {
"msg": "hello world"
}
test.yaml
은 prompt 사용시와 동일
echo "message1: hello" > var1.yaml
echo "message2: world" > var2.yaml
echo "P@ssw0rd1" > user1pass
echo "P@ssw0rd2" > user2pass
# 보안상 권한은 설정하는 것이 좋음
chmod 600 user1pass
chmod 600 user2pass
ansible-vault encrypt var1.yaml --vault-id user1@user1pass
ansible-vault encrypt var2.yaml --vault-id user1@user2pass
# file 사용시 source는 파일명으로 지정
ansible-playbook test.yaml --vault-id user1@user1pass --vault-id user1@user2pass
ansible.cfg
[defaults]
vault_identity_list = user1@user1pass, user2@user2pass
복호화
ansible-vault view var2.yaml
ansible-playbook test.yaml
암호화
ansible-vault create var3.yaml --encrypt-vault-id user1
absible-vault encrypt var3.yaml --encrypt-vault-id user1
Ansible 위에 구축된 웹 기반의 인터페이스
목적: 실행 / 모니터링
AWX : RedHat Ansible Tower 제품 Upstream(뭐를 가지고 만드느냐)
- CentOS --up --> RHEL --up --> Fedora ( ~ Centos7)
레드햇은 페도라 리눅스를 만들고 안정화된 패키지구조로 안전버전안 rhel를 만듬 rhel로 centos를 만듬
국내에서 많이 사용하는 이유는 rhel과 레드햇 같음 -> 안정성이 보장되어있음- RHEL --> CentOS Stream --> Fedora (Cento0s8 ~ )
- Ansible Tower --> AWX
- Ubuntu --> Debian
AnsibleWorks -> AWX
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ ls /etc/yum.repos.d/
... docker-ce.repo
$ sudo yum install -y docker-ce docker-ce-cli containerd.io
$ sudo systemctl enable --now docker
$ docker --version
Docker version 20.10.14, build a224086
$ sudo yum install -y python3 python3-pip
$ sudo pip3 install -U -I pip wheel setuptools
$ sudo pip3 install docker-compose
$ docker-compose --version
$ sudo yum -y install git
$ cd ~
$ git clone --branch 17.1.0 --single-branch https://github.com/ansible/awx.git
$ cd ~/awx/installer
$ ls
build.yml install.yml inventory roles
install.yml 앤서블에 의해 실행
# 라인 호스트네임을 뭐라고 할것인지
63 awx_task_hostname=awx
64 awx_web_hostname=awxweb
# 포스트 그래스 데이터가 저장되는 위치 == mysql var/lib/mysql
66 postgres_data_dir="~/.awx/pgdocker"
# 67 awx웹 인터페이스니까 포트
67 host_port=80
68 host_port_ssl=443
# 웹 인터페이스에 로그인할 사용자
107 admin_user=admin
108 admin_password=password
108번 라인과 141번 라인의 주석을 해제
~/awx/installer/inventory
108 admin_password=password
141 project_data_dir=/var/lib/awx/projects
sudo yum -y install libselinux-python3
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
ansible-playbook -i inventory install.yml -b
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ea4d852e694 ansible/awx:17.1.0 "/usr/bin/tini -- /u…" 11 minutes ago Up 11 minutes 8052/tcp awx_task
9c527c75a323 ansible/awx:17.1.0 "/usr/bin/tini -- /b…" 20 minutes ago Up 11 minutes 0.0.0.0:80->8052/tcp, :::80->8052/tcp awx_web
f6775cad37ab redis "docker-entrypoint.s…" 20 minutes ago Up 11 minutes 6379/tcp awx_redis
16d33e864106 postgres:12 "docker-entrypoint.s…" 20 minutes ago Up 11 minutes 5432/tcp awx_postgres
http://192.168.100.10
inventory 107, 108번 라인에서 설정한 값으로 로그인
sudo mkdir /var/lib/awx/projects/test-awx
sudo vi /var/lib/awx/projects/test-awx/debug.yaml
- hosts: all
tasks:
- debug:
msg: Hello AWX World
[test-awx-group]
192.168.100.11
Resouces -> Projects -> Add
Save
Resources -> Inventories -> Add -> Add Inventory
Create new inventory
- Name: test-awx-inventory
- Save
Details -> Groups 탭 -> Add
- Name: test-awx-group
- 'Save'
Group details -> Hosts 탭 -> Add -> Add new host
- Name: 192.168.100.11
- Save
Resources -> Credentials -> Add
Save
Resources -> Templates -> Add -> Add job template
Save
Resources -> Templates -> test-awx-template -> 로켓 버튼