Ansible 中检查命令是否可用的最佳方法是什么?

lon*_*ony 8 ansible

我使用以下块来检测自制程序是否已安装。在新版本中,自制程序安装在/opt/文件夹中,而我的 \xe2\x80\x9csolution\xe2\x80\x9d 不再工作。检查命令是否可用的更好方法是什么?

\n
- name: Check if homebrew is installed\n  stat:\n    path: "/usr/local/bin/brew"\n  register: "homebrew_check"\n
Run Code Online (Sandbox Code Playgroud)\n

我知道which一些考虑因素command -v,但假设 Ansible 本身应该有一些东西,我错了吗?

\n

U88*_*80D 7

就一个

...检查命令是否可用的方法

哪个是

通过脚本直接从二进制文件安装,并且不会在包管理器中留下任何痕迹

直接检查它的版本也可能是可行的。在示例中这样做

---
- 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
Run Code Online (Sandbox Code Playgroud)

根据安装的版本,如有必要,可以调用安装程序或更新程序来安装或更新到最新版本。

另外,可以通过find_module 检查文件是否存在于某处。


Zei*_*tor 3

在我看来,在任务中使用which或是可以的,因为自制程序是通过脚本直接从二进制文件安装的,并且不会在包管理器中留下任何痕迹。commandcommand

同时,由于ansible支持Homebrew,我们可以使用该community.general.homebrew模块来测试它是否可用。

笔记:

  • 因为我没有 Homebrew,所以我只在这种情况下测试了我的脚本。同时,您应该在可用的机器上获得预期的测试结果。
  • 此方法取决于配置的路径来查找 Homebrew。在这里,我使用本地连接到本地计算机。当使用远程目标时,ansible 将通过 ssh 连接并默认使用 sh 与非登录 shell(不加载任何 shell 初始化文件,如login.bashrc、...)。如果您的二进制文件安装在任务的可用路径之外,您将得到错误的否定响应。

这是想法,适应您的需求。

剧本:

---
- name: Test homebrew presence
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Check if homebrew is available
      block:
        - name: try using homebrew in check_mode (no changes)
          homebrew:
            update_homebrew: true
          check_mode: true

        - name: Homebrew available
          debug:
            msg: Homebrew is installed

      rescue:
        - name: No homebrew
          debug:
            msg: Homebrew is not installed

Run Code Online (Sandbox Code Playgroud)

给出(没有自制软件):

PLAY [Test homebrew presence] ***********************************************

TASK [try using homebrew in check_mode (no changes)] ************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Failed to find required executable \"brew\" in paths: /usr/local/bin:/home/user/.local/bin:/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"}

TASK [No homebrew] **********************************************************
ok: [localhost] => {
    "msg": "Homebrew is not installed"
}

PLAY RECAP ******************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=1    ignored=0   

Run Code Online (Sandbox Code Playgroud)