DevOps/Ansible
[Ansible] List 변수를 다른 구분자로 변환
`작은거인`
2020. 3. 4. 17:08
ㅁ 상황
- Ansible Playbook에서 uri 모듈을 이용하여 HTTP GET 메서드로 데이터 정보를 가지고 오려고 한다.
- url에서 호출할 때 인벤토리에 'master'라는 그룹에 있는 호스트 서버 정보를 조회하려고 한다.
# vim tes.yml
- name: 'Get system board api information'
uri:
url: "https://{{ system_url }}/api/web/index.php/system/api/v1/server/detail/{{ groups['master'] }}"
validate_certs: false
method: GET
body_format: json
headers:
Content-Type: application/json
status_code: 200
delegate_to: localhost
register: get_api_result
vars:
system_url: 'test.com'
ㅁ 문제
- Ansible을 실행시키면 요청된 서버가 없다고 나오는데, 위 url 호출할 때 groups['master']에서 가져온 호스트네임이 조회가 되지 않는다는 내용이다.
- 아래 url 끝부분에 보면 ['test.com']로 List 변수 포맷으로 되어있어서 서버 정보를 정상적으로 조회하지 못했다.
# ansible-playbook main2.yml -vvv -i hosts
ok: [test.com -> localhost] => {
...
"content_type": "application/json",
"invocation": {
...
...
},
"json": {
"code": "0001",
"message": "요청된 hostname 또는 farmkey에 속하는 서버가 없습니다.",
"data": [],
"url": "https://test.com/api/web/index.php/system/api/v1/server/detail/['test.com']"
}
ㅁ 해결
- 두 가지 해결 방안을 생각해보았는데, 코드 가독성을 높이기 위해서 두 번째 방법을 선택했다.
- 첫 번째, List 변수를 정규표현식을 사용하여 치환시켜주는 방법
ㄴ {{ groups['master] | regex_replace('\[|\]'.'') }} - 두 번째, List 변수를 join 필터를 사용하여 변환시켜주는 방법
ㄴ {{ groups['master'] | join('\n') }}
# vim tes.yml
- name: 'Get system board api information'
uri:
url: "https://{{ system_url }}/api/web/index.php/system/api/v1/server/detail/{{ groups['master'] | join('\n') }}"
validate_certs: false
method: GET
body_format: json
headers:
Content-Type: application/json
status_code: 200
delegate_to: localhost
register: get_api_result
vars:
system_url: 'test.com'
# ansible-playbook main2.yml -vvv -i hosts
ok: [test.com -> localhost] => {
...
"content_type": "application/json",
"invocation": {
...
...
},
"json": {
"code": "0001",
"message": "조회 성공",
"data": [
...
],
"url": "https://test.com/api/web/index.php/system/api/v1/server/detail/test.com"
}