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

问题描述

所以我正在尝试创建一个 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。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...