Ansible NGINX Plus Ingress Controller 업데이트, 롤백 자동화

Ansible NGINX Plus Ingress Controller 업데이트 작업은 단순히 컨테이너 이미지 태그 하나를 바꾸는 일이 아닙니다. NGINX Plus Ingress Controller(NPIC)를 OpenShift 클러스터에 배포한 뒤에는 이미지 업데이트, ConfigMap 설정 변경, replicas 변경과 같은 작업이 운영 기간 내내 반복됩니다.

업데이트 시에는 NGINX Plus 라이선스 토큰, 레지스트리 인증 정보 같은 의존 요소가 함께 맞아야 하고, Helm 차트 버전을 올리면 매핑되는 이미지 버전도 함께 바뀝니다. 이 의존 관계를 수동으로 관리하다 보면 ImagePullBackOff나 라이선스 오류로 신규 Pod 실행이 실패할 수 있습니다.

이전 포스트에서는 Ansible과 Helm으로 NGINX Plus Ingress Controller를 OpenShift에 배포하는 Playbook을 구성했습니다. 이번 포스트에서는 해당 Playbook을 재사용해 업데이트를 수행하는 방법과, 새로 구성한 rollback.yaml을 통해 Helm revision 히스토리 기반으로 이전 버전으로 롤백하는 방법을 살펴봅니다.

목차

1. 개요: 업데이트 및 롤백 전략
2. 환경/버전 정보
3. Ansible NGINX Plus Ingress Controller 업데이트 (기존 site.yaml 활용)
4. NPIC 롤백 Playbook (rollback.yaml)
5. 실행 결과 확인: Ansible NGINX Plus Ingress Controller 업데이트, 롤백 시나리오
6. 결론

1. 개요: 업데이트 및 롤백 전략

클러스터에 배포된 NGINX Plus Ingress Controller 변경 작업은 크게 세 가지 유형으로 나뉩니다. 모든 유형은 helm upgrade --install 명령어로 상태가 동기화 됩니다. Ansible Playbook은 그 호출을 만들어내는 변수 묶음을 표준화하는 역할을 합니다.

변경 유형변경 파일대표 시나리오
차트(이미지) 버전 변경vars/nic_vars.yaml의 helm_chart_versionNPIC 5.4.2 → 5.4.3 업그레이드, 보안 패치
K8s 옵션 변경vars/nic_vars.yaml의 nic_custom_valuesreplicaCount 변경, service type 변경
NGINX 설정 변경files/npic-values.yamlworker-connections, log-format, prometheus 옵션 등 Helm value 변경

세 유형 모두 변경 후 동일한 명령어(ansible-playbook site.yaml --tags deploy)로 처리됩니다.
helm upgrade --install은 호출할 때마다 항상 새로운 revision을 생성하므로, 롤백이 필요한 경우 rollback.yaml로 방금 만들어진 revision을 이전 버전으로 되돌릴 수 있습니다.

2. 환경/버전 정보

구성 요소버전
Ansiblecore 2.20.5
Python3.12.3
Red Hat OpenShift Cluster4.18.24
NGINX Plus Ingress Controller5.4.2, 5.4.3
NGINX Ingress Helm Chartnginx-stable/nginx-ingress (2.5.2, 2.5.3)

사전 조건: 이 포스트는 이전 포스트의 site.yaml로 NPIC가 정상 배포된 상태를 전제합니다. 인벤토리, kubeconfig, 라이선스 파일(license.jwt), 인증 옵션 변수 등 전체 구조에 대한 설명은 이전 포스트를 참고하세요.

이번 포스트에서 다루는 업그레이드/롤백 관련 파일은 다음 네 개입니다.
인벤토리, 사전 검증 task, 네임스페이스/Secret/SCC 셋업 task는 업데이트 단계에서는 건너뛰고, 롤백 단계에서는 호출하지 않으므로 본문에서 다시 다루지 않습니다.

ansible-nic-deploy/
├── site.yaml # 기존 배포 Playbook — `--tags deploy`로 업데이트에 재사용
├── rollback.yaml # 신규 롤백 Playbook
├── vars/
│ └── nic_vars.yaml # helm_chart_version, nic_custom_values 정의
├── files/
│ └── npic-values.yaml # NGINX Plus Ingress Controller 설정 등 chart values
└── tasks/
└── deploy_nic.yaml # site.yaml의 deploy 태그가 호출하는 Helm 배포/업데이트 task

