mirror of
https://github.com/nioc/xmpp-bot.git
synced 2024-12-04 14:23:35 +01:00
Add Ansible role
This commit is contained in:
parent
a9c92451cb
commit
e7f8967176
7 changed files with 337 additions and 0 deletions
|
@ -16,6 +16,8 @@ User ⇄ XMPP client ⇄ XMPP Server ⇄ **XMPP Bot** ⇄ REST A
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
An [Ansible role](/docs/ansible/xmpp-bot/README.md) is provided, but you can also use following commands:
|
||||||
|
|
||||||
- Install [Node.js](https://nodejs.org/):
|
- Install [Node.js](https://nodejs.org/):
|
||||||
```shell
|
```shell
|
||||||
curl -sL https://deb.nodesource.com/setup_10.x | bash -
|
curl -sL https://deb.nodesource.com/setup_10.x | bash -
|
||||||
|
@ -127,6 +129,11 @@ User ⇄ XMPP client ⇄ XMPP Server ⇄ **XMPP Bot** ⇄ REST A
|
||||||
- `action` among enumeration:
|
- `action` among enumeration:
|
||||||
- `outgoing_webhook` will execute a request to corresponding webhook with `args` as webhook code
|
- `outgoing_webhook` will execute a request to corresponding webhook with `args` as webhook code
|
||||||
|
|
||||||
|
## FAQ
|
||||||
|
|
||||||
|
- *XMPP server is using a self signed certificate, how can i run service?*
|
||||||
|
You can allow insecure TLS connections and HTTPS requests by adding `Environment=NODE_TLS_REJECT_UNAUTHORIZED=0` in /usr/lib/systemd/system/xmpp-bot.service.
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
- **[Nioc](https://github.com/nioc/)** - _Initial work_
|
- **[Nioc](https://github.com/nioc/)** - _Initial work_
|
||||||
|
|
57
docs/ansible/xmpp-bot/README.md
Normal file
57
docs/ansible/xmpp-bot/README.md
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
Ansible Role: XMPP Bot
|
||||||
|
======================
|
||||||
|
|
||||||
|
Install XMPP Bot:
|
||||||
|
|
||||||
|
- install [Node.js](https://nodejs.org/),
|
||||||
|
- install npm,
|
||||||
|
- download archive,
|
||||||
|
- install dependencies,
|
||||||
|
- create service user,
|
||||||
|
- set [configuration](https://github.com/nioc/xmpp-bot#configuration),
|
||||||
|
- add as a systemd service.
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
|
||||||
|
- Ansible >= 2.9,
|
||||||
|
- a working XMPP server.
|
||||||
|
|
||||||
|
Role Variables
|
||||||
|
--------------
|
||||||
|
|
||||||
|
These variables are installation related and should be checked/updated before use:
|
||||||
|
|
||||||
|
- `xmppbot_install_nodejs`: Does NodeJS should be installed, set `false` if already present, default: `true`,
|
||||||
|
- `nodejs_repo`: NodeJS version to install, default: `node_12.x`.
|
||||||
|
- `domain`: your domain name (not a role variable but **must be set** in your playbook/host), no default,
|
||||||
|
|
||||||
|
For variables in `webhooks config`, `XMPP server config`, `outgoing webhooks config` sections, please see [configuration](https://github.com/nioc/xmpp-bot#configuration).
|
||||||
|
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
------------
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
Example Playbook
|
||||||
|
----------------
|
||||||
|
|
||||||
|
- hosts: servers
|
||||||
|
vars:
|
||||||
|
domain: mydomain.ltd
|
||||||
|
roles:
|
||||||
|
- name: xmpp-bot
|
||||||
|
xmppbot_incoming_webhooks:
|
||||||
|
- path: /webhooks/alerting
|
||||||
|
action: send_xmpp_message
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
AGPL-3.0-or-later
|
||||||
|
|
||||||
|
Author Information
|
||||||
|
------------------
|
||||||
|
|
||||||
|
This role was created in 2020 by [Nioc](https://github.com/nioc).
|
57
docs/ansible/xmpp-bot/defaults/main.yml
Normal file
57
docs/ansible/xmpp-bot/defaults/main.yml
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
---
|
||||||
|
# installation:
|
||||||
|
xmppbot_install_nodejs: true
|
||||||
|
nodejs_repo: node_12.x
|
||||||
|
xmppbot_version: HEAD
|
||||||
|
xmppbot_git_url: https://github.com/nioc/xmpp-bot.git
|
||||||
|
# global config:
|
||||||
|
xmppbot_dir: /usr/local/bin/xmpp-bot
|
||||||
|
xmppbot_user: xmpp-bot
|
||||||
|
xmppbot_log_dir: /var/log/xmpp-bot
|
||||||
|
# webhooks config:
|
||||||
|
xmppbot_webhook_path: '/webhooks'
|
||||||
|
xmppbot_webhook_port: '8000'
|
||||||
|
xmppbot_webhook_port_ssl: '8001'
|
||||||
|
xmppbot_webhook_certpath: /etc/ssl/certs/ssl-cert-snakeoil.pem
|
||||||
|
xmppbot_webhook_keypath: /etc/ssl/private/ssl-cert-snakeoil.key
|
||||||
|
xmppbot_webhook_users:
|
||||||
|
login1: 1pass
|
||||||
|
login2: 2pass
|
||||||
|
xmppbot_incoming_webhooks:
|
||||||
|
- path: /webhooks/w1
|
||||||
|
action: send_xmpp_message
|
||||||
|
- path: /webhooks/grafana
|
||||||
|
action: send_xmpp_template
|
||||||
|
args:
|
||||||
|
destination: "grafana@conference.domain-xmpp.ltd"
|
||||||
|
type: "groupchat"
|
||||||
|
template: "${title}\r\n${message}\r\n${evalMatches[].metric}: ${evalMatches[].value}\r\n${imageUrl}"
|
||||||
|
# XMPP server config:
|
||||||
|
xmppbot_xmpp_server:
|
||||||
|
service: xmpps://domain-xmpp.ltd:5223
|
||||||
|
domain: domain-xmpp.ltd
|
||||||
|
username: bot@domain-xmpp.ltd
|
||||||
|
password: botPass
|
||||||
|
rooms:
|
||||||
|
- id: roomname@conference.domain-xmpp.ltd
|
||||||
|
password: 'null'
|
||||||
|
xmppbot_xmpp_hooks:
|
||||||
|
- room: bot@domain-xmpp.ltd
|
||||||
|
action: outgoing_webhook
|
||||||
|
args: '["w1"]'
|
||||||
|
- room: roomname@conference.domain-xmpp.ltd
|
||||||
|
action: outgoing_webhook
|
||||||
|
args: '["w1"]'
|
||||||
|
xmppbot_xmpp_error_reply: Oops, something went wrong :(
|
||||||
|
xmppbot_xmpp_resource: botservice
|
||||||
|
# outgoing webhooks config:
|
||||||
|
xmppbot_outgoing_webhooks:
|
||||||
|
- code: 'w1'
|
||||||
|
url: 'https://domain.ltd:port/path/resource?parameter1=value1'
|
||||||
|
timeout: '500'
|
||||||
|
strictSSL: 'true'
|
||||||
|
contentType: 'application/json'
|
||||||
|
authMethod: 'basic'
|
||||||
|
user: 'user3'
|
||||||
|
password: '3pass'
|
||||||
|
bearer: 'null'
|
9
docs/ansible/xmpp-bot/meta/main.yml
Normal file
9
docs/ansible/xmpp-bot/meta/main.yml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
galaxy_info:
|
||||||
|
author: Nioc
|
||||||
|
description: Install XMPP bot
|
||||||
|
issue_tracker_url: https://github.com/nioc/xmpp-bot/issues
|
||||||
|
license: license (AGPL-3.0-or-later)
|
||||||
|
min_ansible_version: 2.9
|
||||||
|
galaxy_tags: []
|
||||||
|
|
||||||
|
dependencies: []
|
85
docs/ansible/xmpp-bot/tasks/main.yml
Normal file
85
docs/ansible/xmpp-bot/tasks/main.yml
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
---
|
||||||
|
- name: Install and configure NodeJS LTS
|
||||||
|
include_tasks: nodejs.yml
|
||||||
|
when: xmppbot_install_nodejs
|
||||||
|
|
||||||
|
- name: Install/update npm package globally
|
||||||
|
become: yes
|
||||||
|
npm:
|
||||||
|
name: npm
|
||||||
|
state: latest
|
||||||
|
global: yes
|
||||||
|
|
||||||
|
- name: Get XMPP bot code from Git repo
|
||||||
|
become: yes
|
||||||
|
git:
|
||||||
|
repo: '{{xmppbot_git_url}}'
|
||||||
|
version: '{{xmppbot_version}}'
|
||||||
|
dest: '{{xmppbot_dir}}/'
|
||||||
|
force: yes
|
||||||
|
|
||||||
|
- name: Install XMPP bot based on package.json
|
||||||
|
become: yes
|
||||||
|
npm:
|
||||||
|
path: '{{xmppbot_dir}}'
|
||||||
|
production: yes
|
||||||
|
|
||||||
|
- name: Add XMPP bot user "{{xmppbot_user}}"
|
||||||
|
become: yes
|
||||||
|
user:
|
||||||
|
name: '{{xmppbot_user}}'
|
||||||
|
system: yes
|
||||||
|
shell: /bin/false
|
||||||
|
|
||||||
|
- name: Set configuration file
|
||||||
|
become: yes
|
||||||
|
template:
|
||||||
|
src: config.json.j2
|
||||||
|
dest: '{{xmppbot_dir}}/lib/config/config.json'
|
||||||
|
|
||||||
|
- name: Set permissions
|
||||||
|
become: yes
|
||||||
|
file:
|
||||||
|
path: '{{xmppbot_dir}}/'
|
||||||
|
state: directory
|
||||||
|
owner: '{{xmppbot_user}}'
|
||||||
|
group: '{{xmppbot_user}}'
|
||||||
|
recurse: yes
|
||||||
|
|
||||||
|
- name: Creates XMPP bot logs folder
|
||||||
|
become: yes
|
||||||
|
file:
|
||||||
|
path: '{{xmppbot_log_dir}}'
|
||||||
|
state: directory
|
||||||
|
owner: '{{xmppbot_user}}'
|
||||||
|
group: '{{xmppbot_user}}'
|
||||||
|
|
||||||
|
- name: Create XMPP bot service
|
||||||
|
become: yes
|
||||||
|
copy:
|
||||||
|
src: '{{xmppbot_dir}}/docs/xmpp-bot.service'
|
||||||
|
dest: /usr/lib/systemd/system/xmpp-bot.service
|
||||||
|
remote_src: yes
|
||||||
|
|
||||||
|
- name: Tune service (dir and running user)
|
||||||
|
become: yes
|
||||||
|
lineinfile:
|
||||||
|
path: /usr/lib/systemd/system/xmpp-bot.service
|
||||||
|
regexp: '{{item.regexp}}'
|
||||||
|
line: '{{item.line}}'
|
||||||
|
state: present
|
||||||
|
with_items:
|
||||||
|
- regexp: '^User='
|
||||||
|
line: 'User={{xmppbot_user}}'
|
||||||
|
- regexp: '^WorkingDirectory='
|
||||||
|
line: 'WorkingDirectory={{xmppbot_dir}}'
|
||||||
|
- regexp: '^ExecStart='
|
||||||
|
line: 'ExecStart=/usr/bin/node {{xmppbot_dir}}/lib/server.js'
|
||||||
|
|
||||||
|
- name: Enable XMPP bot service
|
||||||
|
become: yes
|
||||||
|
systemd:
|
||||||
|
name: xmpp-bot
|
||||||
|
enabled: yes
|
||||||
|
state: started
|
||||||
|
daemon_reload: yes
|
23
docs/ansible/xmpp-bot/tasks/nodejs.yml
Normal file
23
docs/ansible/xmpp-bot/tasks/nodejs.yml
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
---
|
||||||
|
- name: Add NodeSource signing key
|
||||||
|
become: yes
|
||||||
|
apt_key:
|
||||||
|
url: https://deb.nodesource.com/gpgkey/nodesource.gpg.key
|
||||||
|
state: present
|
||||||
|
|
||||||
|
- name: Add NodeSource APT repository
|
||||||
|
become: yes
|
||||||
|
apt_repository:
|
||||||
|
repo: deb https://deb.nodesource.com/{{nodejs_repo}} {{distro}} main
|
||||||
|
filename: nodesource
|
||||||
|
update_cache: yes
|
||||||
|
state: present
|
||||||
|
vars:
|
||||||
|
- distro: "{{ ansible_distribution_release | default('buster') }}"
|
||||||
|
|
||||||
|
- name: Install Node.js packages
|
||||||
|
become: yes
|
||||||
|
apt:
|
||||||
|
name: nodejs
|
||||||
|
state: present
|
||||||
|
cache_valid_time: 3600
|
99
docs/ansible/xmpp-bot/templates/config.json.j2
Normal file
99
docs/ansible/xmpp-bot/templates/config.json.j2
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
{
|
||||||
|
"logger": {
|
||||||
|
"level": "debug",
|
||||||
|
"file": {
|
||||||
|
"active": false,
|
||||||
|
"pattern": "%d %p %m%n",
|
||||||
|
"path": "{{xmppbot_log_dir}}/",
|
||||||
|
"filename": "xmpp-bot.log"
|
||||||
|
},
|
||||||
|
"console": {
|
||||||
|
"active": false,
|
||||||
|
"coloured": true
|
||||||
|
},
|
||||||
|
"stdout": {
|
||||||
|
"active": true,
|
||||||
|
"pattern": "%p %m"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"webhooksListener": {
|
||||||
|
"path": "{{xmppbot_webhook_path}}",
|
||||||
|
"port": {{xmppbot_webhook_port}},
|
||||||
|
"ssl": {
|
||||||
|
"port": {{xmppbot_webhook_port_ssl}},
|
||||||
|
"certPath": "{{xmppbot_webhook_certpath}}",
|
||||||
|
"keyPath": "{{xmppbot_webhook_keypath}}"
|
||||||
|
},
|
||||||
|
"users": [{% for login, passwd in xmppbot_webhook_users.iteritems() %}
|
||||||
|
|
||||||
|
{
|
||||||
|
"login": "{{login}}",
|
||||||
|
"password": "{{passwd}}"
|
||||||
|
}{% if not loop.last %},{% endif %}{% endfor %}
|
||||||
|
|
||||||
|
],
|
||||||
|
"accessLog": {
|
||||||
|
"active": true,
|
||||||
|
"path": "{{xmppbot_log_dir}}/",
|
||||||
|
"filename": "webhook.log"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"xmppServer": {
|
||||||
|
"service": "{{xmppbot_xmpp_server.service}}",
|
||||||
|
"domain": "{{xmppbot_xmpp_server.domain}}",
|
||||||
|
"username": "{{xmppbot_xmpp_server.username}}",
|
||||||
|
"password": "{{xmppbot_xmpp_server.password}}",
|
||||||
|
"resource": "{{xmppbot_xmpp_resource}}",
|
||||||
|
"errorReply": "{{xmppbot_xmpp_error_reply}}",
|
||||||
|
"rooms": [{% for room in xmppbot_xmpp_server.rooms %}
|
||||||
|
|
||||||
|
{
|
||||||
|
"id": "{{room.id}}",
|
||||||
|
"password": {{room.password}}
|
||||||
|
}{% if not loop.last %},{% endif %}{% endfor %}
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"incomingWebhooks": [{% for webhook in xmppbot_incoming_webhooks %}
|
||||||
|
|
||||||
|
{
|
||||||
|
"path": "{{webhook.path}}",
|
||||||
|
{% if webhook.args is defined -%}
|
||||||
|
"args": { {% for key, value in webhook.args.iteritems() %}
|
||||||
|
|
||||||
|
"{{key}}": "{{value}}"{% if not loop.last %},{% endif %}{% endfor %}
|
||||||
|
|
||||||
|
},
|
||||||
|
{% endif -%}
|
||||||
|
{% if webhook.template is defined -%}
|
||||||
|
"template": {{webhook.template|tojson}},
|
||||||
|
{% endif -%}
|
||||||
|
"action": "{{webhook.action}}"
|
||||||
|
}{% if not loop.last %},{% endif %}{% endfor %}
|
||||||
|
|
||||||
|
],
|
||||||
|
"xmppHooks": [{% for xmpp_hook in xmppbot_xmpp_hooks %}
|
||||||
|
|
||||||
|
{
|
||||||
|
"room": "{{xmpp_hook.room}}",
|
||||||
|
"action": "{{xmpp_hook.action}}",
|
||||||
|
"args": {{xmpp_hook.args}}
|
||||||
|
}{% if not loop.last %},{% endif %}{% endfor %}
|
||||||
|
|
||||||
|
],
|
||||||
|
"outgoingWebhooks": [{% for outgoing_webhook in xmppbot_outgoing_webhooks %}
|
||||||
|
|
||||||
|
{
|
||||||
|
"code": "{{outgoing_webhook.code}}",
|
||||||
|
"url": "{{outgoing_webhook.url}}",
|
||||||
|
"timeout": {{outgoing_webhook.timeout}},
|
||||||
|
"strictSSL": {{outgoing_webhook.strictSSL}},
|
||||||
|
"contentType": "{{outgoing_webhook.contentType}}",
|
||||||
|
"authMethod": "{{outgoing_webhook.authMethod}}",
|
||||||
|
"user": "{{outgoing_webhook.user}}",
|
||||||
|
"password": "{{outgoing_webhook.password}}",
|
||||||
|
"bearer": {{outgoing_webhook.bearer}}
|
||||||
|
}{% if not loop.last %},{% endif %}{% endfor %}
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in a new issue