当前位置:Java -> 使用Ansible自动化部署Quarkus应用

使用Ansible自动化部署Quarkus应用

在本文中,我们将解释如何使用Ansible构建和部署Quarkus应用程序。Quarkus是一个令人兴奋的轻量级Java开发框架,专为云和Kubernetes部署设计,而Red Hat Ansible Automation Platform则是最流行的自动化工具之一,也是Red Hat的明星产品之一。

设置您的Ansible环境

在讨论如何使用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文档。

使用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


编写Playbook

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应用