- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果给定的话,我想运行一组原始命令(以安装 python)目标主机上的操作系统是OpenBSD
我必须将这些检查作为 pre_tasks 运行(因为要将任何东西作为任务运行,Python 必须已经存在于目标系统上)
我不明白的是pre_task阶段有没有OS特性变量(比如ansible_os_family)
- name: Check for Python
raw: test -e /usr/bin/python
changed_when: false
failed_when: false
register: check_python
- name: Install Python on OpenBSD
# raw: test -e /usr/bin/apt && (apt -y update && apt install -y python-minimal) || (yum -y install python libselinux-python)
raw: pkg_add -r python%3
when: check_python.rc != 0
when: ansible_os_family == "OpenBSD" # <-- problem here
我在尝试使用 ansible_os_family 时似乎遇到了问题
有没有办法在我不编写自己的操作系统系列检查的情况下启用 pre_tasks?
附言。我使用了上面的python安装代码,这里推荐如下:[1] https://relativkreativ.at/articles/how-to-install-python-with-ansible
最佳答案
根据您的最新评论,正如@Vladimir 和我自己之前所说,您将无法使用 ansible 的事实变量来检测没有 python 的主机上的操作系统,因为无法收集事实(即播放 setup
模块)。第一步,您需要自己完成这项工作。
我没有可以访问的 BSD 系统。因此,以下内容完全没有针对您的平台进行测试。但我相信它应该有效,或者至少让你走上正轨。检查系统上 /etc/os-release
的内容以根据需要调整正则表达式。我写的那个在 Ubuntu、Debian、Centos、RHEL 以及 RedHat UBI 和 Alpine docker 镜像上给出了正确的结果。
---
- name: Fix hosts with no python at all
hosts: all
gather_facts: false
tasks:
- name: Perform a dirty OS detection if python is not installed
raw: |-
if which python > /dev/null || which python3 > /dev/null; then
echo installed
else
sed -n "s/^NAME=\"\(.*\)\"/\\1/p" /etc/os-release
fi
changed_when: false
register: dirty_detect
- name: Print message when already installed
debug:
msg: Host {{ inventory_hostname }} already has python. Next will skip.
when: dirty_detect.stdout_lines[0] == 'installed'
- name: Install python on openbsd if needed
raw: |-
pkg_add -r python%3
become: true
when: dirty_detect.stdout_lines[0] == 'OpenBSD'
- name: Install python on Ubuntu if needed
raw: |-
apt install -y python3
become: true
when: dirty_detect.stdout_lines[0] == 'Ubuntu'
- name: Back to normal life with ansible
hosts: all
tasks:
- name: Now we gathered facts and we can use all facts vars
debug:
msg: Host {{ inventory_hostname }} is running {{ ansible_os_familly }}
- name: We might have left hosts with python 2.7 only above, make sure python3 is installed
package:
name: python3
become: true
关于ansible - ansible 中操作系统特定的 pre_task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61902095/
如果给定的话,我想运行一组原始命令(以安装 python)目标主机上的操作系统是OpenBSD 我必须将这些检查作为 pre_tasks 运行(因为要将任何东西作为任务运行,Python 必须已经存在
在 playbook 中我们可以定义roles、pre_tasks、post_tasks。 我们还可以定义任务吗?第二个问题是关于执行这些事情的顺序。我知道顺序如下:pre_tasks -> Role
我是一名优秀的程序员,十分优秀!