3. Ansible NGINX Plus Ingress Controller 업데이트 (기존 site.yaml 활용)

Helm Chart 버전이 NPIC 이미지 버전을 결정

nginx-stable/nginx-ingress 차트는 차트 버전과 함께 검증된 NPIC 이미지 버전을 appVersion으로 함께 배포합니다. 따라서 운영자가 별도로 컨테이너 이미지 태그를 지정하지 않더라도, 차트 버전을 변경하면 그에 대응되는 NPIC 이미지가 자동으로 풀(pull)됩니다.

vars/nic_vars.yaml
---
# OCP 클러스터 접근 방식
cluster_auth_method: kubeconfig
cluster_validate_certs: false
# [기본값] 인벤토리에 정의되지 않았을 경우 사용 (선택 사항)
# kubeconfig_path: ~/.kube/config
cluster_token: "{{ vault_cluster_token | default('') }}"
# NIC 네임스페이스
nic_namespace: nginx-ingress
# Helm 설정
helm_release_name: npic
helm_chart_repo_name: nginx-stable
helm_chart_repo_url: https://helm.nginx.com/stable
helm_chart_name: nginx-stable/nginx-ingress
# Helm values
helm_values_file: "{{ playbook_dir }}/files/npic-values.yaml"
# NGINX 공식 프라이빗 레지스트리 로그인용 Secret (regcred) 생성 여부
# - 자체 사설 레지스트리를 사용하거나 이미지를 별도로 업로드해 두고 사용하는 경우 false로 설정하십시오.
create_nginx_registry_secret: true
# Helm Chart 버전 — 업그레이드 시 이 값만 변경하십시오.
# - Chart 버전에 호환되는 NIC 이미지 버전이 내장되어 있습니다. (예: chart 2.5.2 → app 5.4.2)
# - 실제 컨테이너 이미지는 npic-values.yaml 또는 차트 기본값을 따르므로 주석으로 기록만 해둡니다.
helm_chart_version: "2.5.2" # nginx-ingress chart version
# Helm --set 오버라이드 값 — 클러스터별로 host_vars에 재정의하여 병합할 수 있습니다.
nic_custom_values:
controller.replicaCount: 2
controller.service.type: "ClusterIP"
controller.ingressClass.name: "nginx"
# controller.resources.requests.cpu: "100m"
# controller.resources.requests.memory: "128Mi"

이러한 구조 덕분에 helm_chart_version 하나만 관리하면 Helm 차트 리소스와 NPIC 이미지 버전을 함께 제어할 수 있습니다.

기존 Playbook을 업데이트에 재사용

tasks/deploy_nic.yaml이 별도의 update task를 두지 않는 이유는 helm upgrade --install이 배포와 업데이트를 모두 처리하기 때문입니다. 릴리스가 없으면 새로 설치하고, 이미 존재하면 업그레이드를 수행하므로 동일한 Playbook을 초기 배포와 운영 중 업데이트에 모두 사용할 수 있습니다.

tasks/deploy_nic.yaml
---
- name: "[Deploy] Add NGINX Helm chart repository"
ansible.builtin.command: >
helm repo add {{ helm_chart_repo_name }} {{ helm_chart_repo_url }}
register: repo_add_result
changed_when: "'already exists' not in repo_add_result.stdout"
failed_when:
- repo_add_result.rc != 0
- "'already exists' not in repo_add_result.stdout"
- name: "[Deploy] Update Helm repositories"
ansible.builtin.command: helm repo update
changed_when: false
- name: "[Deploy] Reconcile NIC via Helm"
ansible.builtin.command: >
helm upgrade --install {{ helm_release_name }}
{{ helm_chart_name }}
-n {{ nic_namespace }}
-f {{ helm_values_file }}
{% if helm_chart_version | default('') != '' %}--version {{ helm_chart_version }}{% endif %}
{% for key, value in (nic_custom_values | default({})).items() %}
--set {{ key }}={{ value }}
{% endfor %}
--create-namespace
--wait
--timeout 5m
{{ helm_auth_opts }}
register: helm_apply_result
changed_when: >
helm_apply_result.rc == 0 and
('has been upgraded' in helm_apply_result.stdout or
'has been installed' in helm_apply_result.stdout or
'STATUS: deployed' in helm_apply_result.stdout)
- name: "[Deploy] Show Helm apply result"
ansible.builtin.debug:
msg: "{{ helm_apply_result.stdout_lines }}"
when: helm_apply_result is defined
- name: "[Deploy] Wait for NIC pod to be Running"
ansible.builtin.command: >
kubectl rollout status deployment
-l app.kubernetes.io/instance={{ helm_release_name }}
-n {{ nic_namespace }}
--timeout=120s
{{ kubectl_auth_opts }}
register: rollout_status
changed_when: false

