Ansible:当包版本大于或等于时做一些事情

Ansible: Do something when package version greater or equals

只有当任务需要的包具有正确的版本时,我才能 运行 执行任务。在我的示例中,它是 OpenSSH 服务器。只有在 6.5 或更高版本上才能生成 ed25519 主机密钥。

这是我的任务:

- name: ensure openssh-server is present
  apt:
    pkg: openssh-server
    state: latest
    install_recommends: no
    force: yes
    default_release: "{{ sshd_apt_backports_distribution }}"
  notify: restart sshd

- name: ensure ed25519 host key is present
  command: ssh-keygen -q -t ed25519 -N "" -f ssh_host_ed25519_key
  args:
    chdir: /etc/ssh
    creates: /etc/ssh/ssh_host_ed25519_key

错误:

failed: [localhost] => {"changed": true, "cmd": ["ssh-keygen", "-q", "-t", "ed25519", "-N", "", "-f", "ssh_host_ed25519_key"], "delta": "0:00:00.012330", "end": "2015-05-17 12:16:51.062852", "rc": 1, "start": "2015-05-17 12:16:51.050522", "warnings": []}
stderr: unknown key type ed25519

只有在存在 OpenSSH 6.5 或更高版本时,才会触发第二个任务。您可以看到 here 我的构建失败了,因为 Travis CI 在 Ubuntu 12.04 LTS 下测试 运行 并且没有实际的 OpenSSH 版本。

您可以分两步完成此操作。

首先注册openssh-server版本:

- name: Get openssh-server version
  shell: 'dpkg -s openssh-server | grep "^Version" | sed -re "s/^.*:([0-9]+\.[0-9]+).*//"'
  register: openssh_version

然后根据需要创建密钥:

- name: ensure ed25519 host key is present
  command: ssh-keygen -q -t ed25519 -N "" -f ssh_host_ed25519_key
  args:
    chdir: /etc/ssh
    creates: /etc/ssh/ssh_host_ed25519_key
  when: openssh_version.stdout | version_compare('6.5', '>=') 

我没有测试过,所以YMMV,但它应该接近你需要的。 可能还有一种更简单的方法来检查 openssh-server 版本。

上一个答案的一点后续,你不需要 grep 或 sed dpkg 的结果,命令 dpkg-query 有一个 --showformat 选项来准确获取你想要的信息:

dpkg-query --show --showformat '${Version}' openssh-server

因此您可以将它与简单命令模块一起使用:

- name: Get openssh-server version
  command: /usr/bin/dpkg-query --show --showformat ${Version} openssh-server
  register: openssh_version