forked from ytti/oxidized
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* docs: Refactor docs to make them more digestible * small updates * More updates * more splitting off of files + fixed backtick use
- Loading branch information
1 parent
e62eba8
commit 8acedce
Showing
8 changed files
with
995 additions
and
985 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,186 @@ | ||
## Configuration | ||
### Debugging | ||
In case a model plugin doesn't work correctly (ios, procurve, etc.), you can enable live debugging of SSH/Telnet sessions. Just add a `debug` option containing the value true to the `input` section. The log files will be created depending on the parent directory of the logfile option. | ||
|
||
The following example will log an active ssh/telnet session `/home/oxidized/.config/oxidized/log/<IP-Adress>-<PROTOCOL>`. The file will be truncated on each consecutive ssh/telnet session, so you need to put a `tailf` or `tail -f` on that file! | ||
|
||
``` | ||
log: /home/oxidized/.config/oxidized/log | ||
... | ||
input: | ||
default: ssh, telnet | ||
debug: true | ||
ssh: | ||
secure: false | ||
``` | ||
|
||
### Privileged mode | ||
|
||
To start privileged mode before pulling the configuration, Oxidized needs to send the enable command. You can globally enable this, by adding the following snippet to the global section of the configuration file. | ||
|
||
``` | ||
vars: | ||
enable: S3cre7 | ||
``` | ||
|
||
### Removing secrets | ||
|
||
To strip out secrets from configurations before storing them, Oxidized needs the the remove_secrets flag. You can globally enable this by adding the following snippet to the global sections of the configuration file. | ||
|
||
``` | ||
vars: | ||
remove_secret: true | ||
``` | ||
|
||
Device models can contain substitution filters to remove potentially sensitive data from configs. | ||
|
||
As a partial example from ios.rb: | ||
|
||
``` | ||
cmd :secret do |cfg| | ||
cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>' | ||
(...) | ||
cfg | ||
end | ||
``` | ||
The above strips out snmp community strings from your saved configs. | ||
|
||
**NOTE:** Removing secrets reduces the usefulness as a full configuration backup, but it may make sharing configs easier. | ||
|
||
### Disabling SSH exec channels | ||
|
||
Oxidized uses exec channels to make information extraction simpler, but there are some situations where this doesn't work well, e.g. configuring devices. This feature can be turned off by setting the `ssh_no_exec` | ||
variable. | ||
|
||
``` | ||
vars: | ||
ssh_no_exec: true | ||
``` | ||
|
||
### SSH Proxy Command | ||
|
||
Oxidized can `ssh` through a proxy as well. To do so we just need to set `ssh_proxy` variable. | ||
|
||
``` | ||
... | ||
map: | ||
name: 0 | ||
model: 1 | ||
vars_map: | ||
enable: 2 | ||
ssh_proxy: 3 | ||
... | ||
``` | ||
|
||
### Advanced Configuration | ||
|
||
Below is an advanced example configuration. You will be able to (optionally) override options per device. The router.db format used is `hostname:model:username:password:enable_password`. Hostname and model will be the only required options, all others override the global configuration sections. | ||
|
||
``` | ||
--- | ||
username: oxidized | ||
password: S3cr3tx | ||
model: junos | ||
interval: 3600 | ||
log: ~/.config/oxidized/log | ||
debug: false | ||
threads: 30 | ||
timeout: 20 | ||
retries: 3 | ||
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/ | ||
vars: | ||
enable: S3cr3tx | ||
groups: {} | ||
rest: 127.0.0.1:8888 | ||
pid: ~/.config/oxidized/oxidized.pid | ||
input: | ||
default: ssh, telnet | ||
debug: false | ||
ssh: | ||
secure: false | ||
output: | ||
default: git | ||
git: | ||
user: Oxidized | ||
email: [email protected] | ||
repo: "~/.config/oxidized/oxidized.git" | ||
source: | ||
default: csv | ||
csv: | ||
file: ~/.config/oxidized/router.db | ||
delimiter: !ruby/regexp /:/ | ||
map: | ||
name: 0 | ||
model: 1 | ||
username: 2 | ||
password: 3 | ||
vars_map: | ||
enable: 4 | ||
model_map: | ||
cisco: ios | ||
juniper: junos | ||
``` | ||
|
||
### Advanced Group Configuration | ||
|
||
For group specific credentials | ||
|
||
``` | ||
groups: | ||
mikrotik: | ||
username: admin | ||
password: blank | ||
ubiquiti: | ||
username: ubnt | ||
password: ubnt | ||
``` | ||
and add group mapping | ||
``` | ||
map: | ||
model: 0 | ||
name: 1 | ||
group: 2 | ||
``` | ||
For model specific credentials | ||
|
||
``` | ||
models: | ||
junos: | ||
username: admin | ||
password: password | ||
ironware: | ||
username: admin | ||
password: password | ||
vars: | ||
enable: enablepassword | ||
apc_aos: | ||
username: apc | ||
password: password | ||
``` | ||
|
||
### RESTful API and Web Interface | ||
|
||
The RESTful API and Web Interface is enabled by configuring the `rest:` parameter in the config file. This parameter can optionally contain a relative URI. | ||
|
||
``` | ||
# Listen on http://127.0.0.1:8888/ | ||
rest: 127.0.0.1:8888 | ||
``` | ||
|
||
``` | ||
# Listen on http://10.0.0.1:8000/oxidized/ | ||
rest: 10.0.0.1:8000/oxidized | ||
``` | ||
|
||
### Triggered backups | ||
|
||
A node can be moved to head-of-queue via the REST API `GET/POST /node/next/[NODE]`. | ||
|
||
In the default configuration this node will be processed when the next job worker becomes available, it could take some time if existing backups are in progress. To execute moved jobs immediately a new job can be added: | ||
|
||
``` | ||
next_adds_job: true | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
# Hooks | ||
You can define arbitrary number of hooks that subscribe different events. The hook system is modular and different kind of hook types can be enabled. | ||
|
||
## Configuration | ||
Following configuration keys need to be defined for all hooks: | ||
|
||
* `events`: which events to subscribe. Needs to be an array. See below for the list of available events. | ||
* `type`: what hook class to use. See below for the list of available hook types. | ||
|
||
### Events | ||
* `node_success`: triggered when configuration is succesfully pulled from a node and right before storing the configuration. | ||
* `node_fail`: triggered after `retries` amount of failed node pulls. | ||
* `post_store`: triggered after node configuration is stored (this is executed only when the configuration has changed). | ||
* `nodes_done`: triggered after finished fetching all nodes. | ||
|
||
## Hook type: exec | ||
The `exec` hook type allows users to run an arbitrary shell command or a binary when triggered. | ||
|
||
The command is executed on a separate child process either in synchronous or asynchronous fashion. Non-zero exit values cause errors to be logged. STDOUT and STDERR are currently not collected. | ||
|
||
Command is executed with the following environment: | ||
``` | ||
OX_EVENT | ||
OX_NODE_NAME | ||
OX_NODE_IP | ||
OX_NODE_FROM | ||
OX_NODE_MSG | ||
OX_NODE_GROUP | ||
OX_JOB_STATUS | ||
OX_JOB_TIME | ||
OX_REPO_COMMITREF | ||
OX_REPO_NAME | ||
``` | ||
|
||
Exec hook recognizes following configuration keys: | ||
|
||
* `timeout`: hard timeout for the command execution. SIGTERM will be sent to the child process after the timeout has elapsed. Default: 60 | ||
* `async`: influences whether main thread will wait for the command execution. Set this true for long running commands so node pull is not blocked. Default: false | ||
* `cmd`: command to run. | ||
|
||
|
||
## Hook configuration example | ||
``` | ||
hooks: | ||
name_for_example_hook1: | ||
type: exec | ||
events: [node_success] | ||
cmd: 'echo "Node success $OX_NODE_NAME" >> /tmp/ox_node_success.log' | ||
name_for_example_hook2: | ||
type: exec | ||
events: [post_store, node_fail] | ||
cmd: 'echo "Doing long running stuff for $OX_NODE_NAME" >> /tmp/ox_node_stuff.log; sleep 60' | ||
async: true | ||
timeout: 120 | ||
``` | ||
|
||
### githubrepo | ||
|
||
This hook configures the repository `remote` and _push_ the code when the specified event is triggerd. If the `username` and `password` are not provided, the `Rugged::Credentials::SshKeyFromAgent` will be used. | ||
|
||
`githubrepo` hook recognizes following configuration keys: | ||
|
||
* `remote_repo`: the remote repository to be pushed to. | ||
* `username`: username for repository auth. | ||
* `password`: password for repository auth. | ||
* `publickey`: publickey for repository auth. | ||
* `privatekey`: privatekey for repository auth. | ||
|
||
When using groups repositories, each group must have its own `remote` in the `remote_repo` config. | ||
|
||
``` yaml | ||
hooks: | ||
push_to_remote: | ||
remote_repo: | ||
routers: [email protected]:oxidized/routers.git | ||
switches: [email protected]:oxidized/switches.git | ||
firewalls: [email protected]:oxidized/firewalls.git | ||
``` | ||
## Hook configuration example | ||
``` yaml | ||
hooks: | ||
push_to_remote: | ||
type: githubrepo | ||
events: [post_store] | ||
remote_repo: [email protected]:oxidized/test.git | ||
username: user | ||
password: pass | ||
``` | ||
## Hook type: awssns | ||
The `awssns` hook publishes messages to AWS SNS topics. This allows you to notify other systems of device configuration changes, for example a config orchestration pipeline. Multiple services can subscribe to the same AWS topic. | ||
|
||
Fields sent in the message: | ||
|
||
* `event`: Event type (e.g. `node_success`) | ||
* `group`: Group name | ||
* `model`: Model name (e.g. `eos`) | ||
* `node`: Device hostname | ||
|
||
Configuration example: | ||
|
||
``` yaml | ||
hooks: | ||
hook_script: | ||
type: awssns | ||
events: [node_fail,node_success,post_store] | ||
region: us-east-1 | ||
topic_arn: arn:aws:sns:us-east-1:1234567:oxidized-test-backup_events | ||
``` | ||
|
||
AWS SNS hook requires the following configuration keys: | ||
|
||
* `region`: AWS Region name | ||
* `topic_arn`: ASN Topic reference | ||
|
||
Your AWS credentials should be stored in `~/.aws/credentials`. | ||
|
||
## Hook type: slackdiff | ||
|
||
The `slackdiff` hook posts colorized config diffs to a [Slack](http://www.slack.com) channel of your choice. It only triggers for `post_store` events. | ||
|
||
You will need to manually install the `slack-api` gem on your system: | ||
|
||
``` | ||
gem install slack-api | ||
``` | ||
|
||
Configuration example: | ||
|
||
``` yaml | ||
hooks: | ||
slack: | ||
type: slackdiff | ||
events: [post_store] | ||
token: SLACK_BOT_TOKEN | ||
channel: "#network-changes" | ||
``` | ||
|
||
Note the channel name must be in quotes. |
Oops, something went wrong.