--wait --timeout 5m 옵션으로 새 Pod가 Ready 상태가 될 때까지 대기하므로, Playbook이 종료되는 시점에는 NPIC Pod가 Ready 상태에 도달했음을 확인할 수 있습니다.

실행 명령어

차트 버전 업그레이드를 예시로 들면, 변수 파일을 수정한 뒤 실행하거나 -e 옵션으로 원하는 값을 전달하여 실행할 수 있습니다.

# 변수 파일에 형상으로 남기는 방식
$ vi vars/nic_vars.yaml # helm_chart_version: "2.5.2" → "2.5.3"
$ ansible-playbook site.yaml --tags deploy
# 1회성 실행 (변수 파일 변경 없음)
$ ansible-playbook site.yaml --tags deploy -e "helm_chart_version=2.5.3"

인증 옵션 설정은 항상 실행되며, 사전 검증, 네임스페이스 생성, Secret 생성, SCC 적용 같은 최초 배포 준비 단계는 tags: precheck/setup으로 분리되어 있으므로 업데이트 작업에서는 건너뜁니다.

4. NPIC 롤백 Playbook (rollback.yaml)

rollback.yaml은 다음과 같은 단계로 실행됩니다.

rollback.yaml
① 릴리스 존재 검사 helm status → 없으면 end_host로 해당 호스트만 종료
② 히스토리 출력 helm history → revision 표 로그에 남기기
③ 롤백 전 버전 스냅샷 helm get metadata → chart/app 버전 저장
④ Helm 롤백 실행 helm rollback (--wait --timeout)
⑤ 롤아웃/Pod 확인 kubectl rollout status + get pods
⑥ 롤백 후 버전 비교 출력 helm get metadata → Before/After chart/app 버전 비교

전체 구성은 다음과 같습니다.

rollback.yaml
---
- name: NIC Rollback on OpenShift
hosts: ocp_clusters
gather_facts: false
vars_files:
- vars/nic_vars.yaml
# - vars/vault.yaml
tasks:
- name: Include common facts setup
ansible.builtin.import_tasks: tasks/set_common_facts.yaml
tags: always
- name: "[Rollback] Check if Helm release exists"
ansible.builtin.command: >
helm status {{ helm_release_name }}
-n {{ nic_namespace }}
{{ helm_auth_opts }}
register: helm_check
failed_when: false
changed_when: false
- name: "[Rollback] Abort if release not found"
ansible.builtin.debug:
msg: "Helm release '{{ helm_release_name }}' not found. Skipping rollback for this host."
when: helm_check.rc != 0
- name: "[Rollback] Stop play for this host if release not found"
ansible.builtin.meta: end_host
when: helm_check.rc != 0
- name: "[Rollback] Show Helm release history"
ansible.builtin.command: >
helm history {{ helm_release_name }}
-n {{ nic_namespace }}
{{ helm_auth_opts }}
register: helm_history
changed_when: false
- name: "[Rollback] Print Helm release history"
ansible.builtin.debug:
msg: "{{ helm_history.stdout_lines }}"
- name: "[Rollback] Get current chart/app version before rollback"
ansible.builtin.command: >
helm get metadata {{ helm_release_name }}
-n {{ nic_namespace }}
{{ helm_auth_opts }}
register: metadata_before
changed_when: false
- name: "[Rollback] Execute Helm rollback"
ansible.builtin.command: >
helm rollback {{ helm_release_name }}
{{ rollback_revision | default('') }}
-n {{ nic_namespace }}
--wait
--timeout 5m
{{ helm_auth_opts }}
register: rollback_result
changed_when: rollback_result.rc == 0
- name: "[Rollback] Show rollback result"
ansible.builtin.debug:
msg: "{{ rollback_result.stdout_lines }}"
- name: "[Rollback] Wait for NIC pod to be Running"
ansible.builtin.command: >
kubectl rollout status deployment
-l app.kubernetes.io/instance={{ helm_release_name }}
-n {{ nic_namespace }}
--timeout=120s
{{ kubectl_auth_opts }}
register: rollout_status
changed_when: false
- name: "[Rollback] Show NIC pod status"
ansible.builtin.command: >
kubectl get pods
-n {{ nic_namespace }}
-l app.kubernetes.io/instance={{ helm_release_name }}
{{ kubectl_auth_opts }}
register: pod_status
changed_when: false
- name: "[Rollback] Print NIC pod status"
ansible.builtin.debug:
msg: "{{ pod_status.stdout_lines }}"
- name: "[Rollback] Get chart/app version after rollback"
ansible.builtin.command: >
helm get metadata {{ helm_release_name }}
-n {{ nic_namespace }}
{{ helm_auth_opts }}
register: metadata_after
changed_when: false
- name: "[Rollback] Print rollback summary"
ansible.builtin.debug:
msg: "{{ ['=== Before ==='] + metadata_before.stdout_lines + ['=== After ==='] + metadata_after.stdout_lines }}"
릴리스 존재 여부 검사

