我正在编写使用 Kubernetes 部署服务的 ansible 脚本,但我坚持执行部署后流程的步骤:
我已经部署了一个具有“副本:3”的服务,现在所有副本都已启动并正在运行,我的问题是我必须进行迁移,为此我必须进入容器并运行已经存在的脚本。
我可以通过单独进入容器然后运行脚本来手动完成,但这将再次需要手动干预。
我想要实现的是,一旦部署完成并且所有副本都已启动并正在运行,我想通过进入容器来运行脚本,所有这些步骤都应由 ansible 脚本执行,无需手动操作。< /p>
有没有办法做到这一点?
答案 0 :(得分:1)
看看 k8s_exec 模块。
- name: Check RC status of command executed
community.kubernetes.k8s_exec:
namespace: myproject
pod: busybox-test
command: cmd_with_non_zero_exit_code
register: command_status
ignore_errors: True
- name: Check last command status
debug:
msg: "cmd failed"
when: command_status.return_code != 0
答案 1 :(得分:0)
@Vasili Angapov 是对的 - k8s_exec 模块可能是这种情况下的最佳解决方案,但我想添加一些有用的注释。
要使用 k8s_exec,我们需要知道确切的 Pod
名称(我们需要在 ansible 任务中将其作为 pod
参数传递)。正如您所写,我假设您的 Pods
由 Deployment
管理,因此每个 Pod
的名称中都有由 ReplicaSet
添加的随机字符串。因此,您必须以某种方式找到 Pods
的全名。
我创建了一个简单的剧本来说明我们如何为所有带有标签的 Pod
找到 Pods
名称:app=web
,然后在这些 touch file123456789
上运行示例 Pods
命令.
---
- hosts: localhost
collections:
- community.kubernetes
tasks:
- name: "Search for all Pods labelled app=web"
k8s_info:
kind: Pod
label_selectors:
- app = web
register: pod_names
- name: "Get Pod names"
set_fact:
pod_names: "{{ pod_names | json_query('resources[*].metadata.name') }}"
- name: "Run command on every Pod labelled app=web"
k8s_exec:
namespace: default
pod: "{{ item }}"
command: touch file123456789
with_items: "{{ pod_names }}"
注意:您也可以使用 k8s_exec
模块代替 command
模块。
在我们的示例中,我们可以有:
k8s_exec
任务
- name: "Run command on every Pod labelled app=web"
command: >
kubectl exec "{{ item }}" -n default -- touch file123456789
with_items: "{{ pod_names }}"