如何将 bash 文件中的 kubespray 动态清单的配置变量传递给 python?

How do I pass the config var to python for kubespray dynamic inventory in a bash file?

所以我正在尝试创建一个 bash 脚本来传递为 ansible 制作清单文件所需的 IP 数组 官方文档说这是通过

实现的
declare -a IPS=(10.10.1.3 10.10.1.4 10.10.1.5)
CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

但是在 bash 脚本中 CONFIG_FILE 被设置为变量,因此它停止创建库存文件,因为变量没有传递到 python 文件

我尝试了以下尝试并将变量传递给 python 文件以尝试创建清单文件

declare -a IPS=(10.10.1.3 10.10.1.4 10.10.1.5)
CONFIG_FILE=kubespray/inventory/mycluster/hosts.yaml
python3 kubespray/contrib/inventory_builder/inventory.py ${IPS[@]}

结果是

DEBUG: Adding group all
DEBUG: Adding group kube-master
DEBUG: Adding group kube-node
DEBUG: Adding group etcd
DEBUG: Adding group k8s-cluster
DEBUG: Adding group calico-rr
DEBUG: adding host node1 to group all
DEBUG: adding host node2 to group all
DEBUG: adding host node3 to group all
DEBUG: adding host node1 to group etcd
DEBUG: adding host node2 to group etcd
DEBUG: adding host node3 to group etcd
DEBUG: adding host node1 to group kube-master
DEBUG: adding host node2 to group kube-master
DEBUG: adding host node1 to group kube-node
DEBUG: adding host node2 to group kube-node
DEBUG: adding host node3 to group kube-node
Traceback (most recent call last):
  File "kubespray/contrib/inventory_builder/inventory.py", line 431, in <module>
    sys.exit(main())
  File "kubespray/contrib/inventory_builder/inventory.py", line 427, in main
    KubesprayInventory(argv, CONFIG_FILE)
  File "kubespray/contrib/inventory_builder/inventory.py", line 116, in __init__
    self.write_config(self.config_file)
  File "kubespray/contrib/inventory_builder/inventory.py", line 120, in write_config
    with open(self.config_file, 'w') as f:
FileNotFoundError: [Errno 2] No such file or directory: './inventory/sample/hosts.yaml'

我也试过了

declare -a IPS=(10.10.1.3 10.10.1.4 10.10.1.5)
CONFIG_FILE=kubespray/inventory/mycluster/hosts.yaml
${CONFIG_FILE} python3 kubespray/contrib/inventory_builder/inventory.py ${IPS[@]}

结果是

-bash: kubespray/inventory/mycluster/hosts.yaml: No such file or directory

这是可以理解的,但想法是让 python 脚本创建文件

有可能使 bash 脚本正常工作,以便它执行

规定的操作
CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}

?

更新

所以经过一番修改后,我得出结论,这可能是由于我的 pip 虚拟环境,因为我的脚本试图在 运行 命令之前创建一个虚拟环境,以便获得更多上下文

#!/bin/bash

echo "setting up virtual environment"
sleep 2

sudo apt-get install python3-venv -y

python3 -m venv tutorial-env
source tutorial-env/bin/activate
echo "installing pip requirements"
sudo pip3 install -r kubespray/requirements.txt
cp -rfp kubespray/inventory/sample kubespray/inventory/mycluster
declare -a IPS=(IP1 IP2 IP3)
echo "${IPS[@]}"
CONFIG_FILE=kubespray/inventory/mycluster/hosts.yaml python3  kubespray/contrib/inventory_builder/inventory.py ${IPS[@]}
cat kubespray/inventory/mycluster/hosts.yaml
sudo ansible-playbook -i kubespray/inventory/mycluster/hosts.yaml --ssh-extra-args="-oStrictHostKeyChecking=no" --key-file "~/.ssh/id_rsa" --become-user="provision" kubespray/cluster.yml

如果我删除这些行

python3 -m venv tutorial-env
source tutorial-env/bin/activate

然后脚本按预期工作,在某种程度上,理想情况下它应该在虚拟环境中,对于措辞不当的问题表示歉意

问题来自脚本中的 sudo

您创建一个 virtualenv 并为本地会话激活它。
但是随后您更改为根上下文以安装要求,这些要求是在系统级别而不是 virtualenv 级别安装的。
然后你在没有安装要求的情况下在 virtualenv 上下文中执行回 python,它失败了。

它解释了为什么当您使用系统级安装要求时它在没有 virtualenv 的情况下也能工作。

为了解决这个问题,当你在 virtualenv 中工作时,只需安装没有 sudo 的要求:安装要求并执行 ansible。