我在Ansible中有一项任务是通过RubyGems选项安装SASS实用程序,它运行良好,没有任何问题。如果我再次运行相同的剧本,它将再次尝试重新安装此实用程序。
在本例中,如何在Ansible剧本中使用命令或shell使用的情况下运行一次。我以某种方式处理了它,不是使用'when‘选项来运行安装,而是需要更好的逻辑/实现指导。
任务信息:
- name: Install SASS packages by using npm utility.
command: /usr/bin/npm install -g sass为了避免在Ansible剧本中重新运行上面的命令任务,我使用了下面的验证逻辑,并添加了下面提供的'when‘选项。这样做好吗?还是我们有更好的办法处理这个问题?
- name: Validation of SASS packages availability.
shell: /usr/local/bin/sass --version
register: result
- debug:
msg: "{{ result.stdout }}"
- name: Install SASS packages by using npm utility.
command: /usr/bin/npm install -g sass
when: "'No such file or directory' in result.stdout"结果:
TASK [mean-stack : Validation of SASS packages availability.] ************************************************************************************
changed: [linuxosdev003.local.lab]
TASK [mean-stack : debug] ************************************************************************************************************************
ok: [linuxosdev003.local.lab] => {
"msg": "1.47.0 compiled with dart2js 2.15.1"
}
TASK [mean-stack : Install SASS packages by using npm utility.] **********************************************************************************
skipping: [linuxosdev003.local.lab]
PLAY RECAP ***************************************************************************************************************************************
linuxosdev003.local.lab : ok=6 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0发布于 2022-01-08 13:54:39
如果您想要一本幂等的剧本,您应该尽可能避免使用command或shell。特别是你的例子-删除sass并尝试你的剧本。它应该会失败。要么检查文件是否存在
- name: "Check, if file exists"
stat:
path: "/usr/local/bin/sass"
register: sass_installed但是--正如已经评论过的--使用ansible模块来安装NPM包,就像您使用系统包(package或yum或apt)或Python模块(使用pip)一样。在上一个RedHat版本2.9中,这个模块也可以在module.html下使用,并且应该很容易:
- name: "Install NPM package: sass"
npm:
name: "sass"如果您需要安装超过一个NPM包,您可以对它们进行循环。
- name: "Install NPM packages"
npm:
name: "{{ item }}"
loop:
- "package1"
- "package2"发布于 2022-01-08 14:14:57
正如@β.εηοιτ.βε和@TRW已经提到的那样,使用模块可以消除这种检查的需要。
但是,如果它就像检查路径是否存在一样简单,那么指挥模块本身可以被使用如下:
- name: Install SASS packages by using npm utility.
command:
cmd: /usr/bin/npm install -g sass
creates: /usr/local/bin/sass这等于您的when条件,即当creates中给定的路径不存在时,命令将运行。
发布于 2022-01-09 10:45:07
因此,如果包管理器可用于任务,我更喜欢使用@β.εηοιτ.βε和@TRW的解决方案,有时可能需要停留在β.εηοιτ.βε模块上。对于这种情况,我使用类似的方法,如在原来的问题。
---
- hosts: test.example.com
become: no
gather_facts: no
tasks:
- name: Gather installed Java version, if there is any
shell:
cmd: java -version 2>&1 | head -1 | cut -d '"' -f 2
register: result
check_mode: false
changed_when: false
failed_when: result.rc != 0 and result.rc != 127
- name: Set default version, if there is no
set_fact:
result:
stdout_lines: "0.0.0_000"
when: "'command not found' in result.stdout"
check_mode: false
- name: Report result
debug:
msg: "{{ result.stdout_lines }}"
check_mode: false根据已安装的版本,将在必要时调用安装程序或更新程序来安装或更新最新版本。
多亏了
https://stackoverflow.com/questions/70631304
复制相似问题