如何创建 Ansible Playbooks 来自动化 Ubuntu 体系配置

打印 上一主题 下一主题

主题 688|帖子 688|积分 2064

前些天发现了一个巨牛的人工智能学习网站,普通易懂,风趣幽默,不由得分享一下给大家。点击跳转到网站。
介绍


Ansible 是一个简朴的配置管理体系,可用于自动化和构造大型计算机网络的体系配置使命。虽然其他一些配置管理体系必要在服务器和客户端体系上安装很多不同的软件包,但利用 Ansible 只必要安装一个服务器组件并且具有对客户端呆板的 SSH 访问权限。
在之前的指南中,我们讨论了如何安装 Ansible 软件并学习基本命令。在本指南中,我们将讨论 Ansible playbook,这是 Ansible 创建自动化脚本来配置客户端计算机的方式。
我们假设您已经配置了一个 Ansible 服务器和一些客户端,就像我们在上一个教程中留下的那样。在我们的指南中,服务器是一台 Ubuntu 12.04 呆板,我们将要配置的客户端也是 Ubuntu 12.04 呆板,以便表明更轻易。
什么是 Ansible Playbooks?


Ansible playbook 是以脚本方式向长途计算机发送命令的一种方式。与单独利用 Ansible 命令从命令行长途配置计算机不同,您可以通过向一个或多个体系传递脚本来配置整个复杂的环境。
Ansible playbook 是用 YAML 数据序列化格式编写的。如果您不知道什么是数据序列化格式,可以将其视为一种将程序化数据结构(列表、数组、字典等)转换为可以轻松存储到磁盘的格式的方法。然后可以在以后利用该文件来重新创建结构。JSON 是另一种流行的数据序列化格式,但 YAML 更轻易阅读。
每个 playbook 包含一个或多个 plays,它们将主机映射到特定功能。Ansible 通过称为 tasks 的内容来实现这一点,这些内容基本上是模块调用。
探索一个基本的 Playbook


让我们看一个基本的 playbook:
  1. ---
  2. - hosts: droplets
  3.   tasks:
  4.     - name: Installs nginx web server
  5.       apt: pkg=nginx state=installed update_cache=true
  6.       notify:
  7.         - start nginx
  8.   handlers:
  9.     - name: start nginx
  10.       service: name=nginx state=started
复制代码
让我们分解一下这些部门,以便我们了解这些文件是如何构建的以及每个部门的寄义。
文件以以下内容开始:
  1. ---
复制代码
这是 YAML 要求的,以将文件表明为一个正确的文档。YAML 允许一个文件中存在多个“文档”,每个文档由 ---
分隔,但 Ansible 只盼望每个文件只有一个,因此这应该只出如今文件顶部。
YAML 对空格非常敏感,并利用它来将不同的信息组合在一起。您应该只利用空格而不是制表符,并且必须对文件利用同等的空格以便正确读取。具有雷同缩进级别的项目被视为同级元素。
以 - 开头的项目被视为列表项。具有 key: value 格式的项目被视为哈希或字典。这基本上就是基本的 YAML。
YAML 文档基本上界说了一个包含元素的分层树结构,此中包含的元素位于左侧。
在第二行,我们有以下内容:
  1. ---
  2. - hosts: droplets
复制代码
这是 YAML 中的列表项,就像我们上面学到的那样,但由于它位于最左侧级别,它也是 Ansible 的“play”。Play 基本上是在一组特定主机上实行的使命组,以使它们能够实行您想要分配给它们的功能。每个 play 必须指定一个主机或一组主机,就像我们在这里做的那样。
接下来,我们有一组使命:
  1. ---
  2. - hosts: droplets  tasks:    - name: Installs nginx web server      apt: pkg=nginx state=installed update_cache=true      notify:        - start nginx
复制代码
在顶层,我们有“tasks:”,与“hosts:”处于雷同级别。这包含一个列表(因为它以“-”开头),此中包含键值对。
第一个键“name”更像是描述而不是名称。您可以随意命名它。
接下来的键是“apt”。这是对 Ansible 模块的引用,就像当我们利用 ansible 命令并键入类似以下内容时:
  1. ansible -m apt -a 'whatever' all
复制代码
此模块允许我们指定一个软件包以及它应该处于的状态,在我们的环境下是“installed”。update-cache=true 部门告诉我们的长途呆板在安装软件之前更新其软件包缓存(apt-get update)。
“notify” 项包含一个包含一个项目的列表,称为“start nginx”。这不是内部 Ansible 命令,而是对处理程序的引用,当从使命内部调用时,它可以实行某些功能。我们将在下面界说“start nginx”处理程序。
  1. ---
  2. - hosts: droplets
  3.   tasks:
  4.     - name: Installs nginx web server
  5.       apt: pkg=nginx state=installed update_cache=true
  6.       notify:
  7.         - start nginx
  8.   handlers:
  9.     - name: start nginx
  10.       service: name=nginx state=started
复制代码
“handlers” 部门与“hosts”和“tasks”处于雷同级别。处理程序就像使命一样,但只有在使命告诉它们客户端体系发生了更改时才会运行。
例如,我们在这里有一个处理程序,在安装软件包后启动 Nginx 服务。只有当“Installs nginx web server”使命导致体系发生更改时,即软件包必须安装且尚未存在时,才会调用处理程序。
我们可以将此 playbook 生存到一个名为“nginx.yml”的文件中。
只是为了一些背景,如果您要在 JSON 中编写雷同的文件,它大概看起来像如许:
  1. [
  2.     {
  3.         "hosts": "droplets",
  4.         "tasks": [
  5.             {
  6.                 "name": "Installs nginx web server",
  7.                 "apt": "pkg=nginx state=installed update_cache=true",
  8.                 "notify": [
  9.                     "start nginx"
  10.                 ]
  11.             }
  12.         ],
  13.         "handlers": [
  14.             {
  15.                 "name": "start nginx",
  16.                 "service": "name=nginx state=started"
  17.             }
  18.         ]
  19.     }
  20. ]
