Ansible中“command”和特定模块执行之间的区别

5
我开始学习Ansible,发现有一个模块叫做command,可以让我在远程节点上执行任何命令。
我看到有几个例子使用command解决了初始设置问题,而不是使用特定的模块。例如,据我所知,以下两种方法都可以完成同一任务:
- name: Install git using apt module
  apt:
    name: git
    state: present

- name: Install git using command
  command: apt-get install git

所以,我的问题是:使用模块与命令有何区别或原因?
2个回答

6

简而言之,使用特定模块可以使playbook具有幂等性,提高可移植性和可读性。

幂等性是什么意思?当你运行以下命令时:

- name: Install git using apt module
  apt:
    name: git
    state: present

如果目标系统尚未安装git软件包,则此任务将安装git软件包,且在playbook运行后,如果git已经安装,则此任务将以绿色(OK)报告。

第二种方法使用command模块:

- name: Install git using command
  command: apt-get install git

以上命令将始终报告状态为 changed(黄色),即使实际上没有发生任何更改(假设 git 包已经被安装)。还有一些方法可以使使用 command 模块的任务具有幂等性,但这需要更多的工作。
最佳做法是在 playbook 中始终在 command 之前使用特定模块。
Ansible 的全部内容都是关于描述和管理系统状态的。当您在某个目标系统上运行 playbook 时,如果看到一个任务报告了 changed 状态,而实际上没有进行任何更改,那么这可能会非常误导人。考虑描述所需状态的声明性方法,而不是获取系统到此状态所需的低级命令。
下面的文章还将提供有关使用 command 与特定模块之间差异和影响的一些解释: Ansible 最佳实践:必备要素

4

可能有许多原因,但以下是其中的一些:

  • 内在幂等性(不需要额外努力就可以执行任务)
  • 更好的可读性(更清晰地表达您要做什么)
  • 更简洁的任务描述(用更少的词语来描述任务)
  • 与平台无关的执行(不需要额外努力即可在所有操作系统上运行,而不仅仅是一个)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接