Ansible 初学者教程:剧本、命令和示例

什么是 Ansible?

Ansible 是一款用于软件配置、配置管理和软件部署的开源自动化和编排工具。Ansible 可以轻松运行和配置类 Unix 系统以及 Windows 系统以代码形式提供基础设施。它包含自己的声明式编程语言,用于系统配置和管理。

Ansible 因其安装简单、易于使用(与客户端的连接)、无需代理以及功能丰富而广受欢迎。它通过以下方式进行连接: SSH的 到客户端,因此它不需要在客户端有特殊的代理,并且通过将模块推送到客户端,模块然后在客户端本地执行,并将输出推送回 Ansible 服务器。

由于它使用 SSH,因此可以非常轻松地使用 SSH 密钥连接到客户端,从而简化整个过程。客户端详细信息(如主机名或 IP 地址和 SSH 端口)存储在称为清单文件的文件中。创建清单文件并填充后,ansible 就可以使用它了。

为什么使用 Ansible?

以下是使用 Ansible 的一些重要优点/好处

  • Ansible 最显著的优点之一是它可以免费供所有人使用。
  • 安装和使用 Ansible 不需要任何特殊的系统管理员技能,而且官方文档非常全面。
  • 其关于插件、模块、库存和剧本的模块化使 Ansible 成为协调大型环境的完美伴侣。
  • Ansible 非常轻量且一致,并且不存在有关操作系统或底层硬件的限制。
  • 由于其无代理功能以及使用 OpenSSH 安全功能,它也非常安全。
  • 鼓励采用 Ansible 的另一个优势是其平滑的学习曲线,由全面的文档和易于学习的结构和配置决定。

Ansible 的历史

以下是 ansible 历史上的重要里程碑:

  • 2012 年 XNUMX 月,Ansible 项目启动。它最初是由 Cobbler 和 Func(Fedora 统一网络控制器)的创建者 Michael DeHaan 开发的。
  • 最初名为 AnsibleWorks Inc,为 Ansible 工具提供资金的公司于 2015 年被 RedHat 收购,随后与 RedHat 一起被纳入 IBM.
  • 目前,Ansible 已包含在 Fedora Linux、RHEL、Centos 等发行版中 Oracle Linux操作系统。

Ansible 中使用的重要术语

  • Ansible 服务器

    安装 Ansible 的机器,所有任务和剧本都将在该机器上运行

  • 模块

    基本上,模块是一个命令或一组类似的 Ansible 命令,旨在在客户端执行

  • 任务

    任务是由要完成的单个程序组成的部分

  • 角色

    组织任务和相关文件以便稍后在剧本中调用的方式

  • 事实

    使用收集事实操作从全局变量中获取来自客户端系统的信息

  • 库存

    包含有关 ansible 客户端服务器的数据的文件。在后面的示例中定义为 hosts 文件

  • 下注

    执行剧本

  • 处理程序

    仅当通知程序存在时才调用的任务

  • 通知

    如果输出发生变化,则该部分将调用处理程序

  • 标签

    为任务设置名称,稍后可用于发出特定任务或任务组。

Linux 中的 Ansible 安装

一旦你比较并权衡了你的选择并决定使用 Ansible,下一步就是在你的系统上安装它。我们将以不同的方式介绍安装步骤 Linux 发行版,最流行的,在下一个小教程中。

在 Centos/RedHat 系统上安装 Ansible

步骤1) 安装 EPEL 仓库

[root@ansible-server ~]# sudo yum install epel-release

步骤2) 安装 ansible 包

[root@ansible-server ~]# sudo  yum install -y ansible

在 Centos/RedHat 系统上安装 Ansible

安装 ansible Ubuntu/Debian 系统

步骤1) 对软件包进行更新

$ sudo apt update

步骤2) 安装软件属性通用包

$ sudo apt install software-properties-common

步骤3) 安装 ansible 个人软件包存档

$ sudo apt-add-repository ppa:ansible/ansible

步骤4) 安装 ansible

$ sudo apt update
$ sudo apt install ansible

Ansible 临时命令