复制代码
正如您所看到的,YAML 更加紧凑,大多数人会说更易读。
运行 Ansible Playbook


一旦你建立了一个 playbook,你可以利用以下格式轻松调用它:
  1. ansible-playbook <span class="highlight">playbook.yml</span>
复制代码
例如,如果我们想在所有 droplets 上安装并启动 Nginx,我们可以实行以下命令:
  1. ansible-playbook nginx.yml
复制代码
由于 playbook 本身指定了它应该运行的主机(即我们在上一篇教程中创建的 “droplets” 组),我们不必指定要运行的主机。
然而,如果我们想要将主机列表过滤为仅适用于此中一个主机,我们可以添加一个标志来指定文件中主机的子集:
  1. ansible-playbook -l <span class="highlight">host_subset</span> <span class="highlight">playbook.yml</span>
复制代码
因此,如果我们只想在 “host3” 上安装并运行 Nginx,我们可以输入以下命令:
  1. ansible-playbook -l host3 nginx.yml
复制代码
向 Playbook 添加功能


如今我们的 playbook 如下所示:
  1. ---
  2. - hosts: droplets
  3.   tasks:
  4.     - name: Installs nginx web server
  5.       apt: pkg=nginx state=installed update_cache=true
  6.       notify:
  7.         - start nginx
  8.   handlers:
  9.     - name: start nginx
  10.       service: name=nginx state=started
复制代码
它很简朴,而且它可以工作,但它只是安装了一个软件并启动了它。这本身并没有太多好处。
我们可以通过向 playbook 添加使命来扩展功能。
添加默认索引文件


我们可以通过添加以下行来告诉它将文件从 Ansible 服务器传输到主机上:
  1. ---
  2. - hosts: droplets  tasks:    - name: Installs nginx web server      apt: pkg=nginx state=installed update_cache=true      notify:        - start nginx<span class="highlight">    - name: Upload default index.html for host</span><span class="highlight">      copy: src=static_files/index.html dest=/usr/share/nginx/www/ mode=0644</span>  handlers:    - name: start nginx      service: name=nginx state=started
复制代码
然后我们可以在当前目录下创建一个名为 static_files 的目录,并在此中放置一个 index.html 文件。
  1. mkdir static_files
  2. nano static_files/index.html
复制代码
在这个文件中,让我们创建一个基本的 HTML 结构:
  1. <html>
  2.   <head>
  3.     <title>This is a sample page</title>
  4.   </head>
  5.   <body>
  6.     <h1>Here is a heading!</h1>
  7.     <p>Here is a regular paragraph.  Wow!</p>
  8.   </body>
  9. </html>
复制代码
生存并关闭文件。
如今,当我们重新运行 playbook 时,Ansible 将查抄每个使命。它会看到 Nginx 已经安装在主机上,以是它会保持不变。它会看到新的使命部门,并用我们服务器上的文件替换默认的 index.html 文件。
注册结果


当你手动安装和配置服务时,险些总是必要知道你的操纵是否乐成。我们可以通过利用 “register” 将这个功能嵌入到我们的 playbook 中。
对于每个使命,我们可以选择在一个变量中注册它的结果(失败或乐成),以便以后可以查抄。
在利用这个功能时,我们还必须告诉 Ansible 忽略该使命的错误,因为通常环境下,如果出现任何标题,它会中断该主机的 playbook 实行。
因此,如果我们想要查抄使命是否失败,以决定后续步骤,我们可以利用注册功能。
例如,我们可以告诉我们的 playbook 如果存在 index.php 文件,则上传它。如果该使命失败,我们可以尝试上传一个 index.html 文件。我们将在另一个使命中查抄失败的条件,因为我们只想在 PHP 文件失败时上传 HTML 文件:
  1. ---
  2. - hosts: droplets  tasks:    - name: Installs nginx web server      apt: pkg=nginx state=installed update_cache=true      notify:        - start nginx    <span class="highlight">- name: Upload default index.php for host</span>      <span class="highlight">copy: src=static_files/index.php dest=/usr/share/nginx/www/ mode=0644</span>      <span class="highlight">register: php</span>      <span class="highlight">ignore_errors: True</span>    <span class="highlight">- name: Remove index.html for host</span>      <span class="highlight">command: rm /usr/share/nginx/www/index.html</span>      <span class="highlight">when: php|success</span>    - name: Upload default index.html for host      copy: src=static_files/index.html dest=/usr/share/nginx/www/ mode=0644      <span class="highlight">when: php|failed</span>  handlers:    - name: start nginx      service: name=nginx state=started
复制代码
留意:我们目前尚未配置我们的主机来处理 PHP 文件,因此纵然你上传了 PHP 文件,它也不会被正确处理。
这个新版本尝试将一个 PHP 索引文件上传到主机上。它将操纵的乐成注册到一个名为 “php” 的变量中。
如果这个操纵乐成,接下来会运行删除 index.html 文件的使命。
如果操纵失败,将上传 index.html 文件。
结论


如今,你应该已经把握了如何利用 Ansible 自动化复杂使命的方法。这是一个基本示例,演示了如何开始构建你的配置库。
联合我们在第一个教程中学到的主机和组界说,并利用可用的变量填写信息,我们可以开始组装相互交互的复杂计算机体系。在未来的文章中,我们将讨论如何将变量实行到我们的 playbook 中,并创建脚色来帮助管理复杂使命。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表