π£ Itsudeno
β οΈ This project is in active development and will be available at a later date.
Itsudeno is a scriptable IT automation system written in TypeScript and running on Deno. It can be used to easily deploy and configure applications, services and networks on target hosts.
π± Features
π₯’ Choice of paradigm
Itsudeno aims to provide maximum flexibility to suit needs, rather than constraining.
Use YAML and template literals for declarative programming:
- _: Set default policy for firewall for ${chain}
using: ssh
as: root
loop:chain:
- input
- output
net.ip.firewall:
chain: ${chain}
policy: drop
Or use it directly with TypeScript and deno for imperative programming:
import * as it from "https://deno.land/x/itsudeno";
for (const chain of ["input", "output"]) {
await it.mod.net.ip.firewall({
_: `Set default policy for firewall for ${chain}`,
_using:"ssh",
_as: "root",
chain,
policy: "drop",
});
}
π₯ Fully-featured language
Itsudeno is entirely written in TypeScript and include type definitions in order to prevent common errors and misuses of modules.
Rather than providing a custom templating engine with limited operations, all JavaScript features are exposed. File templating use EJS (Embedded JavaScript templating).
- _: Say hello in a random language
execute:
command: echo ${["hello", "bonjour", "δ½ ε₯½", "γγγ«γ‘γ―"][~~(4*Math.random())]}
- _: Template a file content with EJS
files.template:
content: |
<% for (const word of ["hello", "bonjour", "δ½ ε₯½", "γγγ«γ‘γ―"]) { %>
<%= word %>
<% } %>
π₯‘ Powerful modules
Itsudeno provides various modules to create users, files, templated configurations, install packages, make API calls, execute scripts, etc.
Modules are built to be idempotent, cross-platform, previewable, combinable and extendable.
{
"name": "modules.log",
"changes": {
"policy": "drop"
},
"past": {
"policy": "accept"
},
"result": {
"policy": "drop"
},
// ...
}
Metaprogramming is used to ease the integration of new features (build type definitions, documentation, validators, autoloading, etc.) so developers can hack Itsudeno without difficulty.
π Mighty executors
Itsudeno handles module executions through the concept of executors. They are in charge of packaging modules into a small JavaScript payloads and connecting to target host to run the bundled scripts.
There are no operating system restrictions for Itsudeno control node, except that it must be able to run deno.
- _: Say hello using SSH
using: ssh
log:
message: hello
π₯ Awesome reporters
Itsudeno handles module outputs through the concept of reporters. For convenience, a default one is provided which should cover most use cases, though it is possible to switch to more complex ones.
## Ping example.org ############################################################
- my.itsudeno.host:
content: "hello world" β "hello itsudeno"
md5: "5eb63bbbe01eeed093cb22bb8f5acdc3" β "a66afc978304bf6dc01bd684dc211bad"
permissions: rwxrwxrwx β rw-rw-r-
π‘ Flexible inventories
Itsudeno handles hosts through the concept of inventories. For convenience, a local inventory is provided to ease experimentations, although it is advised to switch to more powerful inventories for larger use cases.
Hosts can be targetted in several ways, like hostname, ip ranges, and groups. Additional filtering can be performed through traits, which are collected automatically at runtime and contain various characteristics like operating system, services, etc.
- _: Targets hosts in group "webservers" discovered as "debian" hosts
targets: webservers (debian)
tasks:
- flow.noop: # Do something
π’ Secured secrets with vaults
Itsudeno handles secrets through the concept of vaults. For convenience, a local vault is provided to ease experimentations, although it is advised to switch to more powerful vaults for larger use cases.
- _: Set password for user
os.user:
user: itsudeno
password: ${await vault.get(`${host.fqdn}_password`)}
π Intuitive interfaces
Itsudeno provides multiple interfaces to manage hosts, such as command-line interface, web API and a web-based user interface.
(more informations about this section will be available at a later date)
π¦ License
GNU General Public License v3.0
Copyright (c) 2021-present Simon Lecoq (lowlighter)
π Contributing
To report a bug, fill an issue describing it. To suggest new features or request help, check out discussions instead.
To contribute, submit a pull request. Be sure to read both ARCHITECTURE.md and CONTRIBUTING.md to understand how Itsudeno is organized.
π Progress towards initial release
- .github
- contributing
- architecture
- workflows
- core
- internal
- builder
- documenter
- testing
- executors
- modules
- inventories
- vaults
- reporters
- tools
- setup
- internal
- executors
- local
- ssh
- modules
- log
- net.ping
- inventories
- local
- vaults
- local
- reporters
- console