- 什么是
Ansible Modules
?
Ansible
模块根据其功能分为不同的组,每个模块提供了一些功能,可以直接使用。
模块官方文档: https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
- 系统模块是要在系统级别执行的操作,例如修改系统上的用户和组、修改
IP
表、 系统上的防火墙配置、 使用逻辑卷组、 安装操作或使用服务,例如, 启动、 停止或重新启动系统中的服务。 - 命令模块用于在主机上执行命令或脚本。这可以是使用
command
模块的简单命令,也可以是使用expect
模块通过响应提示的交互式执行。 - 您还可以使用脚本模块在主机上运行脚本。
- 文件模块帮助处理文件。例如, 使用
ACL
模块来设置和检索文件的ACL
信息。使用archive
和unarchive
模块压缩和解压缩文件。使用find
、lineinfile
和replace
模块修改现有文件的内容。 - 数据库模块有助于使用
MongoDB
、MySQL
、MSSQL
或PostgreSQL
等数据库来添加或删除数据库或修改数据库配置。 - 云模块有一个巨大的模块集合, 为各种不同的云提供商,如亚马逊,
Azure
,Docker
,谷歌,Openstack
和VMware
只是其中的一小部分。其中每一项都有许多模块可供使用,可让您执行各种工作, 例如建立和销毁执行instance
、执行网络与安全性的组态变更、 管理容器、数据中心、 丛集、 虚拟网络、Virtual SAN
等等。 - 此外还有
Windows
模块,可帮助您在Windows
环境中使用Ansible
。其中一些是复制文件的wincopy
, 在Windows
机器上执行命令的wincommand
,
还有一堆其他模块可以在Windows
上处理文件。创建IIS
网站, 使用MSI
安装程序安装软件。在Windows
中使用注册表编辑和托管服务和用户更改注册表。
这些只是几个类别中的几个模块。有很多更多和一个全面的列表可以找到文档。
-
相关模块解析
1)命令模块
让我们详细了解其中的几个模块。我们将从命令模块开始。命令模块用于在远程节点上执行命令。
要使用模块,您只需创建一个模块名和参数的键值对,在本例中模块名是command
,值是date
等。
在本例中, 我们将指示Ansible
在主机上运行date
命令,然后执行cat /etc/resolv/conf
命令,以列出文件的内容。在执行命令之前, 如果您需要更改目录,例如, 第3
个命令, 使用chdir
将目录设置为/etc
, 这将确保Ansible
在执行命令之前将目录更改为/etc
。这是参数和值传递到此命令模块的方式。
creates
参数用于在运行命令之前执行检查。例如, 此命令用于创建文件夹,仅在文件夹不存在时才运行。有个叫
free_form
参数,需要注意下,它的意思是指定参数的时候是否要求用"键等于值"
格式,如果是自由的,就不要求。自由格式表示此模块采用自由格式命令运行。就像我们刚才使用的那样, 更改目录或创建选项。我们的命令输入, 如
cat
或者mkdir
是自由格式输入。并非所有模块都支持这样的输入。例如, 用于将文件从源复制到目的地的复制模块只接受参数化输入而不接受自由形式输入。因此, 正如您在这里看到的, 复制需要源文件作为src
参数,目标文件作为dest
参数。但是, 上一个命令模块并不真正要求您为要运行的命令指定“键等于值"格式。命令模块中的是自由格式参数。2)另一个要查看的模块是脚本模块。
脚本模块传输完脚本后,在一个或多个远程节点上执行位于Ansible
控制器机器本地的脚本。要在一个或数百个服务器上运行脚本, 您实际上不必将其手动复制到所有服务器上。Ansible
负责自动将脚本复制到远程节点,然后在远程系统上执行它。
这是通过一个非常简单的Play
来完成的,使用脚本模块并指定脚本在Ansible
控制器机器上的位置和参数。3)让我们看一下服务模块。服务模块用于维护系统上的服务,例如启动、 停止或重新启动服务。
上图的Playbook
用于按特定顺序启动各种服务。首先, 我们使用服务模块启动数据库服务。与前面的模块不同, 服务模块没有自由格式的输入,这意味着您必须以键值对格式传递输入。我们使用name
参数来指定我们希望启动的服务的名称,在本例中为postgresql
,而state
参数则指示我们希望执行的操作,在本例中为started
。现在, 如果你想知道为什么是started
,而不是start, 后面会解释。
现在, 有两种方法来写这个语句,你可以像右边这样写, 用字典的格式去写,两种写法是等价的。
请记住, 在YAML
术语中,name
和state
是服务的属性。让我们再添加一些任务来启动,httpd
服务后面跟着nginx
服务。4)为什么
state
是started
而不是start
的?如果我们要指示Ansible
启动一个服务, 我们会说start the service httpd
, 而不是started the service httpd
。
那为什么是started
而不是start
呢?我们没有指示Ansible
启动服务。相反, 我们将指示Ansible
确保服务httpd
已启动。这实质上意味着如果httpd
服务尚未启动,则启动。如果httpd
服务已经启动, 则不要执行任何操作。这称为幂等性。根据Ansible
文档,如果执行一次操作的结果与重复执行一次操作的结果完全相同,则该操作是幂等的。
Ansible
中的大多数模块都是幂等的,Ansible
强烈建议这样做。总体思路是, 您应该能够再次运行相同的剧本,Ansible
应该报告一切都处于预期状态。如果某个东西不是,Ansible
会负责将其置于预期状态。5)
lineinfile
模块用于查找文件中的行,如果该行不存在, 则替换或添加该行。
例如, 我们有一个任务要添加一个新的DNS
服务器到/etc/resolv.conf
文件。这个简单的Ansible
剧本使用lineinfile
任务,将新的名称服务器信息添加到resolv.conf
文件。请记住,lineinfile
模块是幂等的。让我们将Ansible
剧本与一个试图实现相同结果的简单脚本进行比较。如果此脚本运行多次, 则每次都会向文件中添加一个新条目,这是不需要的。如果您多次运行Ansible Playbook
就不会添加多次 。例子:
- name: 'hosts' hosts: all become: yes tasks: - name: 'Execute a script' script: '/tmp/install_script.sh' - name: 'Start httpd service' service: name: 'httpd' state: 'started' - name: "Update /var/www/html/index.html" lineinfile: path: /var/www/html/index.html line: "Welcome to ansible-beginning course" create: true - name: 'Create a new user' user: name: 'web_user' uid: 1040 group: 'developers'
使用下面的命令可以运行这个
playbook
:ansible-playbook -i inventory playbook.yaml
更多关于Ansible的文章,请参考我的Ansible专栏:https://blog.csdn.net/u011069294/category_12331290.html