Ansible 最简单的使用方式之一是使用临时命令。当您想在一台或多台服务器上发出一些命令时,可以使用这些命令。临时命令不会存储以备将来使用,而是代表一种与所需服务器交互的快速方式。

对于本 Ansible 教程,将配置一个简单的两个服务器主机文件,包含 host1 和 host2。

您可以通过在所有主机上发出 ping 命令来确保可以从 ansible 服务器访问主机。

[root@ansible-server test_ansible]# ansible -i hosts all -m ping
host1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ansible 临时命令

说明:

  1. 命令的状态,在本例中为 SUCCESS
  2. 运行命令的主机
  3. 通过 -m 参数发出的命令,在本例中为 ping
  4. 使用-i参数可以指向hosts文件。


如果需要,您可以仅在特定主机上发出相同的命令。

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ansible 临时命令

说明:

  1. 限制参数可用于仅在主机文件中的特定主机上发出命令
  2. 清单文件中定义的主机名称

如果需要快速将文件复制到多个目标,可以使用 ansible 中的 copy 模块,该模块使用 SCP。因此命令及其输出如下所示:

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
host1 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source",
    "state": "file",
    "uid": 0
}
host2 | SUCCESS => {
    "changed": true,
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "dest": "/tmp/testfile",
    "gid": 0,
    "group": "root",
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source",
    "state": "file",
    "uid": 0
}

Ansible 临时命令

说明:

  1. 复制模块定义
  2. 在这种情况下,模块参数是源绝对路径和目标绝对路径。
  3. Ansible 命令输出反映了复制命令是否成功以及其他详细信息,例如用于文件完整性检查的 sha1 或 md5 校验和以及所有者、大小或权限等元数据。在一堆服务器上安装软件包非常容易。Ansible 有多个模块可以与使用的安装程序交互,例如 yum、apt、dnf 等。

在下一个示例中,您将了解如何在两个 Centos 主机上通过 yum 模块安装包。

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [


"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version                Repository       Size\n================================================================================\nInstalling:\n ncdu            x86_64            1.14-1.el7             epel             51 k\n\nTransaction Summary\n================================================================================\nInstall  1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nInstalled:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Ansible 临时命令

说明:

  1. 本例中使用了Yum模块
  2. 它定义了模块参数,在本例中,您将选择包的名称及其状态。例如,如果状态不存在,则将搜索包,如果找到,则将其删除
  3. 当颜色为黄色时,您将看到 ansible 命令的输出状态发生了变化,在这种情况下,意味着找到并安装了该包。
  4. 通过 ansible 发出的 yum install 命令的状态。在本例中,安装了软件包 ncdu.x86_64 0:1.14-1.el7。

当然,所有 yum 安装程序选项都可以通过 ansible 使用,包括更新、安装、最新版本或删除。

在下面的示例中,发出了相同的命令来删除先前安装的 ncdu 包。

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
host1 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version               Repository        Size\n================================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}
host2 | SUCCESS => {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package         Arch              Version               Repository        Size\n================================================================================\nRemoving:\n ncdu            x86_64            1.14-1.el7            @epel             87 k\n\nTransaction Summary\n================================================================================\nRemove  1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Erasing    : ncdu-1.14-1.el7.x86_64                                       1/1 \n  Verifying  : ncdu-1.14-1.el7.x86_64                                       1/1 \n\nRemoved:\n  ncdu.x86_64 0:1.14-1.el7                                                      \n\nComplete!\n"
    ]
}

Ansible 临时命令

说明:

  1. yum 命令的输出显示该包已被删除。

ansible 用于与客户端服务器交互的另一个有用且必不可少的功能是收集有关系统的一些事实。因此,它从系统获取硬件、软件和版本信息,并将每个值存储在稍后可以使用的变量中。

如果需要有关通过 ansible 修改的系统的详细信息,可以使用下一个命令。setup 模块从系统变量中收集事实。

Ansible 临时命令

Ansible 剧本

Ansible 剧本 是通过脚本向远程系统发送命令的方式。Ansible playbook 用于配置复杂的系统环境,通过向一个或多个系统执行脚本来提高灵活性。Ansible playbook 更像是一种配置语言,而不是编程语言。

