Ansible测试变量的开头

Ansible测试变量的开头,ansible,Ansible,我需要能够安装一个MySQL库。Python有一个用于v2的包和另一个用于v3的包。我需要能够告诉Ansible安装哪个软件包 - name: Ensure MySQL-python is installed pip: name: MySQL-python state: present become: true when: python_version is regex("^2.*") - name: Ensure mysqlclient is installed

我需要能够安装一个MySQL库。Python有一个用于v2的包和另一个用于v3的包。我需要能够告诉Ansible安装哪个软件包

- name: Ensure MySQL-python is installed
  pip:
    name: MySQL-python
    state: present
  become: true
  when: python_version is regex("^2.*")

- name: Ensure mysqlclient is installed
  pip:
    name: mysqlclient
    state: present
  become: true
  when: python_version is regex("^3.*")
正则表达式有效,但Ansible将跳过这两个表达式,即使:

- debug:
    var: python_version
返回以下内容:

TASK [debug] ****************************************************************************************************************************************************************
ok: [localhost] => {
    "python_version": "2.7.10"
}
ansible 2.7.9适用于我。下面的例子

变量: python_版本:2.7.10 任务: -调试: msg:Python版本2 何时:python_版本为正则表达式“^2.*” 给予

msg:Python版本2 对于复杂的测试更方便。下面的例子给出了相同的结果

-调试: msg:Python版本2 什么时候: -python_版本为版本'2','>=' -python_版本是“3”版,“适用于我的ansible 2.7.9。下面的例子

变量: python_版本:2.7.10 任务: -调试: msg:Python版本2 何时:python_版本为正则表达式“^2.*” 给予

msg:Python版本2 对于复杂的测试更方便。下面的例子给出了相同的结果

-调试: msg:Python版本2 什么时候: -python_版本为版本'2','>=' -python_版本是“3”版,“就像弗拉基米尔说的那样。 另一个改进可能是python_版本的源代码。使用gather_facts时,无需regexp即可完成

---
- hosts: localhost
  gather_facts: True

  tasks:

    - name: do some stuff
      debug:
        msg: do something because it is python 3
      when: ansible_facts.python.version.major is version('3', '=')

    - name: do other stuff
      debug:
        msg: I don't support legacy software
      when: ansible_facts.python.version.major is version('2', '=')
就像弗拉基米尔说的。 另一个改进可能是python_版本的源代码。使用gather_facts时,无需regexp即可完成

---
- hosts: localhost
  gather_facts: True

  tasks:

    - name: do some stuff
      debug:
        msg: do something because it is python 3
      when: ansible_facts.python.version.major is version('3', '=')

    - name: do other stuff
      debug:
        msg: I don't support legacy software
      when: ansible_facts.python.version.major is version('2', '=')

您是否完全肯定您的python_版本变量在您的剧本中设置正确?就我而言,ansible 2.8.1无法正确再现您的问题和正则表达式匹配。当您可以使用ansible_python_版本在事实中自动获取该变量时,为什么要使用自定义变量?使用下面@Vladimir Botka建议的版本比较会更好。但是如果你的数据一开始就不正确,这也不会起作用。你完全肯定你的python_版本变量在你的剧本中设置正确了吗?就我而言,ansible 2.8.1无法正确再现您的问题和正则表达式匹配。当您可以使用ansible_python_版本在事实中自动获取该变量时,为什么要使用自定义变量?使用下面@Vladimir Botka建议的版本比较会更好。但是,如果您的数据不正确,这也不会起作用。OPs示例中的正则表达式与我的匹配正确,并且正在执行任务ansible 2.8.1。所以我怀疑问题出在别的地方。同时,我完全同意版本比较是这种情况下的良好实践解决方案。OPs示例中的正则表达式对我来说是正确匹配的,并且正在完成ansible 2.8.1中的工作。所以我怀疑问题出在别的地方。同时,我完全同意在这种情况下,版本比较是一个很好的解决方案。当你在virtualenv中时,这是行不通的。ansible_facts.python.version报告的是系统python版本,而不是实际运行ansible的版本。在VirtualNV中,这不起作用。ansible_facts.python.version报告系统python版本,而不是实际运行ansible的版本。