- Fix group names being passed to @connectors
- Include group names in
debug-inventory
output
- Add
@winrm
connector, allowing pyinfra to manage Windows instances (@mkinney)- Add windows module
- Add windows_files module
- Add many
Windows*
facts
- Follow redirects when using
curl
infiles.download
operation
- Improve use of
curl
and/orwget
infiles.download
operation - Add
assume_exists
argument tofiles.put
operaton - Ensure
@local
connector adds the host to the@local
group - Add
--quiet
CLI flag to hide most output
- Improve
pyinfra --support
output (@mkinney) - Add print input state flags and don't show input with
exec
command - Remove all ANSI escape codes from spinner on Windows
- Reduce spinner interval to 0.2s
- Add
pyinfra --support
- Add
md5sum
/sha1sum
/sha256sum
arguments tofiles.download
operation - Add
server.reboot
example (@mkinney - Make SSH a proper connector (ie
@ssh/my-host.net
works) - Fix terminal width detection on Windows (again)
- Fix
server.reboot
argument clash (timeout
->reboot_timeout
)
- Add
success_exit_codes
global argument - Add
debug-inventory
command - Add
-e
to grep calls infind_in_file
fact - Add
server.reboot
operation - Parse CLI operation args as JSON
- Restore/fix
python -m pyinfra
functionality - Fix TTY detection on Windows
Gearing up for v1
release, deprecating the last unused/old features, expanding the tests and documentation, closing off some really old issues (stdin support).
Improvements:
- Add global
use_sudo_login
anduse_su_login
arguments (and config settings) - Add
OperationTypeError
exception and reject invalid names for files operations - Implement stdin support! There's a global
stdin
argument for all operations - Pass
-S
to sudo so thestdin
argument works - Autogenerate the documentation of global arguments
- Extended examples and documentation (@mkinney)
- Fully test SSH/local/Docker connectors
- Add bash complete script (
scripts/pyinfra-complete.sh
)
Deprecated:
- Deprecate global
when
andhosts
arguments - Deprecate hooks
Fixed:
- Fix logging escape sequences to files and on Windows
- Fix/improve TTY detection for the progress bar
- Fix issue with no SSH config causing an exception
- Fix: exit 1 when hosts fail
- Add URL support to
yum.repo
anddnf.repo
operations - Support downloading files with
curl
(preferred overwget
) - Add
pyinfra INVENTORY all-facts
to get all non-arg facts - Hide errors when we have a fallback command
- Fix quotes in
@docker
connector - Fix installing packages in
yum.rpm
anddnf.rpm
- Fix
git.config
check where the repository doesn't exist
- Add
flake8-spellcheck
and fix spellings throughout (@mkinney) - Add large number of example deploys (@mkinney)
- Fix multiple issues with the
files.get
operation
- Add dnf module (@mkinney), matching existing yum operations
- Add
@mech
connector (@mkinney) - Add
extra_install_args
andextra_uninstall_args
toyum.packages
operation (@mkinney) - Remove autogenerated facts/modules docs from git
- Add apk module
- Operations:
apk.packages
,apk.update
,apk.upgrade
- Facts:
apk_packages
- Operations:
- Add brew module
- Operations:
brew.packages
,brew.update
,brew.upgrade
,brew.casks
,brew.cask_upgrade
,brew.tap
- Facts:
brew_packages
,brew_casks
,brew_taps
- Operations:
- Add pacman module
- Operations:
pacman.packages
,pacman.update
,pacman.upgrade
- Facts:
pacman_packages
- Operations:
- Add Docker facts (matching
docker inspect
output):docker_system_info
docker_containers
docker_images
docker_networks
docker_container(ID)
docker_image(ID)
docker_network(ID)
- Add
files.get
operation to download remote files - Add
server.mount
operation andmounts
fact to manage mounted filesystems - Add
@ansible
connector to read Ansible inventory files - Add
ipv4_addresses
andipv6_addresses
shortcut facts - Support
ip
/iproute2 fornetwork_devices
fact - Large ongoing documentation overhaul
- Add a
CONTRIBUTORS.md
! - Fix passing of
postgresql_password
inpostgresql_*
facts - Only open/parse SSH config file once
- Large expansion of tests - 100% module + facts coverage
- Remove lots of printing fluff from the CLI
- Correctly use
with open...
infiles.template
operation - Internal change: file upload commands now tuple
('upload', local_file, remote_file)
- also add a
download
version to download files
- also add a
- Add
State.preserve_loop_order
to execute loops in order - Fix: include data for temp filename hash in
server.script_template
operation
- Add
--init
flag to git submodule update (@ryan109)
- Add
assume_present
(defaultFalse
) kwarg tofiles.[file|directory|link]
operations - Accept lists for time kwargs in
server.crontab
- Fix
su
usage and support w/shell_executable
- Fix/cleanup Docker containers on error
- Move to
.readthedocs.yml
- Fix
@hook
functions by correctly checkingstate.initialised
- Add
create_remote_dir
tofiles.template
operation
- Fix
apt_repos
fact when/etc/apt/sources.list.d
doesn't exist - Fix parsing of apt repos with multiple option values
- Rename
shell
global kwarg toshell_executable
! (server.user
usesshell
already) - Add
create_remote_dir
arg tofiles.put
,files.file
andfiles.link
- Add
update_submodules
andrecursive_submodules
args togit.repo
operation (@chrissinclair) - Add
name
args toserver.crontab
operation to allow changing of the command - Add global
shell_exectuable
kwarg to all operations, defaults tosh
as before
- Improve parsing of
ifconfig
fornetwork_devices
fact (@gchazot) - Make printing unicode consistent between Python 2/3
- Fix parsing Ansible inventories with left-padding in ranges
- Fix for Python 3 (use
six
>unicode
)
- Add
@docker
connector, to create docker images- eg:
pyinfra @docker/ubuntu:bionic deploy.py
- this will spawn a container, execute operations on it and save it as an image
- eg:
- Add
linux_name
"short" fact - Add
allow_downgrades
keyword argument toapt.packages
- [Experimental]: parse Ansible inventory files (ini format)
- Handle template errors in arguments better
- Capture/handle template syntax errors
- Rename
config.TIMEOUT
->config.CONNECT_TIMEOUT
(old deprecated) - Properly handle logging unicode output
- Fix execute
git fetch
before changing branch - Fix
find_in_file
fact for files with~
in the name
Internal changes:
- Remove the
AttrData
and allAttr*
classes now we have operation ordering
- Completely new operation ordering:
- different args will not generate imbalanced operations!
- no more deploy file compile needed
Internal changes:
- Inline
sshuserclient
package (original no longer maintained)
- Fix
deb_package
fact and don't assume we have a version inapt.deb
operation
- Add mysql module
- Operations:
mysql.sql
,mysql.user
,mysql.database
,mysql.privileges
,mysql.dump
,mysql.load
- Facts:
mysql_databases
,mysql_users
,mysql_user_grants
- Operations:
- Add postgresql module
- Operations:
postgresql.sql
,postgresql.role
,postgresql.database
,postgresql.dump
,postgresql.load
- Facts:
postgresql_databases
,postgresql_roles
- Operations:
- Add puppet module with
puppet.agent
operation (@tobald) - Add
server.crontab
,server.modprobe
andserver.hostname
operations - Add
git.config
operation - Add
kernel_modules
,crontab
andgit_config
facts - Add global install virtualenv support (like iPython)
- Massively improved progress bar which highlights remaining hosts and tracks progress per operation or fact
- Improved SSH config parsing, including proxyjump support (@tobald)
- Support for CONFIG variables defined in
local.include
files - Fix
command
fact now outputs everything not just the first line
Internal changes:
- Replace
--debug-state
with--debug-operations
and--debug-facts
- pyinfra now compiles the top-level scope of deploy code, meaning if statements no longer generate imbalanced operations
- This means the recommendations to use
state.when
in place of conditional statements is invalid - Updated the warning shown, now once, with a link
- Included a test
deploy_branches.py
which can be used to verify operations do run in order for each host when compile is disabled - Compiling can be disabled by setting
PYINFRA_COMPILE=off
environment variable
- This means the recommendations to use
- Deprecate
state.limit
and replace withstate.hosts(hosts)
(consistency with global operation kwarghosts
notlimit
) - Major internal refactor of
AttrData
handling to reduce operation branching:- Generate
AttrData
on creation, rather than read - Add nesting support for
AttrData
sohost.data.thing['X']
will not create branching operations - Turn fact data into
AttrData
- Make
host.name
anAttrDataStr
- Hash
True
,False
andNone
constants as the same so they can change between hosts without branching operations - Update docs and warning on operation branching
- Generate
- Better default for pool parallel size
- Show stdout if stderr is empty on command failure (surprisingly common)
- Fix file "uploading" for the
@local
connector
- Make
--limit
apply the limit similarly tostate.limit
- makes it possible to execute facts on hosts outside the
--limit
--limit
no longer alters the inventory, instead provides an "initial" state limit
- makes it possible to execute facts on hosts outside the
- Add
when=True
kwarg tolocal.include
- Make it possible to add
data
to individual hosts in@vagrant.json
configuration files - Add
memory
andcpus
facts - Refactor how we track host state throughout deploy
- Refactor facts to only gather missing ones (enabling partial gathering)
- Improve check for valid
/etc/init.d/
services by looking for LSB header - Fix boolean constant detection with AST in Python3
- Fix parsing ls output where
setgid
is set - Fix sudo/su file uploads with the
@local
connector
- Fix writing unicode data with
@local
- Capture
IOError
s when SFTPing, note where remote disks might be full - Properly serialise
Host
objects for--debug-state
- Add
exclude_dir
andadd_deploy_dir
kwargs tofiles.sync
- Add pipfile for dev
- Fix
files.put
when using@local
- Make environment variables stick between multiple commands
- Fix npm packages fact missing a return(!)
What was originally a module release for pyinfra (see the 0.6 milestone!) has become all about proper conditional branching support (previously resulted in best-effort/guess operation order) and improving 0.4's initial @deploy
concept:
- Add global
when
kwarg to all operations, similar tohosts
can be used to prevent operations executing on hosts based on a condition - Add
state.limit(hosts)
andstate.when(condition)
context managers to use in place ofif
statements within deploys @deploy
s and the context managers (state.limit
,state.when
) can all be nested as much as needed (although if you need to nest a lot, you're probably doing it wrong!)- Add
data_defaults
kwarg to@deploy
functions, meaning third party pyinfra packages can provide sensible defaults that the user can override individually - Display a large warning when imbalanced branches are detected, linking the user to the documentation for the above
Note that if statements/etc still work as before but pyinfra will print out a warning explaining the implications and linking to the docs (http://pyinfra.readthedocs.io/page/using_python.html#conditional-branches).
- Vagrant connector:
# Run a deploy on all Vagrant machines (vagrant status list)
pyinfra @vagrant deploy.py
pyinfra @vagrant/vm_name deploy.py
# Can be used in tandem with other inventory:
pyinfra @vagrant,my-host.net deploy.py
pyinfra @vagrant,@local,my-host.net fact os
- Hooks broken: no longer loaded from deploy files, only from
config.py
, due to changes from0.4
(removal ofFakeState
nonsense) - Add
gpgkey
argument to theyum.repo
operation - Add
lsb_release
fact apt_sources
fact now supports apt repos with options ([arch=amd64]
)- Improved error output when connecting
- Update testing box from Ubuntu 15 to Ubuntu 16
- Ensure
~/.ssh
exists keyscanning inssh.keyscan
- Don't include tests during setup!
- Fix caching of local SHA1s on files
- Add
vzctl.unmount
operation (missing from 0.4!) - Add script to generate empty test files
- Increase module test coverage significantly
- Fix incorrect args in
vzctl.restart
operation - Fix
save=False
kwarg onvzctl.set
not affecting command output (always saved) - Fix
gem.packages
install command
- Major change: entirely new, streamlined CLI. Legacy support will remain for the next few releases. Usage is now:
# Run one or more deploys against the inventory
pyinfra INVENTORY deploy_web.py [deploy_db.py]...
# Run a single operation against the inventory
pyinfra INVENTORY server.user pyinfra,home=/home/pyinfra
# Execute an arbitrary command on the inventory
pyinfra INVENTORY exec -- echo "hello world"
# Run one or more facts on the inventory
pyinfra INVENTORY fact linux_distribution [users]...
- Major addition: new
connectors
module that means hosts are no longer limited to SSH targets. Hostnames prefixed in@
define which non-SSH connector to use. There is a newlocal
connector for executing directly on the local machine, use hostname@local
, eg:
pyinfra @local fact arch
- Major addition: add
@deploy
wrapper for pyinfra related modules (eg pyinfra-openstack) to wrap a deploy (collection of operations) under one function, eg:
from pyinfra.api import deploy
from pyinfra.modules import apt
@deploy('Install Openstack controller')
def install_openstack_controller(state, host):
apt.packages(
state, host,
{'Install openstack-client'},
['openstack-client'],
)
- Add SSH module to execute SSH from others hosts:
ssh.keyscan
,ssh.command
,ssh.upload
,ssh.download
- Add vzctl module to manage OpenVZ containers:
vzctl.create
,vzctl.stop
,vzctl.start
,vzctl.restart
,vzctl.delete
,vzctl.set
- Add
on_success
andon_error
callbacks to all operations (args =(state, host, op_hash)
) - Add
server.script_template
operation - Add global
hosts
kwarg to all operations, working likelocal.include
's - Add
cache_time
kwarg toapt.update
operation - Add
Inventory.get_group
andInventory.get_host
- Inventory
__len__
now (correctly) looks at active hosts, rather than all - Add
Inventory.len_all_hosts
to replace above bug/qwirk - Add progress spinner and % indicator to CLI
- Replace
docopt
/termcolor
withclick
- Moved
pyinfra.cli
topyinfra_cli
(internal breaking) - Switch to setuptools
entry_points
instead of distutils scripts - Expand Travis.ci testing to Python 3.6 and 3.7 nightly
- Remove unused kwargs (
sudo
,sudo_user
,su_user
) frompyinfra.api.facts.get_facts
To-be-breaking changes (deprecated):
- Deprecate
add_limited_op
function, usehosts
kwarg onadd_op
- Deprecate group access via attribute and host access via index on
Inventory
Inventory.get_group
andinventory.get_host
replace
- Add
init.service
operation - Add
config.MIN_PYINFRA_VERSION
- Add
daemon_reload
toinit.systemd
- Add
pip
path topip.packages
(@hoh) - Add
virtualenv_kwargs
topip.packages
- Add
socket
fact - Display meta and results in groups
- Fact arguments now parsed with jinja2 like operation args
- Use full dates in
file
,directory
andlink
facts - Improve
--run
check between operation and/or shell - Improve tests with facts that have multiple arguments
- Fix how
pip.packages
handles pip path - Fix
yum.rpm
when downloading already installed rpm's - Fix
users
fact with users that have no home directory - Fix command overrides with dict objects (git.repo)
- Removed compatibility for deprecated changes in v0.2
- Fix bug in parsing of network interfaces
- Fix
--limit
with a group name
- Use wget & pipe when adding apt keys via URL, rather than
apt-key adv
which breaks with HTTPs - Fix bug where file-based group names were uppercased incorrectly (ie dev.py made group DEV, rather than dev)
New stuff:
- Add LXD facts/module
- Add iptables facts/module
- Support usernames with non-standard characters (_, capitals, etc)
- Add global
get_pty
kwarg for all operations to work with certain dodgy programs - Add
--fail-percent
CLI arg - Add
exclude
kwarg tofiles.sync
- Enable
--limit
CLI arg to be multiple, comma separated, hostnames - Add
no_recommends
kwarg toapt.packages
operation - Make local imports work like calling
python
by adding.
tosys.path
in CLI - Add key/value release meta to
linux_distribution
fact - Improve how the init module handles "unknown" services
- Add
force
kwarg toapt.packages
andapt.deb
and don't--force-yes
by default
To-be-breaking changes (deprecated):
- Switch to lowercase inventory names (accessing
inventory.bsd
where the group is defined asBSD = []
is deprecated) - Rename
yum.upgrade
->yum.update
(yum.upgrade
deprecated) - Deprecate
pip_virtualenv_packages
fact aspip_packages
will now accept an argument for the virtualenv - Deprecate
npm_local_packages
fact asnpm_packages
will accept an argument for the directory
Internal changes:
- Operations now
yield
, rather than returning lists of commands
- Fix
--run
arg parsing splutting up[],
- Enable passing of multiple, comma separated hosts, as inventory
- Use
getpass
, notraw_input
for collecting key passwords in CLI mode
- Fix issue when removing users that don't exist
- Improve private key error handling
- Ask for encrypted private key passwords in CLI mode
- Don't generate set groups when
groups
is an empty list inserver.user
.
- First versioned release, start of changelog
- Full docs @ pyinfra.readthedocs.io
- Core API with CLI built on top
- Two-step deploy (diff state, exec commands)
- Compatibility tested w/Ubuntu/CentOS/Debian/OpenBSD/Fedora
- Modules/facts implemented:
- Apt
- Files
- Gem
- Git
- Init
- Npm
- Pip
- Pkg
- Python
- Server
- Yum