Ansible:当包版本更大或等于时执行某些操作

时间:2015-05-18 06:27:44

标签: ssh ansible

只有在需要的软件包具有正确的版本时才运行任务。在我的例子中,它是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版本。

2 个答案:

答案 0 :(得分:2)

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

首先注册openssh-server版本:

- name: Get openssh-server version
  shell: 'dpkg -s openssh-server | grep "^Version" | sed -re "s/^.*:([0-9]+\.[0-9]+).*/\1/"'
  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版本。

答案 1 :(得分:0)

对前一个答案进行一点跟进,你不需要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