Setup & configure everything. Everywhere. One command.

Setup and configure any machine or project with a single command; optional bootstrapping of the freckles package itself included.

Use the same configuration to provision physical machines, virtual ones, container images, ...

# configuration, save as: hello-world.frecklet
- webserver-static-site:
    hostname: example.com
    webserver: apache
    use_https: true
    server_admin: hello@example.com
- file-with-content:
    owner: www-data
    path: /var/www/html/index.html
    content: |
      <h1><i>freckles</i> says "hello", World!</h1>
# Execute locally:
> frecklecute --target admin@example.com hello-world.frecklet

# or, directly on the target:
> curl https://freckles.sh | bash -s -- frecklecute hello-world.frecklet

Infrastructure as code. On your own term(inal)s.

No dependencies on external services, languages, platforms or technologies.

All you need is the freckles binary, (authorized) access to your target, and a single, simple data structure describing your desired state. Use any language you want to create that data structure.

Re-usable & composable building blocks

Execute any of the pre-built included or community-created frecklets directly, or use them as building blocks for new ones.

You can also easily build up your own frecklet repository, to organize and possibly share often used personal, project- or company-related tasks.

> frecklecute --list  

frecklet                             description
-----------------------------------  ------------------------------------
admin-user-exists                    ensure an admin user with a
                                     specified username exists
ansible-module                       execute a specific Ansible module
ansible-role                         execute an arbitrary role from
                                     Ansible Galaxy
apache-vhost-file                    apache vhost configuration
apache-vhost-from-folder             configure a Nginx vhost for static
                                     site
archive-extracted                    extracts an archive
basic-hardening                      basic security set-up for a newly
                                     installed server
command-output-to-file               execute a command, write the output
                                     to file
config-value-in-file                 adds a key/value pair to a file
config-values-in-file                adds key/value pairs to a file
debug-msg                            display a debug message
debug-var                            displays the content of an
                                     (internal) Ansible variable
debug-vars                           displays the content of an
                                     (internal) Ansible variable
devpi-create-backup                  backs-up a devpi service
devpi-import-from-backup             restores up a devpi service backup
devpi-nginx-vhost-config             creates a vhost for devpi on Nginx
dotfiles                             setup dotfiles and associated apps
execute-ad-hoc-script                create an executable file from a
                                     template, execute it, delete it
execute-command                      execute a one-off command
execute-shell                        execute a one-off shell command
file-downloaded                      download a file
file-fetched                         fetches a file from a remote
                                     (target) host
file-is-present                      ensure a file exists
file-with-content                    ensure a file exists and has a
                                     certain content
folder-exists                        ensure a folder exists
folder-is-empty                      ensure a folder exists
folder-stowed                        stow (symlink) a folder
folders-intermingled                 merge a target folder with another
frecklecute                          execute a frecklet indirectly
git-repo-synced                      check out or pulls a git repo
group-exists                         ensure a group exists
hostname                             set the hosts hostname
inaugurate-custom-script             generate a custom inaugurate script
init-service-configured              configure an init service
init-service-disabled                disable init-service
init-service-enabled                 enable init-service
init-service-reloaded                reload init service
init-service-restarted               restart init-service
init-service-started                 start init-service
init-service-stopped                 stop init-service
initial-system-setup                 basic security setup for a new
                                     server, incl. setup of admin user."
ipv4-address-assigned                make sure an IPv4 address is
                                     assigned to an interface
lang-go                              make sure Go is available
lang-java                            install OpenJDK if not already
                                     available
lang-php                             make sure PHP is installed
lang-python                          install a Python runtime for a user
letsencrypt-cert-exists              ensures a letsencrypt https
                                     certificate for a hostname exists
link-exists                          ensure a filesystem link exists
locales-generated                    ensure a set of locales is generated
                                     on a system
mariadb-database-exists              installs MariaDB (if necessary), and
                                     makes sure a specified database
                                     exists
matomo-service-standalone            install Matomo analytics service
nginx-inaugurate-vhost               creates a vhost to host a
                                     'inaugurate' bootstrap script
nginx-server-block-file              nginx server configuration
nginx-vhost-from-folder              configure a Nginx vhost for static
                                     site
package-installed                    install a single packages
package-managers                     install one or several package
                                     managers
packages-installed                   install a list of packages
parent-folder-exists                 ensure the parent folder of a path
                                     exists
passwordless-sudo-enabled-for-users  grant passwordless sudo permission
                                     to a user
path-archived                        archives a file or folder
path-attributes                      makes sure a file/folder has a
                                     certain owner/group
path-has-mode                        make sure a file/folder has a
                                     certain mode
path-is-absent                       ensure a file or folder is absent
path-is-owned-by                     make sure a file/folder has a
                                     certain owner/group
path-is-synced                       make sure a file or folder is synced
                                     between two locations
pkg_mgr-asdf                         ensures 'asdf' is installed
pkg_mgr-asdf-plugin                  install a plugin for asdf
pkg_mgr-conda                        install the 'conda' package manager
pkg_mgr-homebrew                     ensure the 'homebrew' package
                                     manager is installed
pkg_mgr-nix                          ensure the 'nix' package manager is
                                     installed
postgresql-database-exists           installs PostgreSQL (if necessary),
                                     and makes sure a specified database
                                     exists
python-virtualenv                    create a Python virtualenv
python-virtualenv-execute-shell      executes a command inside a
                                     virtualenv
runtime-python                       n/a
shell-output-to-file                 execute a shell command, write the
                                     output to file
sysctl-value                         set a sysctl value
systemd-service-unit                 create and configure a certain
                                     systemd service unit exists
systemd-services-started             a list of init-service to start (if
                                     they exist) using Ansible
systemd-services-stopped             a list of init-service to stop (if
                                     they exist) using Ansible
user-exists                          make sure a user exists
webserver-static-site                install and configure webserver for
                                     static site
wordpress-folder-prepared            prepares wordpress project folders
wordpress-standalone                 sets up a single-site wordpress
                                     instance
wordpress-vhost-apache               create Apache wordpress virtual host
                                     config
wordpress-vhost-nginx                create Nginx wordpress virtual host
                                     config
zerotier-network-member              add and authorize a new member to an
                                     existing zerotier network
zile-config-file                     configuration for the 'zile' text
                                     editor