Ansible playbook 命令使用 YAML 格式,因此不需要太多语法,但必须遵守缩进。顾名思义,playbook 是一系列剧本的集合。通过 playbook,您可以为某些主机指定特定角色,为其他主机指定其他角色。通过这样做,您可以在一个 playbook 中编排非常多样化场景中的多个服务器。

为了在继续使用 Ansible 剧本示例之前确保所有细节准确,我们必须首先定义一项任务。这些是角色和剧本的 ansible 模块的接口。

现在,让我们通过一个示例来学习 Ansible playbook,该示例中的一个 playbook 包含一个剧本,包含多个任务,如下所示:

---

- hosts: group1
  tasks:
  - name: Install lldpad package
    yum:
      name: lldpad
      state: latest
  - name: check lldpad service status
    service:
      name: lldpad
      state: started

Ansible 剧本

在上面的 Ansible playbook 示例中,主机文件中的主机组 1 使用 yum 模块进行 lldpad 包安装,然后使用主要用于与 systemd 集合交互的服务模块启动安装后创建的服务 lldpad。

说明:

  1. 运行剧本的主机组
  2. 此任务中使用 Yum 模块进行 lldpad 安装
  3. 服务模块用于检查安装后服务是否启动并运行

每个 ansible playbook 都与一个清单文件配合使用。清单文件包含一个按组划分的服务器列表,以便更好地控制以下详细信息: IP地址 以及每个主机的 SSH 端口。

您可以用于此 Ansible playbook 示例的清单文件如下所示。有两个组,分别名为 group1 和 group2,每个组分别包含 host1 和 host2。

[group1]
host1 ansible_host=192.168.100.2 ansible_ssh_port=22
[group2]
host2 ansible_host=192.168.100.3 ansible_ssh_port=22

Ansible 剧本

说明:

  1. 团队名字
  2. 主机名,包括 IP 地址和 ssh 端口,在本例中为默认值 22。

另一个有用的 Ansible playbook 示例是下一个,其中包含两个主机的两个剧本。对于第一组主机 group1,将启用 selinux。如果启用,则主机屏幕上将显示一条消息。

对于第二组主机,仅当 ansible_os_family 是 RedHat 并且 ansible_system_vendor 是 HP 时,才会安装 httpd 包。

Ansible_os_family 和 ansible_system_vendor 是使用 gather_facts 选项收集的变量,可以像本条件示例一样使用。

---

- hosts: group1
  tasks:
  - name: Enable SELinux
    selinux:
      state: enabled
    when: ansible_os_family == 'Debian'
    register: enable_selinux

  - debug:
      Imsg: "Selinux Enabled. Please restart the server to apply changes."
    when: enable_selinux.changed == true

- hosts: group2
  tasks:
  - name: Install apache
    yum:
      name: httpd
      state: present
    when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'

Ansible 剧本

说明:

  1. when 子句的示例,在本例中,当 OS 类型为 Debian 时。ansible_os_family 变量是通过 gather_facts 功能收集的。
  2. 任务输出已注册以供将来使用,其名称为 enable_selinux
  3. 另一个 when 子句的例子。在这种情况下,如果之前确实启用了 SELinux,则会向主机用户显示一条消息。
  4. 另一个由两个规则组成的 when 子句的示例

除了任务之外,还有一些称为处理程序的特定任务。处理程序在整个剧本中必须具有唯一的名称。它们的工作方式与常规任务相同,但可以通过通知程序通知处理程序。

如果在剧本运行期间未通知处理程序,则该处理程序不会运行。但是,如果多个任务通知处理程序,则该处理程序在所有任务完成后只会运行一次。

在下面显示的示例中,您可以看到特定任务如何具有调用另一个任务的通知部分。如果第一个任务的输出发生变化,则会调用处理程序任务。最好的示例是更改配置文件,然后重新启动该特定服务。

---

- hosts: group2
  tasks:
  - name: sshd config file modify port
    lineinfile:
     path: /etc/ssh/sshd_config
     regexp: 'Port 28675'
     line: '#Port 22'
    notify:
       - restart sshd
