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

时间:2020-06-28 02:07:42

标签: kubernetes ansible

尝试使用k8s模块执行shell命令时遇到了一些麻烦。据我所知,k8只拥有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)]

1 个答案:

答案 0 :(得分:3)

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

ssh somewhere export RETAIL_HOME=/u01/app/rms
ssh somewhere echo \$RETAIL_HOME

如果要设置环境变量并且需要它来影响Pod的主要过程,则需要编辑Deployment规范;当您更改此设置时,Kubernetes将重新部署Pod以使其具有新变量。对于类似文件系统路径的东西,也可以考虑将其烘焙到图像的Dockerfile中。

由于删除Pod是非常常规的操作(部署更新将导致删除并重新创建其所有Pod;如果节点需要关闭,群集可以自行执行此操作)尝试使用{ {1}}直接在广告连播内进行更改并不是特别可靠。我根本不会尝试用Ansible来“管理”一个豆荚。