Bolt scripts are the next step up from Bolt commands in terms of power and complexity. You can use a single invocation of Bolt to run an entire script, written in any language supported by your target nodes.
There are big advantages to using Bolt to run a script instead of individual commands. Scripts can include conditional logic, loops, and other powerful programming concepts. You can store scripts in a version control system like Git, gaining all the advantages version control provides. And it’s quicker and less error-prone to run a sequence of commands by typing
bolt script run once than by typing
bolt command run for each command.
To demonstrate the power of Bolt scripts, imagine that you want to gather information about a target node called
node1 using the commands hostname, date, and ps. Using what you learned in the last section of this course, you could run bolt command run three times:
bolt command run "hostname" --targets node1 bolt command run "date" --targets node1 bolt command run "ps" --targets node1
Or you could run a single Bolt script:
bolt script run "get_info.sh" --targets node1
As long as the file get_info.sh contains the hostname, date, and ps commands, the end result will be exactly the same.
In case you’re wondering about the mechanics, Bolt uses a three-step process to run scripts:
1). Use SSH or WinRM to copy the script to a temporary folder on the target node. 2). Run the script on the target node, sending any output back to the host node. 3). Delete the script from the target node.
Writing a Bolt script is trivial: use your favorite scripting language to write a program, and you’re done! Use Bash, PowerShell, Python, Ruby, or any other language that has an interpreter installed on the target nodes.
For example, if your target node runs Linux or macOS, you could write a Bash script containing the three commands from above:
#!/usr/bin/env bash hostname date ps
Or if you prefer Python and have a Python interpreter installed on your target nodes, you could put this content into a script called
#!/usr/bin/env python import os os.system('hostname') os.system('date') os.system('ps')
If Ruby’s your thing, you could put this content in
#!/usr/bin/env ruby system('hostname') system('date') system('ps')
Since the three commands you’ve been working with happen to be valid PowerShell commands, you could put them as-is into a PowerShell script called
hostname date ps
Note: because of differences in how Linux, macOS, and Windows text editors save files, scripts written on Linux or macOS computers can be run on any target nodes, but scripts written on Windows computers can only be run on Windows target nodes.
You’ve already seen a Bolt script in action. You might have noticed that the syntax for running scripts is almost the same as it is for running commands:
bolt script run "<SCRIPT_NAME>" --targets <NODE_IDENTIFER>
Use this syntax to run scripts on target nodes with any operating system. Typically you would only run PowerShell scripts on Windows target nodes, since Linux and macOS don’t support PowerShell. Similarly, Bash scripts generally only work on Linux or macOS target nodes. But Bolt can run scripts written in cross-platform languages like Python or Ruby on any target node with an appropriate interpreter.