如何创建和使用Ansible(如何创建和使用Webhook)

如何创建和使用Ansible(如何创建和使用Webhook)

浏览次数:
信息来源: 用户投稿
更新日期: 2025-10-08
文章简介

Ansible的核心组件之一是剧本文件。Ansible使用playbook文件来定义复杂的任务,这些任务在用户参与有限的情况下针对受管节点执行。在本指南中,您将学习如何创建和使用Ansible剧本文件

2025阿里云双十一服务器活动

Ansible的核心组件之一是剧本文件。Ansible使用playbook文件来定义复杂的任务,这些任务在用户参与有限的情况下针对受管节点执行。在本指南中,您将学习如何创建和使用Ansible剧本文件在托管节点上执行任务。

剧本本质上是一个包含一个或多个剧本的YAML文件。play是针对/etc/ansible/hosts文件中指定的托管主机执行的一组有序任务。剧本中的每个剧本都代表一个独特的任务,具有目标主机的特定于环境的参数。

剧本非常灵活,可以在多个服务器上无限期重复使用以执行相同的任务。Ansibleplaybook通常用于服务器配置、网络设备管理和应用程序部署任务。

  • 安装了Ubuntu20.04操作系统和Ansible的控制节点。如果您之前没有安装过Ansible,请按照我们关于如何在Ubuntu20.04上安装和配置Ansible的指南进行操作。
  • 在控制节点的主机文件中配置的单个受管节点将用于运行剧本任务。
  • 让我们从制作和运行我们的第一个Ansible剧本开始。在控制节点上的/etc/ansible/目录中创建一个简单的YAML文件,如下所示:

    sudovim/etc/ansible/playbook-01.yml

    现在使用以下代码填充剧本文件:

    -name:Asimpleplaybookfile

    -name:Printasamplemessage

    msg:HelloWorld.WelcometoAnsibleplaybooks!

    该name指令的第一个实例指定了该剧的名称。第二个实例指定任务的名称。

    该hosts指令指定将在其上执行剧本的目标主机。在此示例中,剧本将在清单文件中指定的所有主机上运行。要定位特定主机,请提供主机的IP地址或域名。

    该tasks指令是要在目标主机上执行的任务列表。在这个剧本中,我们有一个任务将语句打印到标准输出。

    关键字是Ansible自带的debug内置模块,在Playbook运行时打印语句。此外,在不停止playbook的情况下调试语句和变量时,它会派上用场。该debug模块带有一些选项,例如msg和var。该msg选项指定要打印到标准输出的字符串。

    要运行剧本,请使用ansible-playbook如下所示的命令:

    ansible-playbook/path/to/playbook_file

    在我们的示例中,您应该运行以下命令:

    ansible-playbook/etc/ansible/playbook-01.yml

    在playbook执行期间,您应该会看到以下输出:

    请注意,执行了两项任务,尽管我们在Playbook文件中只定义了一项。

    第一个任务收集有关受管节点的事实。Ansiblefacts是指以JSON格式呈现的特定于主机的系统数据,例如BIOS信息、系统日期和时间、操作系统类型和版本以及IP地址。它还包括硬件数据,例如块设备、CPU、RAM和交换空间等等。

    第二个任务按照playbook文件中的指定将一条简单消息打印到标准输出。ok=2表示成功执行了两个任务。

    如果您想获得所有Ansible事实的列表,请执行以下命令:

    Ansible模块是独立的可重复使用的Python脚本,在Playbook中被引用以帮助在托管节点上执行特定任务。Ansible模块可以自动执行托管节点上的各种任务,包括包管理、服务管理、文件管理等等。

    在本节中,我们将演示如何通过将模块合并到Playbook中来完成各种系统管理任务。

    管理软件包是一项基本的系统管理任务。它专门处理在Linux服务器中安装和删除软件包。如图所示,Ansible为主要Linux发行版提供了内置包管理模块。

    Debian/Ubuntu变体

    CentOS/Rocky等RHEL变体

    ArchLinux和Arch变体

    以下剧本文件将Apache网络服务器安装在清单文件中网络服务器子组下定义的远程目标上。该apt模块提供两个选项:name指定包名称的选项(?apache2?)和state指示Ansible安装最新版本的Apache的选项。

    -name:installApachewebserveronUbuntu

    运行playbook文件后,您应该会得到与我们所拥有的类似的输出:

    ansible-playbook/etc/ansible/playbook-02-install-apache.yml

    在RHEL8和CentOS8上,可以使用该dnf模块完成相同的任务。在这里,用于RedHat衍生产品的Apache包由httpd定义。

    您还可以使用模块来启动、停止和重新启动受管节点上正在运行的服务。例如,要重新启动Apache网络服务器,我们将使用service显示的剧本中的模块。

    -name:RestartApachcewebserver

    这是一本展示如何停止网络服务器的剧本。注意state参数从restarted到stop的变化。

    -name:StopApachewebserver

    从playbook执行的输出可以看出任务成功:

    要启动网络服务器,请将state参数设置为started。

    -name:StartApachewebserver

    再一次,这里是剧本执行的输出:

    另一个有用的模块是复制模块。顾名思义,该模块用于将文件从一个位置复制到另一个位置。您可以将文件从Ansible控制器复制到远程节点或将文件从远程节点中的一个位置复制到另一个位置。

    在下面的Playbook文件中,我们将sales_report.txt文件从Ansible控制节点复制到/tmp/reports/目录中的远程服务器。此外,我们已使用和选项将所有者和组所有权分配给cherry用户。该选项将八进制文件权限0644分配给文件。ownergroupmode

    -name:Ansiblecopymoduleexample

    -name:Copyfilesfromcontrolnodetoremotenode

    src:/home/user/Documents/sales_report.txt

    Playbook执行的结果打印如下:

    要在远程节点内复制文件,请使用该remote_src选项并将其设置为yes。在下面的示例中,我们正在远程节点上制作apache2.conf配置文件的备份副本。简而言之,我们正在复制该文件并将其重命名为apache2.conf.back。

    -name:Ansiblecopymoduleexample

    -name:Copyfileswithintheremotenode

    src:/etc/apache2/apache2.conf

    dest:/etc/apache2/apache2.conf.bak

    该lineinfile模块是用于在一行上执行多种任务的模块,例如修改、替换或向文件添加一行。它可以与正则表达式结合使用以匹配特定行并进行更改。

    为了演示其功能,让我们举几个例子。该剧本通过更改两个参数修改远程目标上的SSH服务配置。第一个任务将ClientAliveInterval指令设置为

    15而第二个任务将ClientAliveCountMax指令设置为4。该regexp选项匹配包含我们试图修改的参数的行。

    -name:EnsureClientAliveIntervalissetto15

    path:/etc/ssh/sshd_config

    regexp:"^ClientAliveInterval"

    line:ClientAliveInterval=15

    -name:EnsureClientAliveCountMaxissetto4

    path:/etc/ssh/sshd_config

    regexp:"^ClientAliveCountMax"

    line:ClientAliveCountMax=4

    剧本按照出现的顺序执行这两个任务——从第一个到最后一个:

    如何创建和使用Ansible,如何创建和使用Webhook

    要向文件添加一行,请指定文件的完整路径、要添加到文件的行,然后将create选项设置为yes。

    显示的剧本将新行添加173.82.120.115cherry.localdomain到远程节点上的/etc/hosts文件。

    -name:Addanewlinetoafile

    -name:Addanewlinetoafile

    line:173.82.120.115cherry.localdomain

    Command模块采用一个命令名称,后跟一个参数列表。该命令在目标节点上执行,但输出不显示到标准输出。

    显示的剧本在目标模式上运行"uptime"和"date"命令。

    -name:Executecommandsonremotetargets

    -name:Executetheuptimecommand

    -name:Executethedatecommand

    该剧本成功运行,但是没有打印出命令的输出。

    要将结果打印到标准输出,请使用该shell模块。register使用我们定义的uptime_var和date_var变量的选项捕获这两个命令的输出。这些变量最终由msg选项引用,并将值打印到标准输出。

    -name:Executecommandsonremotetargets

    -name:Executetheuptimecommand

    msg:"{{uptime_var.stdout}}"

    -name:Executethedatecommand

    msg:"{{date_var.stdout}}"

    在playbook执行输出中,您可以看到打印的两个命令的输出:

    到目前为止,我们只演示了几个模块。有成百上千的Ansible模块用于执行不同的任务。如需更全面的Ansible模块列表,请访问Ansible模块文档页面。

    如果您是开发人员或程序员,您很可能在代码中无数次使用过变量。与许多编程语言一样,Playbook中使用变量来存储值。您可以为变量赋值并在剧本中的任何位置引用它。

    变量也可以来自外部源,例如变量文件,然后在Playbook中引用。处理来自多个来源且名称相同的变量时,将应用特殊的优先级规则。

    为了演示在实践中如何使用变量,让我们创建一个playbook文件,该文件将打印出两个变量的值:greetings和topic。

    -name:Ansiblevariablesinpractice

    -name:Ansiblebasicvariableexample

    msg:"{{greetings}},let'slearn{{topic}}."

    该vars部分定义了调试模块将在播放范围内引用的变量列表。剧本文件中指定的所有任务和文件都可以访问这些变量。

    在输出中,分配给变量的值已打印到stdout以代替变量名称。

    或者,您可以有一个可变项目列表。在下面的剧本中,让我们定义一个名为的变量oceans,其中包含代表五大洋的五个值的列表。

    -name:Ansiblelistvariableexample

    -name:Ansiblelistvariablesexample

    msg:"Thefiveoceansintheworldare{{oceans}}"

    该剧本遍历该部分下的值列表,并使用该选项vars将它们打印到标准输出。msg

    此外,您可以使用指令中的index[x]属性访问变量中的每个值,msg其中x是列表中项目的值。第一项用表示index[0]。例如,要访问列表中的第三项,我们将引用修改为

    当您需要根据特定条件执行一组任务时,将使用条件语句。在AnsiblePlaybooks中when是一个广泛使用的条件语句,它与ORandAND运算符一起使用。

    为了更好地阐述条件语句的工作原理,我们将使用两个不同操作系统系列的托管节点进行简单设置:

    服务器IP:173.82.120.115Ubuntu20.04

    服务器IP:173.82.255.207CentOS8.3

    考虑下面的剧本。该when语句指示Playbook在属于Debian操作系统系列的所有服务器上安装Nginx网络服务器。我们在ansible_os_family这里使用属于Ansiblefacts对象的变量,因此您不需要在您的剧本中定义它。

    -name:Ansiblewhenconditionalstatement

    -name:installnginxwebserver

    when:ansible_os_family=="Debian"

    从playbook执行的输出中,我们可以看到CentOS主机已被排除,因为它不满足我们的条件。

    在“when”语句中使用“AND”运算符

    使用and运算符时,必须满足这两个条件。在此示例中,如果受管节点属于DebianLinux系列并且其版本号为20.04,则playbook将成功运行任务。

    -name:Ansiblewhen-andconditionalstatement

    -name:installnginxwebserver

    when:ansible_os_family=="Debian"andansible_distribution_version=="20.04"

    由于Ubuntu节点符合条件,剧本将成功运行并在其上安装Nginx,但会跳过CentOS8服务器。

    在“when”语句中使用“OR”运算符

    如果满足任一条件,则使用or运算符将执行任务。在以下Playbook中,data在属于Debian或RedHatLinux系列的托管节点的主目录中创建了一个名为的新目录。

    -name:Ansiblewhen-orconditionalstatement

    -name:"createadirectoryifitdoesn'texist"

    when:ansible_os_family=="Debian"oransible_os_family=="RedHat"

    可以预见,该目录是在两个被管节点上创建的,因为它们都属于两个操作系统系列中的任何一个。

    为了确认这一点,我们将列出两个节点上主目录的内容。

    sshroot@173.82.255.207"ls-l"

    sshroot@173.82.120.115"ls-l"

    有时,您会发现自己执行重复性任务,这些任务需要您编写执行相同操作的多个任务。举个例子,一个在目标系统上创建新用户的剧本,如图所示。

    -name:Createnewusersronremotemachine

    -name:CreatenewuserAlice

    -name:CreatenewuserPatric

    显然,这里有很多重复。在处理多个性质相似的任务时,这可能会令人生畏且耗时。这是循环派上用场的地方。

    循环提供了一种使用更少代码行执行重复性任务的简化方法。它们遍历使用looporwith_*指令指定的值列表。

    该指令列出了由双花括号括起来loop的变量引用的值。item在运行时,剧本遍历loop指令定义的用户列表。然后将每个用户传递给item变量,并以简单而有效的方式创建所有用户。很明显,剧本看起来更简洁,实现相同目标的代码行更少。

    -name:Createnewusersinremotemachine

    -name:CreatenewuserAlice

    这是Playbook执行的输出,用于确认用户的创建:

    在本指南中,您学习了如何创建和运行Ansible剧本。您已经深入研究了各种Playbook元素,例如模块、变量、条件语句和循环。

    标签:
    什么是内部的网络安全威胁(内部网络安全的主因)
    « 上一篇
    返回列表
    下一篇 »

    如本文对您有帮助,就请抽根烟吧!