kubernetes - 如何通过 Ansible 在 Pod 上使用 k8s 模块执行 shell 命令

标签 kubernetes ansible

我在尝试使用 k8s 执行 shell 命令时遇到了一些麻烦。模块。据我所知,k8s 只拥有 k8s_exec传递命令。虽然,这个模块类似于 Ansible command模块,它没有我迫切需要的非常重要的功能:管理和使用 pod 上的环境变量。
我目前发现的一种解决方法是使用 kubectl exec在远程机器上执行 shell 命令的函数。我知道这不是最好的方法。
这是一个说明该问题的一些示例的剧本:

---
- hosts: localhost #group of hosts on host file
  connection: local
  remote_user: root
  vars:
    ansible_python_interpreter: '{{ ansible_playbook_python }}'
  collections:
    - community.kubernetes

    - name: Define Retail Home Path with k8s_exec module (not working!!!)
      k8s_exec:
        kubeconfig: "{{ kubeconfig_path | mandatory }}"
        namespace: redmine
        pod: redminetisl-gitlab-54d7759df8-l52cb #pod name
        command: export RETAIL_HOME=/u01/app/rms
    - name: Define Retail Home Path with kubectl exec module (working!!!)
      command: kubectl --namespace=redmine exec redminetisl-gitlab-54d7759df8-l52cb -- /bin/bash -c "export RETAIL_HOME=/u01/app/rms"
有没有办法在带有 k8s 模块的远程机器上执行 shell 命令和使用/管理环境变量?
Ansible 版本:
ansible 2.9.9
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/ansible/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Apr 16 2020, 01:36:27) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

最佳答案

您不能使用此机制来更改进程环境变量。这在 Unix 中通常是正确的:一个进程不能更改另一个进程的环境变量,除非父进程可以在创建子进程时指定它们(即使从技术上讲,它是运行父进程代码的子进程来设置它们)。您可以使用例如 ssh 看到相同的内容:

ssh somewhere export RETAIL_HOME=/u01/app/rms
ssh somewhere echo \$RETAIL_HOME
如果要设置一个环境变量,并且需要它来影响 pod 的主进程,则需要编辑 Deployment 规范;当您更改此 Kubernetes 将重新部署 Pod(s) 以拥有新变量。对于像文件系统路径这样的东西,还可以考虑将其烘焙到图像的 Dockerfile 中。 .
由于 Pod 被删除是非常常规的(部署更新将导致其所有 Pod 被删除并重新创建;如果节点需要关闭,集群可以自行完成)尝试使用 kubectl exec直接在 pod 内进行更改并不是特别可靠。我根本不会尝试使用 Ansible “管理” pod。

关于kubernetes - 如何通过 Ansible 在 Pod 上使用 k8s 模块执行 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62617467/

相关文章:

automation - Ansible lineinfile 模块属性行未在服务器上添加环境变量

docker - 如何在 Kubernetes pod 之间共享存储?

azure - 如何使用 oidc 和 azure 应用程序配置 kubernetes,以仅允许使用指定安全组进行身份验证

kubernetes 节点无法连接到 127.0.0.53:53 上的 api-server : dial tcp: lookup kubernetes. default.svc:没有这样的主机

linux - 运行 playbook 进行 apache 状态检查时抛出错误

jenkins - 我想通过 ansible 创建 jenkins 凭据

docker - 使用 Ansible 重启多个 Docker 容器

cron - Kubernetes CronJob - 如果上一个作业仍在运行,则跳过作业并等待下一个计划时间

kubernetes - 如何列出同类部署?

oracle - 使用 Ansible playbook 运行 Oracle SQL 脚本