在Ansible中设置程序包版本

在Ansible中设置程序包版本,ansible,Ansible,我使用Ansible来配置一个系统,其中包括安装许多软件包 我必须为软件包设置版本号吗?我的理解是,如果我不将版本设置为单个软件包,那么下次我重新运行Ansible时,它将安装软件包的最新版本,那么我担心某些软件包的最新版本将与其他软件包的最新版本不兼容,对吗 以下是我当前如何设置版本的示例: - name: install apache-airflow[postgres, s3, ...] become_user: root pip: name: "{{ item.name }

我使用Ansible来配置一个系统,其中包括安装许多软件包

我必须为软件包设置版本号吗?我的理解是,如果我不将版本设置为单个软件包,那么下次我重新运行Ansible时,它将安装软件包的最新版本,那么我担心某些软件包的最新版本将与其他软件包的最新版本不兼容,对吗

以下是我当前如何设置版本的示例:

- name: install apache-airflow[postgres, s3, ...]
  become_user: root
  pip:
    name: "{{ item.name }}"
    version: "{{ item.version }}"
  with_items:
     - { name: apache-airflow, version: 1.10.3}
     - { name: postgres, version: 2.2.2} 
     - { name: s3, version: 3.0.0 } 
     ...

我假设您使用的是ansible的旧版本,而不是2.8,因为

最好的建议是直接从ansible剧本中调用您最喜欢的python包管理器,如pip。这种方法让每种工具都能做到最好:

使用包管理器(如pip),包依赖项存储在一个数据库中

例如,您可以有一个调用pip的ansible。比如:

tasks:
  - name: install python dependencies
    command: pip install -r requirement.txt
还将提供给您在任何时候都可以使用,这将为您的python项目创建一个python环境,从而避免包冲突

应先安装virtualenv,然后再安装其他依赖于软件包的组件

假设您使用的是python版本3,它的外观如下所示:

$ pip3 install virtualenv
$ virtualenv --python=`which python3` venv
$ source venv/bin/activate
$ pip install -r requirements.txt

您还可以将上述代码段放入shell脚本中,然后使用ansible命令调用shell脚本。这将安装virtualenv,激活它,最后安装python软件包。

谢谢yes先生,我的ansible<2.8。您最喜欢的python包管理器是什么,例如直接从ansible剧本中获得的pip。我确实在Ansible中使用pip安装了软件包。请参阅我代码的第三行,其中显示了pip:,或者您是指其他内容吗?关于包依赖项,它们存储在一个需求文件中。你的意思是我可以自己定义一个需求文件并告诉pip使用它进行安装吗?我可以这样做,但我相信结果与使用上面代码中提到的版本{{item.version}是一样的。通过阅读你给我看的文章,我觉得皮普没有办法避免冲突。避免这种情况的唯一方法是使用需求文件或使用版本:{{item.version}限制依赖关系。如果我错了,请纠正我。@user389955:我已经根据您的问题更新了我的答案。让我知道它是否适合你。谢谢@1先生,我明白了。您的意思是使用命令调用pip,而不是ansible pip。2我将尝试requirements.txt。我猜requirements.txt和with_项的含义是一样的。他们两个都是为了得到正确的固定包版本?您使用requirements.txt而不是_项,因为我想您的系统是ansible 2.8。我一定会尝试requirements.txt,看看它是否工作得更好。@user389955:正确,使用命令ansible module调用pip并指定reuqirements.txt,而不是使用pip ansible module