Skip to main content
Deno 2 is finally here πŸŽ‰οΈ
Learn more

🍣 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",
  });
}

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
  • executors
    • local
    • ssh
  • modules
    • log
    • net.ping
  • inventories
    • local
  • vaults
    • local
  • reporters
    • console