我的服务器默认没有安装 python2(目标服务器主要在 Alpine Linux 下),我使用下面的剧本来解决这个问题。
- hosts: all
become: yes
remote_user: root
gather_facts: no
pre_tasks:
# Python is not installed by default
- name: 'Install python'
raw: apk --no-cache add python
tasks:
- name: 'Upgrade Operating System'
apk:
available: yes
upgrade: yes
- name: 'Install base software'
apk:
name: '{{ item }}'
state: latest
with_items:
- tmux
- vim
- git
我使用原始模块,因为没有安装 python 包,我得到了这个输出:
TASK [Upgrade Operating System] ******************************************************************************************************************************************
fatal: [172.16.160.254]: FAILED! => {"changed": false, "failed": true, "module_stderr": "Shared connection to 172.16.160.254 closed.\r\n", "module_stdout": "/bin/sh: /usr/bin/python: not found\r\n", "msg": "MODULE FAILURE", "rc": 0}
实际上,剧本工作正常,但每次“安装 python”任务运行时状态都是“changed=1”。
是否可以使其幂等(播放重述“changed=0”并且一切都“ok=x”)?如果是的话你能帮我做到这一点吗?
答案1
我不是 100% 确定,但我认为由于 APK 的工作原理,它可能已经几乎是幂等的了。据我所知,如果你告诉它添加一个已经安装的包,APK 将返回成功而不做任何事情(至少,这就是当我尝试在我已经安装了 python2 的系统上安装 python2 时它正在做的事情) )。唯一潜在的警告是,如果有更新的版本,它将升级软件包,但我认为如果不将 shell 脚本嵌入到剧本中,就没有任何方法可以解决这个问题(您必须解析输出以apk version
确定是否会更新)。