in

mig1984 / bashible, Hacker News

mig1984 / bashible, Hacker News
                    

        

Bashible is a deployment / automation tool written in Bash (DSL). Inspired by Ansible. Simplifies things and prevents usual mistakes.

Features:

  • improved readability
  • unhandled failures prevention
  • skipping already done tasks
  • command chaining
  • working directory always as expected
  • variable checking
  • dependencies; calling sub-scripts
  • delayed tasks executed on finish
  • child termination handler; no processes left running
  • modules: template engine, config editing, etc.
  • nice output

At the moment, bashible has been used on Arch linux. It may not be compatible with other platforms, because it internally uses GNU / sed, grep, etc.

Suggestions and bugfixes are welcome! : -)

@ represents a block of tasks, - represents a task. Both @ and -

  #!  / usr / local / bin / bashible 
  
  # 
 the working directory is automatically set to the script's  
  # 
 all tasks will stop execution immediately on failure, unless prefixed by "may_fail" @ Synchronizing files   - result synced rsync -av / foo / bar  @ Shutting down the machine   - when synced   - when  test 

-f / etc / do-shutdown   - shutdown -h now @ Sending an e-mail unless synchronization succeeded   - when not synced   - mail [email protected] "

 synchronzation failed   
 

Rewritten into pure Bash, the example above could look like this,

  #!  / bin / bash 
   cd     ` dirname  ($ 0) ()  
 
 set  -eux -o pipefail   echo 

Synchronizing files

 if 

rsync -av / foo / bar

; 
  then     echo 

Shutting down the machine   

 if 
 test 
;  
 then 
     shutdown -h now   

fi else    echo Sending an e-mail unless synchronization succeeded   mail [email protected]

  
 synchronzation failed    
 

fi

See also examples in the example directory.

Install & use

Install bashible and it's modules (sourceable functions - here just one module, "edit"). Copy everything to the same directory.

wget https://raw.githubusercontent.com/mig / bashible / master / bashible wget https://raw.githubusercontent.com/mig / bashible / master / bashible.edit chmod bashible chmod bashible.edit mv bashible / usr / local / bin mv bashible.edit / usr / local / bin

Run the script

bashible my-script.bash ARG1 ARG2 ...

or put she-bang in the beginning of the script and then run it directly

  #!  / usr / local / bin / bashible 
    

run it

./ my-script.bash ARG1 ARG2 ...

Functions (core functions)

always_output_to DEST COMMAND ARGS ... bashible_version base_dir PATH

delayed COMMAND ARGS ...

dir_empty PATH (empty COMMAND ARGS ... evaluate STRING fail MESSAGE (fill_var VAR COMMAND ARGS ...) halt MESSAGE (not COMMAND ARGS ... (may_fail COMMAND ARGS ...) (output_to DEST COMMAND ARGS ...) (orig_dir print_warn MSG quiet COMMAND ARGS ... reset_base_dir (result NAME COMMAND ARGS ... (run PATH ARGS ...)
 (set_var VAR VALUE)   (toplevel)    (var_empty VAR)   

(when COMMAND ARGS ...) unless_already COMMAND ARGS ... use FEATURES ...

add_line LINE PATH append_line LINE PATH comment_lines_matching REGEXP PATH Example output prepend_line LINE PATH (remove_lines_matching REGEX PATH) (replace_lines_matching REGEXP STRING PATH replace_matching REGEXP STRING PATH uncomment_lines_matching REGEXP PATH

TODO

Write more docs and examples.

Modularize. The bashible core in the version 1.0 should contain only necessary functions and should not ever change. For instance, the (delayed) and unless_already COMMAND ARGS ... functions now need two temporary files. These files are created on every bashible startup. These functions should go into optional modules instead.

Create tests. Bashible uses GNU / grep, GNU / sed and other programs which may not work properly on all platforms.

Make bashible multiplatform.

Create more modules and / or integrate existing Bash libraries.

   (Read More )