Ansible playbook 获取 mysql 版本否则设置默认值

Ansible playbook to get mysql version else set default value

Playbook 出错,因为 mysql 服务未安装在远程主机上。我希望捕获 mysql --version 个远程主机并将值附加到 jinja2 模板中。

Playbook.yml

   - name: Get MySQL version.
     command: 'mysql --version'
     ignore_errors: yes
     register: version
   - debug:
       msg:
       - "Version:  {{ version.stdout | default('no mysql installed') }}"
   - name: Create Html
     ignore_errors: yes
     template:
      src: /path/mysql.j2
      dest: /path/mysql.html

利用 ignore_errors 避免 playbook 终止。但是,我注意到了。如果 MySQL 在远程主机上不存在,它只是跳过那些。

我正在寻找的是 - 应该为变量分配一个默认值,例如。 “MySQL 未安装”如果 mysql --version 在远程主机上失败(即 MySQL 不在远程主机上)。

错误: 无法从 jinja2 模板创建 HTML,因为 version.stdout 值似乎为空,因此 j2 无法将值分配给 table 数据。有没有一种解决方法,我可以用所需的字符串设置值,例如。 “未安装”。

TASK [Create Html] ************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'stdout'"}

您可以使用以下方法来防止任何命令失败。这将删除 ignore_errors: True 的要求。在这个用于演示的剧本中,我检查了 mysql 的版本和一个名为 non-existing-tool 版本的虚构工具。可以查看两个寄存器的调试输出。

---

- name: Sample playbook
  connection: local
  #  gather_facts: false
  hosts: localhost
  tasks:
  - name: Get MySQL version.
    shell: 'mysql --version 2>/dev/null && printf "" || printf  "mysql not installed\n"'
    register: version


  - debug:
     msg:
      - "Version:  {{ version.stdout }}"

  - name: Get non-existing stuff version.
    shell: 'non-existing-stuff  --version 2>/dev/null && printf "" || printf  "mysql not installed\n"'
    register: version2

  - debug:
     msg:
      - "Version2:  {{ version2.stdout }}"

上面的playbook命令输出如下:

PLAY [Sample playbook] **********************************************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************************************************
ok: [localhost]

TASK [Get MySQL version.] *******************************************************************************************************************************************
changed: [localhost]

TASK [debug] ********************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "Version:  mysql  Ver 8.0.25-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))"
    ]
}

TASK [Get non-existing stuff version.] ******************************************************************************************************************************
changed: [localhost]

TASK [debug] ********************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        "Version2:  mysql not installed"
    ]
}

PLAY RECAP **********************************************************************************************************************************************************
localhost                  : ok=5    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

要测试此命令行为,请在安装和未安装 mysql 的主机上手动 运行 以下命令。

mysql --version 2>/dev/null && printf "" || printf  "mysql not installed\n"