helm status로 배포된 릴리스가 존재하는지 확인합니다. 릴리스가 없으면 meta: end_host로 해당 호스트의 Playbook을 중단합니다.

- name: "[Rollback] Check if Helm release exists"
ansible.builtin.command: >
helm status {{ helm_release_name }}
-n {{ nic_namespace }}
{{ helm_auth_opts }}
register: helm_check
failed_when: false
changed_when: false
- name: "[Rollback] Stop play for this host if release not found"
ansible.builtin.meta: end_host
when: helm_check.rc != 0

failed_when: false는 helm status의 비정상 종료가 Playbook 실패로 이어지지 않게 합니다. end_host는 fail과 달리 play 전체를 실패 처리하지 않고 해당 호스트만 조용히 종료합니다.

revision 히스토리 출력

롤백 직전에 helm history 결과를 출력합니다. 어떤 revision으로 되돌릴 수 있는지, 그리고 현재 deployed 상태가 몇 번인지를 Playbook 로그 안에서 바로 확인할 수 있습니다.

- name: "[Rollback] Show Helm release history"
ansible.builtin.command: >
helm history {{ helm_release_name }}
-n {{ nic_namespace }}
{{ helm_auth_opts }}
register: helm_history
changed_when: false
- name: "[Rollback] Print Helm release history"
ansible.builtin.debug:
msg: "{{ helm_history.stdout_lines }}"
롤백 전 버전 스냅샷

차트 버전이 곧 이미지 버전을 결정하므로, helm get metadata로 현재 배포된 차트 버전과 이미지 버전을 한 번에 추출해 metadata_before에 저장합니다. 이 값은 이후 단계에서 metadata_after와 함께 출력되어 Before/After 비교를 가능하게 합니다.

- name: "[Rollback] Get current chart/app version before rollback"
ansible.builtin.command: >
helm get metadata {{ helm_release_name }}
-n {{ nic_namespace }}
{{ helm_auth_opts }}
register: metadata_before
changed_when: false
Helm 롤백 실행

핵심 단계입니다. rollback_revision 변수가 비어 있으면 직전 revision으로, 변수값이 지정되면 해당 revision으로 되돌립니다. --wait --timeout 5m이 새 Pod가 Ready 상태가 될 때까지 대기하므로, task가 완료된 시점에는 Pod의 정상 실행을 보장합니다.

- name: "[Rollback] Execute Helm rollback"
ansible.builtin.command: >
helm rollback {{ helm_release_name }}
{{ rollback_revision | default('') }}
-n {{ nic_namespace }}
--wait
--timeout 5m
{{ helm_auth_opts }}
register: rollback_result
changed_when: rollback_result.rc == 0
롤아웃 대기와 Pod 상태 검증

helm rollback --wait 옵션으로 이미 한 차례 대기하지만, kubectl 명령어로 Deployment의 Rollout 완료 여부를 확인합니다. 그 다음 Pod 목록을 출력해 새 Replica가 모두 Running 상태인지를 확인할 수 있도록 합니다.

