网易首页 > 网易号 > 正文 申请入驻

如何创建 Ansible 脚本

0
分享至

在本文中,您将学习如何创建 Ansible 剧本。作为练习,您将在两台目标计算机上安装 Apache Web 服务器并更改欢迎页面。

一、简介

在前两篇 Ansible 博文中,您学习 了如何设置 Ansible 测试环境以及 如何创建 Ansible 清单。这篇文章是这个系列的延续,但没有必要阅读前两篇文章。在本文中,您将学习如何创建 Ansible 剧本。剧本由执行任务的一个或多个剧本组成。这些任务调用 Ansible 模块。如果您还不了解这一点,请不要担心,这就是您将要学习的内容。还建议阅读 Ansible 文档中的剧本介绍。

如果您没有阅读之前的博客或仅作为提醒,该环境由一台控制器和两台 Target 机器组成。Controller 和 Target 机器在 VirtualBox VM 中运行。Ansible 脚本的开发是在主机上使用 IntelliJ 完成的。这些文件通过脚本从主机同步到控制器。在这个博客中,机器有以下 IP 地址:

  1. 控制器:192.168.2.11
  2. 目标 1:192.168.2.12
  3. 目标 2:192.168.2.13

本博客中使用的文件可在 GitHub 上相应的 git 存储库中找到。

2.先决条件

以下先决条件适用于此博客:

  1. 你需要一个Ansible测试环境,看 之前的一篇博客如何搭建测试环境;
  2. 您需要具备 Ansible Inventory 和 Ansible Vault 的基础知识, 如果您没有这方面的知识,请参阅之前的博客;
  3. 如果您使用自己的环境,您应该知道 Ubuntu 22.04 LTS 用于 Controller 和 Target 机器以及 Ansible 版本 2.13.3;
  4. 基本的 Linux 知识。
3. 你的第一本剧本

作为第一个 playbook,您将创建一个 playbook,它将 ping Target1 和 Target2 机器。该剧本可以在 git 存储库中找到playbook-ping-targets-success.yml,如下所示:

- name: Ping target1

hosts: target1
tasks:
- name: Ping test
ansible.builtin.ping:
- name: Ping target2
hosts: target2
tasks:
- name: Ping test
ansible.builtin.ping:

让我们看看这个剧本是什么样子的。剧本由剧本组成。在这个剧本中,可以找到名称 Ping target1和 两个剧本Ping target2。hosts对于每个剧本,您可以通过引用清单文件中的名称的参数来指示它需要在何处运行 。

剧本由任务组成。在这两个剧本中,只有一个任务是用 name 定义的 Ping test。

任务调用 Ansible 模块。可以在此处找到可以使用的模块列表 。了解存在哪些模块、如何找到它们、如何使用它们等非常重要。Ping 模块的文档 是本示例所需要的,因此请花点时间看看它。

最后要注意的是,使用了 FQCN(完全合格的集合名称)。这被认为是最佳实践。

从 Controller 机器运行 playbook。如果您按原样使用 git 存储库中的文件,则需要输入保管库密码,即itisniceweather.

$ ansible-playbook playbook-ping-targets-success.yml -i inventory/inventory.ini --ask-vault-pass
Vault password:
PLAY [Ping target1] ***********************************************************************************************
TASK [Gathering Facts] ********************************************************************************************
ok: [target1]
TASK [Ping test] **************************************************************************************************
ok: [target1]
PLAY [Ping target2] ***********************************************************************************************
TASK [Gathering Facts] ********************************************************************************************
ok: [target2]
TASK [Ping test] **************************************************************************************************
ok: [target2]
PLAY RECAP ********************************************************************************************************
target1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
target2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

日志记录准确显示执行了哪些播放和哪些任务,以及它们是否执行成功。

Ping 模块还提供了使命令崩溃的选项。在Target1播放中,data为了让命令崩溃,添加了参数。该剧本可以在 git 存储库中找到,格式为playbook-ping-targets-failure.yml.- name: Ping target1

hosts: target1
tasks:
- name: Ping test
ansible.builtin.ping:
data: crash
...

执行此 playbook 将使 Target1 play 崩溃并且该 playbook 刚刚结束。

