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