- name: "[Rollback] Wait for NIC pod to be Running"
ansible.builtin.command: >
kubectl rollout status deployment
-l app.kubernetes.io/instance={{ helm_release_name }}
-n {{ nic_namespace }}
--timeout=120s
{{ kubectl_auth_opts }}
register: rollout_status
changed_when: false
- name: "[Rollback] Show NIC pod status"
ansible.builtin.command: >
kubectl get pods
-n {{ nic_namespace }}
-l app.kubernetes.io/instance={{ helm_release_name }}
{{ kubectl_auth_opts }}
register: pod_status
changed_when: false
- name: "[Rollback] Print NIC pod status"
ansible.builtin.debug:
msg: "{{ pod_status.stdout_lines }}"
Before/After 버전 비교 출력

롤백 후 helm get metadata를 다시 실행해 metadata_after에 저장하고, 이전 단계에서 저장한 metadata_before와 함께 출력합니다.
차트 버전이 이미지 버전을 결정하므로 VERSION과 APP_VERSION 두 필드로 버전 변경 내역을 한눈에 확인할 수 있습니다.

- name: "[Rollback] Get chart/app version after rollback"
ansible.builtin.command: >
helm get metadata {{ helm_release_name }}
-n {{ nic_namespace }}
{{ helm_auth_opts }}
register: metadata_after
changed_when: false
- name: "[Rollback] Print rollback summary"
ansible.builtin.debug:
msg: "{{ ['=== Before ==='] + metadata_before.stdout_lines + ['=== After ==='] + metadata_after.stdout_lines }}"

5. 실행 결과 확인: Ansible NGINX Plus Ingress Controller 업데이트, 롤백 시나리오

다음 시나리오로 site.yaml(–tags deploy)과 rollback.yaml의 동작 결과를 확인합니다.

  1. Revision 1: 최초 배포 — chart 2.5.2(NPIC 5.4.2), replicaCount 2
  2. Revision 2: 옵션 변경 — chart 버전 유지, replicaCount 2 → 3
  3. Revision 3: 차트 버전 업그레이드 — chart 2.5.3(NPIC 5.4.3), replicaCount 3
  4. Revision 4: 직전 revision 롤백 — Rev 2 상태(chart 2.5.2)로 복원
  5. Revision 5: 특정 revision 롤백 — Rev 1 상태(replicaCount 2)로 복원
Revision 1 — 최초 배포 (chart 2.5.2, NPIC 5.4.2)
$ ansible-playbook site.yaml
...
TASK [[Deploy] Show Helm apply result] *****************************************
ok: [ansible-ocp] => {
"msg": [
"Release "npic" does not exist. Installing it now.",
"NAME: npic",
"LAST DEPLOYED: Wed May 27 16:19:51 2026",
"NAMESPACE: nginx-ingress",
"STATUS: deployed",
"REVISION: 1",
"NOTES:",
"NGINX Ingress Controller 5.4.2 has been installed."
]
}
...
PLAY RECAP *********************************************************************
ansible-ocp : ok=20 changed=5 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Revision 2 — 운영 옵션 변경 (replicaCount 2 → 3)

차트 버전은 유지하고, nic_custom_values.controller.replicaCount만 3으로 변경한 업데이트입니다. 이미지는 5.4.2 버전으로 유지되지만 새 revision이 생성됩니다.

$ ansible-playbook site.yaml --tags deploy -e "{nic_custom_values: {controller.replicaCount: 3, controller.service.type: ClusterIP, controller.ingressClass.name: nginx}}"
...
TASK [[Deploy] Show Helm apply result] *****************************************
ok: [ansible-ocp] => {
"msg": [
"Release "npic" has been upgraded. Happy Helming!",
"NAMESPACE: nginx-ingress",
"STATUS: deployed",
"REVISION: 2",
"NOTES:",
"NGINX Ingress Controller 5.4.2 has been installed."
]
}
...
PLAY RECAP *********************************************************************
ansible-ocp : ok=7 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Revision 3 — 차트 버전 업그레이드 (2.5.2 → 2.5.3)
$ ansible-playbook site.yaml --tags deploy -e "helm_chart_version=2.5.3"
...
TASK [[Deploy] Show Helm apply result] *****************************************
ok: [ansible-ocp] => {
"msg": [
"Release "npic" has been upgraded. Happy Helming!",
"NAMESPACE: nginx-ingress",
"STATUS: deployed",
"REVISION: 3",
"NOTES:",
"NGINX Ingress Controller 5.4.3 has been installed."
]
}
...
PLAY RECAP *********************************************************************
ansible-ocp : ok=7 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