handlers
    - name: restart sshd
      service: sshd
        name: sshd
        state: restarted

在这种情况下,如果第一个任务“sshd config file modified port”被改变,意味着如果端口一开始就不是28675,那么它将被修改,并且任务将通知同名的处理程序运行,它将重新启动sshd服务。

Ansible 剧本

说明:

  1. 通知程序示例
  2. 处理程序示例

Ansible 角色

处理大量剧本时,将任务拆分为角色会更容易。这也有助于将来重复使用角色。角色是任务的集合,可以从一个剧本移动到另一个剧本,可以独立运行,但只能通过剧本文件运行。

角色存储在单独的目录中,并具有特定的目录结构。

[root@ansible-server test2]# tree
.
`-- role1
    |-- defaults
    |   `-- main.yml
    |-- handlers
    |   `-- main.yml
    |-- meta
    |   `-- main.yml
    |-- README.md
    |-- tasks
    |   `-- main.yml
    |-- tests
    |   |-- inventory
    |   `-- test.yml
    `-- vars
        `-- main.yml

7 directories, 8 files

defaults 目录中的 yaml 文件包含与剧本一起使用的默认变量列表。handlers 目录用于存储处理程序。meta 目录应该包含有关作者和角色依赖关系的信息。tasks 目录中有该角色的主要 yaml 文件。

测试目录包含一个示例 yaml 剧本文件和一个示例库存文件,主要用于创建实际角色之前的测试目的。

vars 目录包含 yaml 文件,其中将定义角色使用的所有变量。目录 templates 和目录 files 应包含角色中的任务将使用的文件和模板。

要为角色​​创建目录树,您应该使用以下命令及其最后一个参数,即角色名称:

[root@ansible-server test2]# ansible-galaxy init role1

Ansible 也能很好地与模板配合使用。作为模板语言,它使用 Jinja2。

在下一个示例中,您将了解基本的 jinja2 模板是什么样子并在角色中使用它。

在运行时,根据您的服务器位于哪个数据中心,您可以使用变量“resolver_ip_addresses”从多个名称服务器中进行选择,每个名称服务器对应一个数据中心。

{% for resolver in resolver_ip_addresses %}
nameserver {{ resolver }}
{% endfor %}

options timeout:1
options attempts:5
options rotate

在这个例子中,在 playbook 目录中,定义了一些变量,包括一个名为 resolver_ip_addresses 的变量,其值根据数据中心的不同而不同。

- name: Set resolver for server
  template:
    src: dns.j2
    dest: /etc/resolv.conf
    group: root
    owner: root
    mode: "0644"
    tag: resolver	

Ansible 角色

说明:

  1. 要使用的模板的名称。模板位于角色路径中的模板目录中
  2. 在客户端,要用模板替换的文件名的目标路径。
  3. 目标文件的权限

角色任务还可以有一个标签字段,该字段具有名称属性。多个任务可以共享同一个标签。运行 ansible playbook 时,您也可以指定标签,这样这些任务就会被执行。

Ansible 案例研究

在本节中,我们将分析一个具有三个角色的基本 ansible playbook 的案例研究。这样做的目的是给出我们之前讨论的内容的实际示例。本 Ansible playbook 教程中之前使用的一些示例将在本 playbook 中进行调整和使用。

以下是剧本的目录结构。将使用的 Yaml 文件是 p4.yml。

[root@ansible-server test_ansible]# ls -lrth
total 16K
-rw-r--r--. 1 root root   0 Jul  3 10:13 testfile
-rw-r--r--. 1 root root 203 Jul  3 13:30 p1.yml
-rw-r--r--. 1 root root 125 Jul  3 15:00 hosts
-rw-r--r--. 1 root root 488 Jul  3 16:40 p2.yml
-rw-r--r--. 1 root root 188 Jul  4 17:33 p4.yml
drwxr-xr-x. 5 root root  47 Jul  4 17:35 roles
[root@ansible-server test_ansible]# cd roles
[root@ansible-server roles]# ls -lrth
total 12K
drwxr-xr-x. 9 root root 4.0K Jul  4 12:52 httpd
drwxr-xr-x. 9 root root 4.0K Jul  4 13:55 selinux
drwxr-xr-x. 9 root root 4.0K Jul  4 16:54 resolver

