从源码安装
从源码构建 AnsibleForms,并用 Node.js 运行
代码的组织方式
仓库包含两个 Node.js 应用,构建时会把它们合并为一个:
- client:Web 界面,用 Vue 3 编写,并用 Vite 构建为静态文件
- server:API,用 Express 编写。它把作业交给运行器、连接数据库,并提供构建好的 client。 以
AF_ROLE=rte启动时,同一个 server 就是运行 playbook 的 RTE(运行环境)
只有 client 需要构建;其输出放入 server 的 views 文件夹,与 Docker 镜像 中的做法相同。
前提条件
从源码构建并运行需要扎实的 Linux 技能和一定的 Node.js 知识。每个组件都需要您自己安装。如果想 不用容器、也不用自己构建就运行 AnsibleForms,安装程序的 原生安装 会替您完成这一切:
- Node.js 26(
.nvmrc中的版本;至少 24),带 npm - Git,用于获取代码和同步仓库
- OpenSSH 客户端,用于通过 SSH 使用 git;以及 sshpass,用于以 SSH 密码连接的 playbook
- MariaDB 客户端(
mariadb、mariadb-dump),用于备份和恢复,搭配 MySQL 服务器时也需要 - MySQL 8+ 或 MariaDB,服务器可以访问到
- Ansible,供运行 playbook 的 RTE 进程使用(
ansible-playbook需在其 path 中)。应用进程本身不需要 Ansible 和 Python;如果只使用模板表单(AWX、AAP、Ascender 和其他运行器),则完全不需要 RTE
按您的发行版安装它们:
Node.js 26 来自 NodeSource 仓库,其他工具来自 Ubuntu 本身:
curl -fsSL https://deb.nodesource.com/setup_26.x | sudo -E bash -
sudo apt-get install -y nodejs git openssh-client sshpass mariadb-client python3 python3-pip ansible
Node.js 26 来自 NodeSource 仓库,其他工具来自 Debian 本身:
curl -fsSL https://deb.nodesource.com/setup_26.x | sudo -E bash -
sudo apt-get install -y nodejs git openssh-client sshpass mariadb-client python3 python3-pip ansible
Node.js 来自 NodeSource,sshpass 来自 EPEL(在 RHEL 本身上,请按 Red Hat 文档的说明启用 EPEL):
curl -fsSL https://rpm.nodesource.com/setup_26.x | sudo bash -
sudo dnf install -y epel-release
sudo dnf install -y nodejs git openssh-clients sshpass mariadb python3 python3-pip ansible-core
检查 node --version(26)和 ansible-playbook --version;数据库及其用户的设置,参见 安装 MySQL。
获取代码
把仓库克隆到您选择的文件夹中,该文件夹归运行应用的用户所有。示例中使用 /srv/apps/ansibleforms:
sudo mkdir -p /srv/apps
sudo chown $USER /srv/apps
cd /srv/apps
git clone https://github.com/ansibleforms/ansibleforms.git
cd ansibleforms
构建
在仓库文件夹中分三步构建。首先构建 client:
cd client
npm ci
npm run build
然后安装 server 的依赖:
cd ../server
npm ci --omit=dev
最后把构建好的 client 复制到 server 的 views 文件夹中:
rm -rf views
mkdir views
cp -r ../client/dist/. views/
配置
server 从环境变量读取设置;在生产环境中,还会读取 server/persistent/.env,即 设置页面写入的文件。
从仓库根目录的示例文件开始,至少设置 MySQL 连接(DB_HOST、DB_PORT、DB_USER、 DB_PASSWORD):
cd /srv/apps/ansibleforms/server
mkdir -p persistent
cp ../.env.example persistent/.env
所有变量都在 环境变量 中说明。其余所有内容默认存储在 server/persistent 中: config.yaml、forms 文件夹和自签名证书都会在首次启动时在那里创建,日志也在那里。 把您的 playbook 放到 server/persistent/playbooks,或者在 RTE 的环境中把 ANSIBLE_PATH 指向其他位置,因为由 RTE 读取它。
运行
以生产模式运行 AnsibleForms,或以开发模式运行以便修改代码本身:
在 server 文件夹中以生产模式启动 server:
cd /srv/apps/ansibleforms/server
npm run start
从命令行启动的应用会在您注销时停止。PM2 让它在 后台持续运行,崩溃后重启它,并在开机时再次启动它:
sudo npm install -g pm2
cd /srv/apps/ansibleforms/server
NODE_ENV=production pm2 start index.js --name ansibleforms
pm2 save
pm2 startup # prints the command that starts PM2 at boot
playbook 在 RTE 上运行:用 AF_ROLE=rte 在单独的端口上再启动一次同一个 server。应用会连接它并保持 一条 WebSocket 连接(RTE_MODE=inbound,参见 模式),它从相同的文件夹运行 playbook (RTE_FILES=local)。它也读取 persistent/.env,但不使用其中的任何数据库设置。把应用与 RTE 共享的令牌 (至少 16 个字符)以及声明 RTE 的配置种子添加到 persistent/.env:
RTE_TOKEN=<at least 16 characters>
CONFIG_SEED_PATH=/srv/apps/ansibleforms/server/persistent/seed.yaml
配置种子 声明一个包含 RTE 地址和令牌的 RTE 凭据,以及使用该凭据登录的 默认运行器 rte:
version: 1
credentials:
items:
- name: rte
credential_type: rte
url: http://127.0.0.1:8010
password: ${RTE_TOKEN}
runners:
items:
- name: rte
type: rte
rte_mode: inbound
credential: rte
is_default: true
如果不使用种子,请在 连接 > 凭据(一个包含该地址和令牌的 RTE 凭据)和 连接 > 运行器(类型 RTE,模式 为 入站)下添加它们。然后启动 RTE,只监听 127.0.0.1:
cd /srv/apps/ansibleforms/server
AF_ROLE=rte RTE_MODE=inbound RTE_FILES=local PORT=8010 HTTPS=0 LISTEN_HOST=127.0.0.1 \
NODE_ENV=production pm2 start index.js --name ansibleforms-rte
pm2 save
RTE 的设置在 运行 RTE 页面中说明。检查 PM2 是否列出了这两个进程:
pm2 status
二者都是 online:
+----+------------------+------+---------+------+--------+----------+--------+-----+---------+------+----------+
| id | name | mode | version | pid | uptime | restarts | status | cpu | mem | user | watching |
+----+------------------+------+---------+------+--------+----------+--------+-----+---------+------+----------+
| 0 | ansibleforms | fork | 7.0.0 | 3104 | 8s | 0 | online | 0% | 120.1mb | root | disabled |
| 1 | ansibleforms-rte | fork | 7.0.0 | 3187 | 5s | 0 | online | 0% | 80.4mb | root | disabled |
+----+------------------+------+---------+------+--------+----------+--------+-----+---------+------+----------+
要修改代码本身,请在仓库根目录以实时重载方式启动所有组件:server 在端口 3001,RTE 在端口 8010, client 在 https://localhost:8443。在此模式下,server 和 RTE 改为读取 server/.env.development:
cd /srv/apps/ansibleforms
npm install
(cd server && npm install && cp ../.env.example .env.development)
(cd client && npm install)
npm run dev
RTE(npm run dev:rte)需要 path 中有 ansible-playbook,它会以数据库模式把自己添加为运行器,该模式已弃用,仅用于 开发;npm run dev:local 启动 client 和 server,但不启动 RTE。贡献指南 说明了需要运行的测试和检查。
首次运行
在浏览器中打开 server(使用示例 .env 时为 https://your_ip:8443)。如果数据库为空,会在 首次启动时创建 schema。
默认的管理员凭据为:
- 用户名:
admin - 密码:
AnsibleForms!123