이후 helm history를 조회하면 다음과 같이 출력됩니다. Revision 1, 2는 같은 chart 2.5.2에 머무르고, 3에서 2.5.3으로 변경됩니다.

$ helm history npic -n nginx-ingress
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Wed May 27 16:19:51 2026 superseded nginx-ingress-2.5.2 5.4.2 Install complete
2 Wed May 27 16:22:34 2026 superseded nginx-ingress-2.5.2 5.4.2 Upgrade complete
3 Wed May 27 16:22:58 2026 deployed nginx-ingress-2.5.3 5.4.3 Upgrade complete
Revision 4 — 직전 revision 롤백 (rollback.yaml)

현재 배포 상태(Revision 3)에서 직전 상태로 되돌립니다. rollback_revision 값을 지정하지 않으면 직전 revision(여기서는 Rev 2)으로 복원됩니다.

$ ansible-playbook rollback.yaml
...
TASK [[Rollback] Print Helm release history] ***********************************
ok: [ansible-ocp] => {
"msg": [
"REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION",
"1 Wed May 27 16:19:51 2026 superseded nginx-ingress-2.5.2 5.4.2 Install complete",
"2 Wed May 27 16:22:34 2026 superseded nginx-ingress-2.5.2 5.4.2 Upgrade complete",
"3 Wed May 27 16:22:58 2026 deployed nginx-ingress-2.5.3 5.4.3 Upgrade complete"
]
}
...
TASK [[Rollback] Show rollback result] *****************************************
ok: [ansible-ocp] => {
"msg": [
"Rollback was a success! Happy Helming!"
]
}
...
TASK [[Rollback] Print NIC pod status] *****************************************
ok: [ansible-ocp] => {
"msg": [
"NAME READY STATUS RESTARTS AGE",
"npic-nginx-ingress-controller-574b49797c-5r9s6 1/1 Running 0 11s",
"npic-nginx-ingress-controller-574b49797c-jwmhq 1/1 Running 0 25s",
"npic-nginx-ingress-controller-574b49797c-s6j6k 1/1 Running 0 20s"
]
}
...
TASK [[Rollback] Print rollback summary] ***************************************
ok: [ansible-ocp] => {
"msg": [
"=== Before ===",
"NAME: npic",
"CHART: nginx-ingress",
"VERSION: 2.5.3",
"APP_VERSION: 5.4.3",
"ANNOTATIONS: ",
"DEPENDENCIES: ",
"NAMESPACE: nginx-ingress",
"REVISION: 3",
"STATUS: deployed",
"DEPLOYED_AT: 2026-05-27T16:22:58+09:00"
"=== After ===",
"NAME: npic",
"CHART: nginx-ingress",
"VERSION: 2.5.2",
"APP_VERSION: 5.4.2",
"ANNOTATIONS: ",
"DEPENDENCIES: ",
"NAMESPACE: nginx-ingress",
"REVISION: 4",
"STATUS: deployed",
"DEPLOYED_AT: 2026-05-27T16:23:29+09:00"
]
}
PLAY RECAP *********************************************************************
ansible-ocp : ok=13 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
Revision 5 — 특정 revision 롤백 (rollback_revision=1)

최초 배포 시점(Rev 1, replicaCount 2)으로 롤백하는 사례입니다.

