我从Ansible开始,我发现有一个名为command
的模块可以让我在远程节点中执行任何命令。
我看到了一些示例,其中使用command
而不是特定模块来解决初始设置。例如,据我所知,这两个都做同样的任务:
- name: Install git using apt module
apt:
name: git
state: present
- name: Install git using command
command: apt-get install git
所以,我的问题是:使用模块而不是命令有什么区别或任何理由吗?
答案 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
与特定模块的差异和后果的一些解释:
答案 1 :(得分:4)
可能有很多原因,但这里有一些: