"command" 或 Ansible 中特定模块执行之间的区别

Difference between "command" or specific module execution in Ansible

我从 Ansible 开始,我发现有一个名为 command 的模块可以让我在远程节点中执行任何命令。

我看到了几个示例,其中初始设置是通过使用 command 而不是特定模块来解决的。例如,据我所知,这两个都执行相同的任务:

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

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

所以,我的问题是:使用模块而不是命令有什么不同或有什么理由吗?

可能有很多原因,但这里有几个:

  • 内在幂等性(不会每次都执行task不费力)
  • 出色的可读性(更清楚你想要做什么)
  • 更简洁的任务(描述任务的单词更少)
  • 与平台无关的执行(适用于所有 OS 而不是只需要一个而无需额外努力)

简而言之,不同之处在于使用特定的模块将为您提供 playbook 的幂等性,并提供更好的可移植性和可读性。

幂等性是什么意思?当你 运行:

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

仅当目标系统上尚未安装 git 包时才会安装它,并且在 playbook 运行 之后,此任务将以绿色 (OK) 报告,如果 git 已经安装。

command 模块的第二种方法:

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

以上命令总是将状态报告为 changed(黄色),而实际上什么都没有改变(假设已经安装了 git 包)。也有一些方法可以使使用 command 模块的任务成为幂等的,但它会花费您更多的工作。

最佳做法是始终在剧本 command 之前使用特定模块。

Ansible 就是关于描述和管理系统状态的。当您在某个目标系统上 运行 剧本时,如果看到任务报告 changed 状态而实际上什么都没有改变,这可能会产生误导。 以声明方式考虑描述所需状态,而不是让系统达到此状态所需的低级命令。

下面的文章还将提供一些关于使用 command 与特定模块的区别和后果的解释:

Ansible Best Practices: The Essentials