当前位置:Java -> 使用Ansible自动化部署Quarkus应用
在本文中,我们将解释如何使用Ansible构建和部署Quarkus应用程序。Quarkus是一个令人兴奋的轻量级Java开发框架,专为云和Kubernetes部署设计,而Red Hat Ansible Automation Platform则是最流行的自动化工具之一,也是Red Hat的明星产品之一。
在讨论如何使用Ansible自动化部署Quarkus应用程序之前,我们需要确保满足先决条件。首先,您需要在开发环境中安装Ansible。在Fedora或Red Hat Enterprise Linux机器上,您可以通过使用dnf软件包管理器轻松实现此目标:
$ dnf install ansible-core
唯一的其他要求是安装专门用于Quarkus的Ansible集合:
$ ansible-galaxy collection install middleware_automation.quarkus
这是准备好Ansible控制机(执行Ansible的机器的名称)所需的所有内容。
通常,控制节点用于设置其他以目标命名的系统。出于本教程的目的,也为了简单起见,我们将在同一台机器上使用控制节点和我们(唯一的)目标。这将使得在单个开发机器上更容易重现本文的内容。
请注意,您无需设置任何类型的Java开发环境,因为Ansible集合会处理这一切。
专门用于Quarkus的Ansible集合是一个社区项目,不受Red Hat支持。但是,Quarkus和Ansible都是Red Hat产品,因此得到全面支持。在撰写本文时,Quarkus集合可能会在将来的某个时候得到支持,但目前没有得到支持。
在执行Ansible之前,我们需要向工具提供一份目标清单。有许多方法可以实现这一点,但对于本教程这样的教程,最简单的解决方案是编写我们自己的清单文件。
如上所述,我们将在同一台主机上使用控制器和目标,因此清单文件只有一个主机。同样,为了简单起见,这台机器将是localhost
:
$ cat inventory
[all]
localhost ansible_connection=local
有关Ansible清单的更多信息,请参考Ansible文档。
对于本演示,我们将使用Quarkus快速启动项目中提供的示例应用之一。我们将使用Ansible构建和部署快速入门应用。
我们需要向Ansible提供的仅是应用名称、存储库URL以及目标机器上部署应用的目标文件夹。由于Quarkus快速启动的目录结构包含多个项目,我们还需要指定包含源代码的目录:
$ ansible-playbook -i inventory middleware_automation.quarkus.playbook \
-e app_name='optaplanner-quickstart' \
-e quarkus_app_source_folder='optaplanner-quickstart' \
-e quarkus_path_to_folder_to_deploy=/opt/optplanner \
-e quarkus_app_repo_url='https://github.com/quarkusio/quarkus-quickstarts.git'
以下是此命令的输出:
PLAY [Build and deploy a Quarkus app using Ansible] **************************** TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Build the Quarkus from https://github.com/quarkusio/quarkus-quickstarts.git.] *** TASK [middleware_automation.quarkus.quarkus : Ensure required parameters are provided.] *** ok: [localhost] TASK [middleware_automation.quarkus.quarkus : Define path to mvnw script.] ***** ok: [localhost] TASK [middleware_automation.quarkus.quarkus : Ensure that builder host localhost has appropriate JDK installed: java-17-openjdk] *** changed: [localhost] TASK [middleware_automation.quarkus.quarkus : Delete previous workdir (if requested).] *** ok: [localhost] TASK [middleware_automation.quarkus.quarkus : Ensure app workdir exists: /tmp/workdir] *** changed: [localhost] TASK [middleware_automation.quarkus.quarkus : Checkout the application source code.] *** changed: [localhost] TASK [middleware_automation.quarkus.quarkus : Build the App using Maven] ******* ok: [localhost] TASK [middleware_automation.quarkus.quarkus : Display build application log] *** skipping: [localhost] TASK [Deploy Quarkus app on target.] ******************************************* TASK [middleware_automation.quarkus.quarkus : Ensure required parameters are provided.] *** ok: [localhost] TASK [middleware_automation.quarkus.quarkus : Ensure requirements on target system are fullfilled.] *** included: /root/.ansible/collections/ansible_collections/middleware_automation/quarkus/roles/quarkus/tasks/deploy/prereqs.yml for localhost TASK [middleware_automation.quarkus.quarkus : Ensure required OpenJDK is installed on target.] *** skipping: [localhost] TASK [middleware_automation.quarkus.quarkus : Ensure Quarkus system group exists on target system] *** changed: [localhost] TASK [middleware_automation.quarkus.quarkus : Ensure Quarkus user exists on target system.] *** changed: [localhost] TASK [middleware_automation.quarkus.quarkus : Ensure deployement directory exits: /opt/optplanner.] *** changed: [localhost] TASK [middleware_automation.quarkus.quarkus : Set Quarkus app source dir (if not defined).] *** ok: [localhost] TASK [middleware_automation.quarkus.quarkus : Deploy application as a systemd service on target system.] *** included: /root/.ansible/collections/ansible_collections/middleware_automation/quarkus/roles/quarkus/tasks/deploy/service.yml for localhost TASK [middleware_automation.quarkus.quarkus : Deploy application from to target system] *** ok: [localhost] TASK [middleware_automation.quarkus.quarkus : Deploy Systemd configuration for Quarkus app] *** changed: [localhost] TASK [middleware_automation.quarkus.quarkus : Perform daemon-reload to ensure the changes are picked up] *** ok: [localhost] TASK [middleware_automation.quarkus.quarkus : Ensure Quarkus app service is running.] *** changed: [localhost] TASK [middleware_automation.quarkus.quarkus : Ensure firewalld configuration is appropriate (if requested).] *** skipping: [localhost] PLAY RECAP ********************************************************************* localhost : ok=19 changed=8 unreachable=0 failed=0 skipped=3 rescued=0 ignored=0
您可以看到,Quarkus的Ansible集合为我们做了大部分繁重的工作:它的内容负责从GitHub检出源代码并构建应用。它还确保了用于此步骤的系统上已安装了所需的OpenJDK。
一旦应用程序成功构建,该集合就负责部署。同样,它会检查目标系统上是否已安装了适当的OpenJDK。然后,它会验证目标上是否存在所需的用户和组,如果没有,则创建它们。这主要是建议能够使用普通用户而不是root帐户运行Quarkus应用。
满足这些要求后,生产的jar将被复制到目标机器上,同时还会提供应用程序集成到systemd
作为一项服务所需的配置。对systemd
配置的任何更改都需要重新加载守护进程,该集合确保在需要时将进行重新加载。配置就绪后,集合将启动服务本身。
让我们花一点时间来验证一切进行顺利,服务确实正在运行:
# systemctl status optaplanner-quickstart.service
● optaplanner-quickstart.service - A Quarkus service named optaplanner-quickstart
Loaded: loaded (/usr/lib/systemd/system/optaplanner-quickstart.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2023-04-26 09:40:13 UTC; 3h 19min ago
Main PID: 934 (java)
CGroup: /system.slice/optaplanner-quickstart.service
└─934 /usr/bin/java -jar /opt/optplanner/quarkus-run.jar
Apr 26 09:40:13 be44b3acb1f3 systemd[1]: Started A Quarkus service named optaplanner-quickstart.
Apr 26 09:40:14 be44b3acb1f3 java[934]: __ ____ __ _____ ___ __ ____ ______
Apr 26 09:40:14 be44b3acb1f3 java[934]: --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
Apr 26 09:40:14 be44b3acb1f3 java[934]: -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
Apr 26 09:40:14 be44b3acb1f3 java[934]: --\___\_\____/_/ |_/_/|_/_/|_|\____/___/
Apr 26 09:40:14 be44b3acb1f3 java[934]: 2023-04-26 09:40:14,843 INFO [io.quarkus] (main) optaplanner-quickstart 1.0.0-SNAPSHOT on JVM (powered by Quarkus 2.16.6.Final) started in 1.468s. Listening on: http://0.0.0.0:8080
Apr 26 09:40:14 be44b3acb1f3 java[934]: 2023-04-26 09:40:14,848 INFO [io.quarkus] (main) Profile prod activated.
Apr 26 09:40:14 be44b3acb1f3 java[934]: 2023-04-26 09:40:14,848 INFO [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, hibernate-orm-panache, hibernate-orm-rest-data-panache, jdbc-h2, narayana-jta, optaplanner, optaplanner-jackson, resteasy-reactive, resteasy-reactive-jackson, resteasy-reactive-links, smallrye-context-propagation, vertx, webjars-locator]
服务运行当然是不错的,但仅凭这一点并不能保证应用程序可用。为了进行双重检查,我们可以通过连接到应用程序来简单确认应用程序的可达性:
# curl -I http://localhost:8080/
HTTP/1.1 200 OK
accept-ranges: bytes
content-length: 8533
cache-control: public, immutable, max-age=86400
last-modified: Wed, 26 Apr 2023 10:00:18 GMT
date: Wed, 26 Apr 2023 13:00:19 GMT
Ansible集合为Quarkus提供的默认playbook非常方便,可以让您通过一个命令快速实现自动化。但是,很可能您需要编写自己的playbook,以便在您的Quarkus应用程序的部署周围添加所需的自动化。
以下是提供给集合的默认playbook的内容,您可以简单地将其作为自己的基础使用:
---
- name: "Build and deploy a Quarkus app using Ansible"
hosts: all
gather_facts: false
vars:
quarkus_app_repo_url: 'https://github.com/quarkusio/quarkus-quickstarts.git'
app_name: optaplanner-quickstart'
quarkus_app_source_folder: 'optaplanner-quickstart'
quarkus_path_to_folder_to_deploy: '/opt/optaplanner'
pre_tasks:
- name: "Build the Quarkus from {{ quarkus_app_repo_url }}."
ansible.builtin.include_role:
name: quarkus
tasks_from: build.yml
tasks:
- name: "Deploy Quarkus app on target."
ansible.builtin.include_role:
name: quarkus
tasks_from: deploy.yml
ansible-playbook命令,但需要提供playbook的路径:
$ ansible-playbook -i inventory playbook.yml
由于Quarkus的Ansible集合,自动化部署Quarkus应用所需的工作是很少的。集合为大部分繁重的工作提供了帮助,并允许用户专注于其应用程序和业务需求特定的自动化需求。
推荐阅读: 18.HashSet与HashMap的区别
本文链接: 使用Ansible自动化部署Quarkus应用