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"
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"