$ ansible-playbook rollback.yaml -e "rollback_revision=1"
TASK [[Rollback] Print Helm release history] ***********************************
ok: [ansible-ocp] => {
"msg": [
"REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION",
"1 Wed May 27 16:19:51 2026 superseded nginx-ingress-2.5.2 5.4.2 Install complete",
"2 Wed May 27 16:22:34 2026 superseded nginx-ingress-2.5.2 5.4.2 Upgrade complete",
"3 Wed May 27 16:22:58 2026 superseded nginx-ingress-2.5.3 5.4.3 Upgrade complete",
"4 Wed May 27 16:23:29 2026 deployed nginx-ingress-2.5.2 5.4.2 Rollback to 2"
]
}
... (Helm rollback to revision 1 성공 및 Pod 기동 대기) ...
TASK [[Rollback] Print NIC pod status] *****************************************
ok: [ansible-ocp] => {
"msg": [
"NAME READY STATUS RESTARTS AGE",
"npic-nginx-ingress-controller-574b49797c-jwmhq 1/1 Running 0 11s",
"npic-nginx-ingress-controller-574b49797c-s6j6k 1/1 Running 0 20s"
]
}
TASK [[Rollback] Print rollback summary] ***************************************
ok: [ansible-ocp] => {
"msg": [
"=== Before ===",
"NAME: npic",
"CHART: nginx-ingress",
"VERSION: 2.5.2",
"APP_VERSION: 5.4.2",
"ANNOTATIONS: ",
"DEPENDENCIES: ",
"NAMESPACE: nginx-ingress",
"REVISION: 4",
"STATUS: deployed",
"DEPLOYED_AT: 2026-05-27T16:23:29+09:00"
"=== After ===",
"NAME: npic
"NAME: npic",
"CHART: nginx-ingress",
"VERSION: 2.5.2",
"APP_VERSION: 5.4.2",
"ANNOTATIONS: ",
"DEPENDENCIES: ",
"NAMESPACE: nginx-ingress",
"REVISION: 5",
"STATUS: deployed",
"DEPLOYED_AT: 2026-05-27T16:24:11+09:00"
]
}
PLAY RECAP *********************************************************************
ansible-ocp : ok=13 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0

이번에는 Before와 After의 VERSION과 APP_VERSION이 모두 2.5.2 / 5.4.2로 동일하게 출력됩니다. Rev 2와 Rev 1이 동일한 chart 및 NPIC 버전을 사용하고, replicaCount와 같은 운영 옵션만 다르기 때문입니다.

하지만 Helm은 설정 상태 전체를 revision 단위로 관리하므로, helm history에는 Rev 5(Rollback to 1)가 새로 기록되고 replicaCount도 3에서 2로 복원됩니다.

$ helm history npic -n nginx-ingress
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Wed May 27 16:19:51 2026 superseded nginx-ingress-2.5.2 5.4.2 Install complete
2 Wed May 27 16:22:34 2026 superseded nginx-ingress-2.5.2 5.4.2 Upgrade complete
3 Wed May 27 16:22:58 2026 superseded nginx-ingress-2.5.3 5.4.3 Upgrade complete
4 Wed May 27 16:23:29 2026 superseded nginx-ingress-2.5.2 5.4.2 Rollback to 2
5 Wed May 27 16:24:11 2026 deployed nginx-ingress-2.5.2 5.4.2 Rollback to 1

6. 결론

이번 포스트에서는 Ansible NGINX Plus Ingress Controller 업데이트와 롤백을 기존의 Playbook을 활용하여 자동화 하는 방법을 살펴봤습니다.

  • 기존 Playbook을 활용한 업데이트: helm upgrade --install 덕분에 차트 버전, K8s 옵션, values 파일 변경 모두 site.yaml --tags deploy 한 번으로 적용할 수 있습니다.
  • 차트 버전을 통한 이미지 버전 관리: helm_chart_version 하나가 인프라 템플릿과 컨테이너 이미지를 동시에 결정하기 때문에, 운영자가 별도의 이미지 태그 변수를 관리할 필요가 없습니다.
  • 6단계로 롤백 표준화: rollback.yaml이 릴리스 존재 검사, 히스토리 출력, 롤백 전 chart/app 버전 저장, 롤백 실행, 롤아웃 대기, Before/After 버전 비교까지 한 번에 처리하므로 운영자가 추가 명령 없이 결과를 검증할 수 있습니다.

이 구성을 통해 Ansible NGINX Plus Ingress Controller 업데이트 중 문제가 발생하더라도 명령어 한 줄로 이전 상태를 복원할 수 있고, 컨테이너 이미지가 의도한 버전으로 정확히 돌아갔는지 즉시 확인할 수 있습니다. 이미지가 같은 revision 간 롤백이라도 옵션 변경이 함께 복원되므로, 단순 버전 패치뿐 아니라 설정 변경에 대한 신뢰성 있는 되돌리기 수단으로도 활용할 수 있습니다.

현재 운영 중인 OpenShift 클러스터에 NGINX Plus Ingress Controller를 도입할 계획이 있으시다면 NGINX STORE를 통해 문의하여 NGINX One trial로 NGINX Plus Ingress Controller를 무료로 체험해 보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required