"命令"之间的区别或者在Ansible中执行特定模块

时间:2016-11-26 11:48:33

标签: module command 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

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

2 个答案:

答案 0 :(得分: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模块幂等的任务,但是它会花费你更多的工作。

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

Ansible就是描述和管理系统状态。当您在某个目标系统上运行一个剧本时,看到一个报告changed状态的任务可能会非常误导,而事实上并没有任何改变。 以声明方式思考描述所需状态,而不是将系统置于此状态所需的低级命令。

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

Ansible Best Practices: The Essentials

答案 1 :(得分:4)

可能有很多原因,但这里有一些:

  • 内在的幂等性(每次不执行任务而不需要额外的努力)
  • 卓越的可读性(更清楚你要做的事情)
  • 更简洁的任务(用于描述任务的词语少得多)
  • 与平台无关的执行(适用于所有操作系统,而不是只需一次,无需额外工作)