Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def virtualenv(
state, host, path,
python=None, site_packages=False, always_copy=False, present=True,
):
'''
Add/remove Python virtualenvs.
+ python: python interpreter to use
+ site_packages: give access to the global site-packages
+ always_copy: always copy files rather than symlinking
+ present: whether the virtualenv should exist
'''
if present is False and host.fact.directory(path):
yield files.directory(state, host, path, present=False)
elif present and not host.fact.directory(path):
# Create missing virtualenv
command = ['virtualenv']
if python:
command.append('-p {0}'.format(python))
if site_packages:
command.append('--system-site-packages')
if always_copy:
command.append('--always-copy')
command.append(path)
path, python=None, site_packages=False, always_copy=False,
present=True,
):
'''
Manage virtualenv.
+ python: python interpreter to use
+ site_packages: give access to the global site-packages
+ always_copy: always copy files rather than symlinking
+ present: whether the virtualenv should be installed
'''
if present is False and host.fact.directory(path):
# Ensure deletion of unwanted virtualenv
# no 'yield from' in python 2.7
yield files.directory(state, host, path, present=False)
elif present and not host.fact.directory(path):
# Create missing virtualenv
command = ['/usr/bin/virtualenv']
if python:
command.append('-p {}'.format(python))
if site_packages:
command.append('--system-site-packages')
if always_copy:
command.append('--always-copy')
command.append(path)
yield ' '.join(command)
def keyscan(state, host, hostname, force=False):
'''
Check/add hosts to the ``~/.ssh/known_hosts`` file.
+ hostname: hostname that should have a key in ``known_hosts``
+ force: if the key already exists, remove and rescan
'''
yield files.directory(
state, host,
'~/.ssh',
mode=700,
)
hostname_present = host.fact.find_in_file(
'~/.ssh/known_hosts',
hostname,
)
keyscan_command = 'ssh-keyscan {0} >> ~/.ssh/known_hosts'.format(hostname)
if not hostname_present:
yield keyscan_command
elif force:
if args:
yield 'usermod {0} {1}'.format(' '.join(args), name)
# Ensure home directory ownership
if ensure_home:
yield files.directory(
state, host, home,
user=name, group=name,
)
# Add SSH keys
if public_keys is not None:
# Ensure .ssh directory
# note that this always outputs commands unless the SSH user has access to the
# authorized_keys file, ie the SSH user is the user defined in this function
yield files.directory(
state, host,
'{0}/.ssh'.format(home),
user=name, group=name,
mode=700,
)
filename = '{0}/.ssh/authorized_keys'.format(home)
if delete_keys:
# Create a whole new authorized_keys file
keys_file = six.StringIO('{0}\n'.format(
'\n'.join(public_keys),
))
# And ensure it exists
yield files.put(
This is an old hack from pyinfra <0.4 which did not support the global
kwarg ``preserve_sudo_env``. It does the following:
* makes the target directory writeable by all
* clones/pulls w/o sudo as the connecting SSH user
* removes other/group write permissions - unless group is defined, in
which case only other
'''
if use_ssh_user:
logger.warning(
'Use of `use_ssh_user` is deprecated, please use `preserve_sudo_env` instead.',
)
# Ensure our target directory exists
yield files.directory(state, host, target)
# If we're going to chown this after clone/pull, and we're sudo'd, we need to make the
# directory writeable by the SSH user
if use_ssh_user:
yield chmod(target, 'go+w', recursive=True)
# Do we need to scan for the remote host key?
if ssh_keyscan:
# Attempt to parse the domain from the git repository
domain = re.match(r'^[a-zA-Z0-9]+@([0-9a-zA-Z\.\-]+)', source)
if domain:
yield ssh.keyscan(state, host, domain.group(1))
else:
raise OperationError(
'Could not parse domain (to SSH keyscan) from: {0}'.format(source),
# Check primary group
if group and user['group'] != group:
args.append('-g {0}'.format(group))
# Check secondary groups, if defined
if groups and set(user['groups']) != set(groups):
args.append('-G {0}'.format(','.join(groups)))
# Need to mod the user?
if args:
yield 'usermod {0} {1}'.format(' '.join(args), name)
# Ensure home directory ownership
if ensure_home:
yield files.directory(
state, host, home,
user=name, group=name,
)
# Add SSH keys
if public_keys is not None:
# Ensure .ssh directory
# note that this always outputs commands unless the SSH user has access to the
# authorized_keys file, ie the SSH user is the user defined in this function
yield files.directory(
state, host,
'{0}/.ssh'.format(home),
user=name, group=name,
mode=700,
)
'pyinfra2',
sudo=True,
)
# Ensure the state of files
files.file(
{'Ensure pyinfra.log exists'},
'/var/log/pyinfra.log',
user='pyinfra',
group='pyinfra',
mode=644,
sudo=True,
)
# Ensure the state of directories
files.directory(
{'Ensure {{ host.data.env_dir }} exists exists'},
host.data.env_dir,
user='pyinfra',
group='pyinfra',
mode=755,
sudo=True,
)
hosts=inventory.get_group('centos'),
)
# Ensure the state of files
add_op(
state, files.file,
'/var/log/pyinfra.log',
user='pyinfra',
group='pyinfra',
mode='644',
sudo=True,
)
# Ensure the state of directories
add_op(
state, files.directory,
'/tmp/email',
user='pyinfra',
group='pyinfra',
mode='755',
sudo=True,
)
# Copy local files to remote host
add_op(
state, files.put,
'files/file.txt', '/home/vagrant/file.txt',
)
# And finally we run the ops
run_ops(state)