$ ansible-playbook playbook-ping-targets-failure.yml -i inventory/inventory.ini --ask-vault-pass
Vault password:
PLAY [Ping target1] ***********************************************************************************************
TASK [Gathering Facts] ********************************************************************************************
ok: [target1]
TASK [Ping test] **************************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: Exception: boom
fatal: [target1]: FAILED! => {"changed": false, "module_stderr": "Shared connection to 192.168.2.12 closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n File \"/home/osboxes/.ansible/tmp/ansible-tmp-1662800777.2553337-6094-259627128894774/AnsiballZ_ping.py\", line 107, in \r\n _ansiballz_main()\r\n File \"/home/osboxes/.ansible/tmp/ansible-tmp-1662800777.2553337-6094-259627128894774/AnsiballZ_ping.py\", line 99, in _ansiballz_main\r\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n File \"/home/osboxes/.ansible/tmp/ansible-tmp-1662800777.2553337-6094-259627128894774/AnsiballZ_ping.py\", line 47, in invoke_module\r\n runpy.run_module(mod_name='ansible.modules.ping', init_globals=dict(_module_fqn='ansible.modules.ping', _modlib_path=modlib_path),\r\n File \"/usr/lib/python3.10/runpy.py\", line 209, in run_module\r\n return _run_module_code(code, init_globals, run_name, mod_spec)\r\n File \"/usr/lib/python3.10/runpy.py\", line 96, in _run_module_code\r\n _run_code(code, mod_globals, init_globals,\r\n File \"/usr/lib/python3.10/runpy.py\", line 86, in _run_code\r\n exec(code, run_globals)\r\n File \"/tmp/ansible_ansible.builtin.ping_payload_xnphtwh8/ansible_ansible.builtin.ping_payload.zip/ansible/modules/ping.py\", line 89, in \r\n File \"/tmp/ansible_ansible.builtin.ping_payload_xnphtwh8/ansible_ansible.builtin.ping_payload.zip/ansible/modules/ping.py\", line 79, in main\r\nException: boom\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
PLAY RECAP ********************************************************************************************************

target1 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0

4. 安装 Apache 网络服务器

在第二个练习中,您将在目标机器上安装 Apache Webserver 并更改欢迎页面。最终的剧本可以在 git 存储库中找到,格式为 playbook-httpd-target1.yml. 您将在本节中学习如何创建此最终版本。

4.1 安装包

要安装软件包,您可以使用 Apt 模块。它包含许多参数,您只会使用其中的几个:

  1. name:要安装的包的名称;
  2. update_cache: apt-get update在安装之前运行;
  3. state:表示所需的包状态, present在这里就好了。

这个剧本中的其他项目现在应该已经很熟悉了。

- name: Install Apache webserver
hosts: target1
tasks:
- name: Install apache httpd (state=present is optional)
ansible.builtin.apt:
name: apache2
update_cache: yes
state: present

运行剧本。

$ ansible-playbook playbook-httpd-target1.yml -i inventory/inventory.ini --ask-vault-pass
Vault password:
PLAY [Install Apache webserver] *****************************************************************************************
TASK [Gathering Facts] **************************************************************************************************
ok: [target1]
TASK [Install apache httpd (state=present is optional)] ****************************************************************

这本剧本并没有结束。它挂起,您可以使用 CTRL+C 停止它。

那么这里发生了什么?您可能知道,为了安装软件包,您需要 sudo 权限。不管怎样,Ansible 需要知道是否需要提升权限,并且您需要向 Ansible 提供 sudo 密码。可以在 Ansible 文档中阅读详细说明。简短的版本是,您需要添加 become带有 value 的参数 yes。但这还不是全部,您还需要 --ask-become-pass在运行 Ansible playbook 时添加命令行参数。这样,Ansible 将要求您提供 sudo 密码。

添加了参数的剧本become如下所示:

- name: Install Apache webserver
hosts: target1
become: yes
tasks:
- name: Install apache httpd (state=present is optional)
ansible.builtin.apt:
name: apache2
update_cache: yes
state: present

运行此剧本成功。如您所见,需要输入 become 密码和 vault 密码。

$ ansible-playbook playbook-httpd-target1.yml -i inventory/inventory.ini --ask-vault-pass --ask-become-pass
BECOME password:
Vault password:
PLAY [Install Apache webserver] ****************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [target1]
TASK [Install apache httpd (state=present is optional)] ***************************************************************
changed: [target1]
PLAY RECAP *************************************************************************************************************

target1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

在输出日志记录中,您还注意到第 11 行的 Target1 已更改。记住这一点,这在稍后再次运行剧本时很重要。

通过浏览器(或通过 curl 命令)导航到 Target1 机器的 IP 地址:http: //192.16.2.12。如果您有与本博客中使用的测试环境类似的测试环境,则可以从您的主机执行此操作。如您所见,显示了 Apache Web 服务器的默认欢迎页面。

4.2 更改欢迎页面

在剧本中,您还可以更改欢迎页面的内容。您可以为此使用复制模块。将以下任务添加到剧本中。

- name: Create index page
ansible.builtin.copy:
content: 'Hello world from target 1'
dest: /var/www/html/index.html

执行剧本。

$ ansible-playbook playbook-httpd-target1.yml -i inventory/inventory.ini --ask-vault-pass --ask-become-pass
BECOME password:
Vault password:
PLAY [Install Apache webserver] ****************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************
ok: [target1]
TASK [Install apache httpd (state=present is optional)] ***************************************************************************************************
ok: [target1]
TASK [Create index page] ***********************************************************************************************************************************
changed: [target1]
PLAY RECAP *************************************************************************************************************************************************
target1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

首先,仔细查看日志记录。任务Install apache httpd现在只是返回ok而不是changed。这意味着 Ansible 没有再次安装 Apache Webserver。Ansible 任务是幂等的。这意味着您可以一遍又一遍地执行它们,结果将是相同的。另请注意,欢迎页面现已更改。通过浏览器或通过 curl 验证这一点。

$ curl http://192.168.2.12
Hello world from target 1

4.3 安装Target2

作为最后一个练习,您可以添加第二个步骤以在 Target2 上安装 Apache Webserver 并相应地更改欢迎页面,以便它从 Target2 欢迎您。该剧本可以在 git 存储库中找到,格式为playbook-httpd-target1-and-target2.yml.

- name: Install Apache webserver for target 1
hosts: target1
become: yes
tasks:
- name: Install apache httpd (state=present is optional)
ansible.builtin.apt:
name: apache2
update_cache: yes
state: present
- name: Create index page for target 1
ansible.builtin.copy:
content: 'Hello world from target 1'
dest: /var/www/html/index.html
- name: Install Apache webserver for target2
hosts: target2
become: yes
tasks:
- name: Install apache httpd (state=present is optional)
ansible.builtin.apt:
name: apache2
update_cache: yes
state: present
- name: Create index page for target 2
ansible.builtin.copy:
content: 'Hello world from target 2'
dest: /var/www/html/index.html

执行剧本,您现在有足够的信心自己探索日志记录。

$ ansible-playbook playbook-httpd-target1-and-target2.yml -i inventory/inventory.ini --ask-vault-pass --ask-become-pass
BECOME password:
Vault password:
PLAY [Install Apache webserver for target 1] *****************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************************************
ok: [target1]
TASK [Install apache httpd (state=present is optional)] *****************************************************************************************************************
ok: [target1]
TASK [Create index page for target 1] ************************************************************************************************************************************
ok: [target1]
PLAY [Install Apache webserver for target2] ******************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************************************
ok: [target2]
TASK [Install apache httpd (state=present is optional)] *****************************************************************************************************************
changed: [target2]
TASK [Create index page for target 2] ************************************************************************************************************************************
changed: [target2]
PLAY RECAP ***************************************************************************************************************************************************************
target1 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
target2 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0

验证欢迎页面是否已正确更改。

$ curl http://192.168.2.12
Hello world from target 1
$ curl http://192.168.2.13
Hello world from target 2

果然不出所料!

5.结论

在本文中,您继续学习 Ansible。您学习了有关 Ansible playbook 的基础知识,并编写并执行了将 Apache Webserver 安装到两台目标机器上的 playbook。您现在可以编写自己的剧本并继续学习。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
陕西地震了,愿他们平安

陕西地震了,愿他们平安

Auroua
2024-06-18 22:14:30
周海媚从小就有阴阳眼,离世前曾有诡异预兆?靠撞鬼走红是真的吗

周海媚从小就有阴阳眼,离世前曾有诡异预兆?靠撞鬼走红是真的吗

洞鉴历史
2024-06-11 14:23:53
乡党委书记在学校调戏女老师,没想到女老师的老公竟是县委书记

乡党委书记在学校调戏女老师,没想到女老师的老公竟是县委书记

南山青松
2024-06-18 17:57:38
罗志祥带妈妈参加家庭聚会,对着妈妈竖中指,网友:匪夷所思

罗志祥带妈妈参加家庭聚会,对着妈妈竖中指,网友:匪夷所思

风云人物看历史
2024-06-19 00:06:50
最强杀猪盘,睡遍欧美,财色全骗,靠的就是一张脸

最强杀猪盘,睡遍欧美,财色全骗,靠的就是一张脸

奇闻故事会
2023-08-18 14:20:12
西安楼市全军覆没,西安新房供应量太大,西安房价跌破15000元

西安楼市全军覆没,西安新房供应量太大,西安房价跌破15000元

有事问彭叔
2024-06-17 21:27:29
71年毛主席来到杭州休息,看见陈励耘时,厌烦道:你怎么又来了

71年毛主席来到杭州休息,看见陈励耘时,厌烦道:你怎么又来了

让时间说真话
2024-06-05 22:10:13
女生会接受一个性能力不好的男朋友吗?评论区的回答惊呆上万读者

女生会接受一个性能力不好的男朋友吗?评论区的回答惊呆上万读者

社会潜伏者
2024-05-13 01:15:15
33岁的坎特还能闪耀欧洲杯!9年前鲁能吧曾推荐过在法甲踢球的他

33岁的坎特还能闪耀欧洲杯!9年前鲁能吧曾推荐过在法甲踢球的他

直播吧
2024-06-18 07:58:16
无偿献血这条路,已经走不通了

无偿献血这条路,已经走不通了

七叔东山再起
2024-06-17 20:29:20
国内油价调整消息:油价大涨!2024年6月19日92号、95号汽油价格

国内油价调整消息:油价大涨!2024年6月19日92号、95号汽油价格

有料财经
2024-06-19 00:05:02
刘亦菲穿蓝色泳衣好辣啊!她不是壮,是正常的美,比钟楚曦更漂亮

刘亦菲穿蓝色泳衣好辣啊!她不是壮,是正常的美,比钟楚曦更漂亮

白宸侃片
2024-06-15 23:27:11
养老金上调3%:给你公式算算你能涨多少,呼声:给企业老人多涨点

养老金上调3%:给你公式算算你能涨多少,呼声:给企业老人多涨点

大风文字
2024-06-17 18:46:14
22岁卡车司机,带45岁女人跑长途,两人最喜欢经过百里无人区

22岁卡车司机,带45岁女人跑长途,两人最喜欢经过百里无人区

牛城王小帅
2024-06-14 11:45:37
大帝把国防部最高层全换成搞经济的,你觉得他还要打吗?

大帝把国防部最高层全换成搞经济的,你觉得他还要打吗?

邵旭峰域
2024-06-18 14:20:02
魔术师:凯尔特人冠军数比我们湖人多了 我很不爽

魔术师:凯尔特人冠军数比我们湖人多了 我很不爽

直播吧
2024-06-18 11:19:14
燃烧的以色列,真正的考验才刚刚开始!

燃烧的以色列,真正的考验才刚刚开始!

谈芯说科技
2024-06-18 19:03:04
严查电商税收!根据平台抽成倒推企业营业额,有公司被查出4.45亿差额!

严查电商税收!根据平台抽成倒推企业营业额,有公司被查出4.45亿差额!

小萝卜丝
2024-06-18 10:28:56
穆帅点名!土媒:费内巴切800万欧报价霍伊别尔 热刺要1400万欧

穆帅点名!土媒:费内巴切800万欧报价霍伊别尔 热刺要1400万欧

直播吧
2024-06-18 13:06:10
绿军夺冠后!哈登成历史第一,乔治遭2.1亿强挖,伦纳德害苦快船

绿军夺冠后!哈登成历史第一,乔治遭2.1亿强挖,伦纳德害苦快船

巴叔GO聊体育
2024-06-18 16:20:13
2024-06-19 00:46:44
墨谈科技
墨谈科技
业务数码玩家.无聊的博主
3000文章数 567关注度
往期回顾 全部

科技要闻

第一批小米车主,已经开始卖车了

头条要闻

土耳其率先破门 1-0领先格鲁吉亚 穆尔杜世界波

头条要闻

土耳其率先破门 1-0领先格鲁吉亚 穆尔杜世界波

体育要闻

对于凯尔特人来说 谁是MVP根本不重要

娱乐要闻

被曝新恋情,张碧晨王琳凯发声辟谣

财经要闻

官方:税务部门没有倒查30年的安排

汽车要闻

全球最低价 现代IONIQ 5N预售价39.88万

态度原创

艺术
游戏
时尚
数码
健康

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

《艾尔登法环》DLC GS10分:新物品为游戏注入活力

陆仙人:一步一步的路

数码要闻

超薄的兆芯KX-6000G ITX迷你小板发布:四核3.3GHz、高性能GPU三屏输出

晚餐不吃or吃七分饱,哪种更减肥?

无障碍浏览 进入关怀版