该剧本有三个角色,一个角色称为解析器,它通过将文件从服务器复制到 /etc/resolv.conf 目标来在服务器上设置特定的名称服务器。另一个角色称为 httpd,它使用 yum 模块安装 httpd 包,第三个角色启用 SELinux 并通知登录用户重新启动系统。每个角色都是使用 ansible-galaxy 命令创建的。

解析器角色,main.yml 任务:

Ansible 案例研究

Httpd角色,main.yml任务:

Ansible 案例研究

Selinux角色,main.yml任务:

Ansible 案例研究

下面是定义的 p4.yml playbook。如果命令行中未另行指定,它将在所有主机上运行,​​它将以 root 用户身份在端口 22 (SSH) 上运行,它将在运行角色之前收集事实,并且它将运行前面提到的所有三个角色。每个角色都可以通过在 ansible-playbook 命令行中使用 –t 参数指定标签来独立运行。

---

- hosts: all
  user: root
  port: 22
  gather_facts: True
  roles:
    - { role: selinux, tags: selinux }
    - { role: httpd, tags: httpd }
    - { role: resolver, tags: resolver }

在两台主机上运行 p4.yml 剧本并解释输出。可以使用 –check 参数运行相同的命令进行试运行。如果您想使用密码验证,请使用 -k 参数。

Ansible 案例研究

说明:

  1. 运行 p4.yml 的 Ansible-playbook 命令
  2. Playbook 跳过 SELinux 角色,因为它已经启用。
  3. Ansible 发现 httpd 包已经安装,因此返回 ok。
  4. 解析器已设置,并且角色解析器的状态已改变。

Ansible 命令速查表

在 Centos/RHEL 系统上安装 EPEL repo

[root@ansible-server ~]# sudo yum install epel-release

在 Centos/RHEL 系统上安装 ansible 包

[root@ansible-server ~]# sudo  yum install -y ansible

对 Debian/ 上的软件包进行更新Ubuntu 系统

$ sudo apt update

在 Debian/ 上安装 software-properties-common 包Ubuntu 系统

$ sudo apt install software-properties-common

在 Debian/ 上安装 ansible 个人软件包存档Ubuntu 系统

$ sudo apt-add-repository ppa:ansible/ansible

在 Debian/ 上安装 ansibleUbuntu 系统

$ sudo apt update
$ sudo apt install ansible

在清单文件中定义的所有名为 hosts 的服务器上发出 ping 命令

 
[root@ansible-server test_ansible]# ansible -i hosts all -m ping

仅在 host2 上发出 ping 命令

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2

将清单文件中的“testfile”文件复制到所有主机上

[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"

在所有主机上安装 ncdu 包

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'

删除所有主机上的 ncdu 包

[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'

为名为 role1 的角色构建目录结构。

[root@ansible-server test2]# ansible-galaxy init role1

试运行 p4.yml 剧本

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check

对所有主机运行 p4.yml 剧本并进行密码验证

[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k

结语

在这个技术不断快速变化且同时以惊人的速度发展的世界里,系统管理员和 devops 工程师必须考虑如何自动执行日常任务和协调大量服务器的不同方法。

虽然有很多 Ansible 的替代品 (Chef、Puppet)有很多类似的东西,但有一些不同,Ansible 凭借其简单性、更高的安全性以及最重要的平滑的学习曲线而脱颖而出。由于这些特点和 Ansible 的快速采用,我们创建了一个包含大量示例的教程,以便您在首次使用 Ansible 时获得更加无缝的体验。

在本 Ansible 基础教程中,我们描述了 Ansible 并谈论了一些它的历史。我们提到了 Ansible 的优点以及 Ansible 可以为不同规模的基础设施的自动化和编排带来的优势。我们定义了 Ansible 使用的必要术语并定义了 Ansible 剧本的结构。详尽的示例伴随着所有信息和详细的解释。