ansible中特定于操作系统的前置任务

ansible中特定于操作系统的前置任务,ansible,Ansible,我想运行一组原始命令(安装python),如果给定 目标主机上的操作系统是OpenBSD 我必须将这些检查作为pre_任务运行(因为要将任何东西作为任务运行,目标系统上必须已经存在Python) 我不了解的是,在任务前阶段(如ansible_OS_系列)是否有任何OS特征变量可用 -name:检查Python raw:test-e/usr/bin/python 更改时间:false 当:false时失败 寄存器:check_python -名称:在OpenBSD上安装Python #原始:tes

我想运行一组原始命令(安装python),如果给定 目标主机上的操作系统是OpenBSD

我必须将这些检查作为pre_任务运行(因为要将任何东西作为任务运行,目标系统上必须已经存在Python)

我不了解的是,在任务前阶段(如ansible_OS_系列)是否有任何OS特征变量可用

-name:检查Python
raw:test-e/usr/bin/python
更改时间:false
当:false时失败
寄存器:check_python
-名称:在OpenBSD上安装Python
#原始:test-e/usr/bin/apt&&(apt-y update&&apt install-y python minimal)| |(yum-y install python libselinux python)
原始:pkg_添加-r python%3
何时:检查_python.rc!=0
当:ansible_os_family==“OpenBSD”#Q:“有没有一种方法可以在我不编写自己的操作系统系列检查的情况下启用pre_任务?”

A:不,不是。需要Python来收集数据


请参阅详细的输出。例如,从Ubuntu控制器连接FreeBSD 12远程主机的输出

shell>ansible--version
表2.9.6
...
python版本=3.8.2(默认值,2020年4月27日,15:53:34)[GCC 9.3.0]
外壳>ansible测试\u 01-m设置-vvv
为用户建立SSH连接:admin SSH:EXEC SSH-C-o ControlMaster=auto-o ControlPersist=60s-o KbdInteractiveAuthentication=no-o PreferredAuthentications=gssapi with mic、gssapi-keyex、基于主机、公钥-o PasswordAuthentication=no-o'User=“admin”—o ConnectTimeout=30-o ControlPath=/export/home/admin.config/.ansible/cp/5a3ab05cf7 test\u 01'/bin/sh-C''“/usr/local/bin/python3.7&&sleep 0”“”

如果没有安装Python,模块将崩溃

(127,b'',b'/bin/sh:/usr/bin/python:未找到\n') 无法通过ssh连接到主机:/bin/sh:/usr/bin/python:未找到 [警告]:找不到主机测试_01的python解释器(已尝试['/usr/bin/python', ‘python3.7’、‘python3.6’、‘python3.5’、‘python2.7’、‘python2.6’、’/usr/libexec/platform- python','/usr/bin/python3','python']) 测试_01|失败!=>{ “可解释的事实”:{ “发现了解释器\u python”:“/usr/bin/python” }, “更改”:错误, “module_stderr”:“/bin/sh:/usr/bin/python:未找到\n”, “模块”:“, “msg”:“模块未能正确执行,您可能需要设置解释器。\n请参阅stdout/stderr了解确切的错误”, “rc”:127 }


正如@Vladimir和我之前所说的,根据您的最新评论,您将无法使用ansible的facts变量在没有python的主机上检测操作系统,因为无法收集事实(即播放
设置
模块)。在这第一步中,你需要自己完成这项工作

我没有可以访问的BSD系统。因此,以下内容对于您的平台来说是完全未经测试的。但我相信它应该奏效,或者至少让你走上正轨。检查系统上
/etc/os release
的内容,以根据需要调整正则表达式。我写的这篇文章在Ubuntu、Debian、Centos、RHEL以及RedHat UBI和Alpine docker图像上给出了正确的结果

---
-名称:修复根本没有python的主机
主持人:全部
收集事实:错误
任务:
-名称:如果未安装python,则执行脏操作系统检测
原始:|-
如果哪个python>/dev/null | |哪个python3>/dev/null;然后
安装echo
其他的
sed-n“s/^NAME=\”(.*\)\“/\\1/p”/etc/os发行版
fi
更改时间:false
寄存器:脏的\u检测
-名称:已安装时打印消息
调试:
msg:Host{{inventory\u hostname}}已经有python了。下一步将跳过。
何时:脏线检测。标准输出线[0]=“已安装”
-名称:如果需要,在openbsd上安装python
原始:|-
pkg_添加-r python%3
变成:真的
何时:脏的\u检测。标准输出\u行[0]=“OpenBSD”
-名称:如果需要,在Ubuntu上安装python
原始:|-
apt安装-y python3
变成:真的
时间:dirty\u detect.stdout\u行[0]=“Ubuntu”
-名称:ansible回归正常生活
主持人:全部
任务:
-name:现在我们收集了事实,可以使用所有事实变量
调试:
msg:Host{{inventory\u hostname}}正在运行{{ansible\u os\u familly}
-名称:我们可能只在上面使用了Python2.7的主机,请确保安装了python3
包裹:
名称:蟒蛇3
变成:真的

因为要作为任务运行任何东西,Python必须已经存在于目标系统上
您能解释一下原因吗<代码>原始
可以用作任务、任务前任务,甚至任务后任务。事实上,在安装python之前,您将无法
收集事实,因此您将无法轻松检测操作系统,因为相关变量(例如
ansible\u OS\u family
,…)将不可用。@Zeitounator,您是对的,我应该更准确地说:如果目标主机上没有python,我们不能运行依赖于其他需要python的任务的任务。但就我的问题而言,我认为我所写的是有意义的:我需要在目标主机上安装python,但我需要以某种方式“检测”目标主机是OpenBSD。谢谢。但是当我运行:ansible-m setup myOpenBSD\u host\u而不使用python时--vault id@prompt--ask pass。我得到一个带有变量的输出(包括正确的ansible_os_族)。只是我似乎无法在pre_任务中使用它(我的pre_任务是特定角色下的一个目录),如果您运行该命令并得到结果,那么您的主机上已经找到了python的一个版本(无论什么)。否则你会出错。您可以在结果中的
ansible\u python.executable
中检查目标上使用了哪个可执行文件。要使用这些变量(在任何任务中),您的游戏不得关闭事实收集(即不声明
收集\u事实:false
,默认情况下为true)。如果你
- 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