def install_horizon_service(state, host): apt.packages( {'Install openstack-dashboard'}, ['openstack-dashboard'], ) generate_horizon_config = files.template( state, host, {'Generate horizon config'}, get_template_path('local_settings.py.j2'), '/etc/openstack-dashboard/local_settings.py', ) server.shell( state, host, {'Give www-data access to the secret key'}, 'chown www-data /var/lib/openstack-dashboard/secret_key', ) init.service( state, host, {'Restart apache2'}, 'apache2', restarted=generate_horizon_config.changed, )
def install_controller_services(state, host): apt.packages( state, host, {'Install packages'}, [ 'apache2', 'mariadb-server', 'rabbitmq-server', 'memcached', 'python-memcache', 'python-pymysql', ], ) # MariaDB mariadb_configure = files.template( state, host, {'Generate MariaDB config'}, get_template_path('mysql.cnf.j2'), '/etc/mysql/mariadb.conf.d/99-openstack.cnf', ) init.service( state, host, {'Restart MariadB'}, 'mysql', restarted=mariadb_configure.changed, ) # RabbitMQ server.shell( state, host, {'Setup RabbitMQ user'}, ( 'rabbitmqctl add_user openstack {{ host.data.rabbitmq_password }} || true', 'rabbitmqctl set_permissions openstack ".*" ".*" ".*"', ), ) # Memcached memcached_configure = files.template( state, host, {'Generate memcached config'}, get_template_path('memcached.conf.j2'), '/etc/memcached.conf', ) init.service( state, host, {'Restart memcached'}, 'memcached', restarted=memcached_configure.changed, )
def install_glance_service(state, host): install_glance = apt.packages( state, host, {'Install glance'}, ['glance'], ) if install_glance.changed: create_database(state, host, 'glance') create_service_user(state, host, 'glance', 'image') create_service_endpoints(state, host, 'image', ':9292') generate_glance_api_config = files.template( state, host, {'Generate glance-api config'}, get_template_path('glance-api.conf.j2'), '/etc/glance/glance-api.conf', ) generate_glance_registry_config = files.template( state, host, {'Generate glance-registry config'}, get_template_path('glance-registry.conf.j2'), '/etc/glance/glance-registry.conf', ) server.shell( state, host, {'Sync the glance database'}, 'glance-manage db_sync', ) should_restart_glance = (generate_glance_api_config.changed or generate_glance_registry_config.changed) init.service( state, host, {'Restart glance-registry'}, 'glance-registry', restarted=should_restart_glance, ) init.service( state, host, {'Restart glance-api'}, 'glance-api', restarted=should_restart_glance, )
def install_neutron_service(state, host, nova=False, placement=False): create_database(state, host, 'neutron') neutron_install = apt.packages( state, host, {'Install neutron network controller packages'}, [ 'neutron-server', 'neutron-plugin-ml2', ], ) if neutron_install.changed: create_service_user(state, host, 'neutron', 'network') create_service_endpoints(state, host, 'network', ':9696') neutron_configure = files.template( state, host, {'Generate neutron config'}, get_template_path('neutron-controller.conf.j2'), '/etc/neutron/neutron.conf', nova=nova, ) ml2_plugin_configure = files.template( state, host, {'Generate neutron ml2 plugin config'}, get_template_path('ml2_conf.ini.j2'), '/etc/neutron/plugins/ml2/ml2_conf.ini', ) server.shell( {'Sync the neutron database'}, ''' neutron-db-manage --config-file /etc/neutron/neutron.conf \ --config-file /etc/neutron/plugins/ml2/ml2_conf.ini \ upgrade head ''', ) init.service( state, host, {'Restart neutron-server'}, 'neutron-server', restarted=neutron_configure.changed or ml2_plugin_configure.changed, )
def install_ceilometer_service(state, host): ceilometer_install = apt.packages( state, host, {'Install ceilometer controller packages'}, [ 'ceilometer-collector', 'ceilometer-agent-central', 'ceilometer-agent-notification', 'python-ceilometerclient', ], ) if ceilometer_install.changed: create_service_user(state, host, 'ceilometer', 'metering') create_service_user(state, host, 'gnocchi', 'metric') create_service_endpoints(state, host, 'metric', ':8041') ceilometer_configure = files.template( state, host, {'Generate ceilometer config'}, get_template_path('ceilometer-controller.conf.j2'), '/etc/ceilometer/ceilometer.conf', ) # server.shell( # state, host, # {'Create ceilometer resoucres in gnocchi'}, # 'ceilometer-upgrade --skip-metering-database', # ) for service in ( 'ceilometer-agent-central', 'ceilometer-agent-notification', 'ceilometer-collector', ): init.service( state, host, {'Restart {0}'.format(service)}, service, restarted=ceilometer_configure, )
def install_nova_node(state, host, neutron=False, placement=False, ceilometer=False): apt.packages( state, host, {'Install nova-compute'}, ['nova-compute'], ) files.put( {'Upload interface.j2'}, get_template_path('interfaces.j2'), '/etc/nova/interfaces.j2', ) nova_configure = files.template( state, host, {'Generate nova config'}, get_template_path('nova-node.conf.j2'), '/etc/nova/nova.conf', neutron=neutron, placement=placement, ceilometer=ceilometer, ) nova_compute_configure = files.template( state, host, {'Generate nova-compute config'}, get_template_path('nova-compute.conf.j2'), '/etc/nova/nova-compute.conf', ) init.service( state, host, {'Restart nova-compute'}, 'nova-compute', restarted=nova_configure.changed or nova_compute_configure.changed, )
def install_ceilometer_agent(state, host): apt.packages( {'Install ceilometer-agent-compute'}, 'ceilometer-agent-compute', ) ceilometer_configure = files.template( state, host, {'Generate ceilometer config'}, get_template_path('ceilometer-node.conf.j2'), '/etc/ceilometer/ceilometer.conf', ) init.service( state, host, {'Restart ceilometer-agent-compute'}, 'ceilometer-agent-compute', restarted=ceilometer_configure.changed, )
def install_chrony_node(state, host): apt.packages( state, host, {'Install chrony'}, ['chrony'], ) generate_chrony_config = files.template( state, host, {'Generate chrony config'}, get_template_path('chrony-node.conf.j2'), '/etc/chrony/chrony.conf', ) init.service( state, host, {'Restart chrony'}, 'chrony', restarted=generate_chrony_config.changed, )
def _install_agent(state, host, agent_name, template_name, config_path): install = apt.packages( state, host, {'Install {0} package'.format(agent_name)}, [agent_name], ) configure = files.template( state, host, {'Generate neutron {0} agent config'.format(agent_name)}, get_template_path(template_name), config_path, ) init.service( state, host, {'Restart {0}'.format(agent_name)}, agent_name, restarted=install.changed or configure.changed, )
def on_pyinfra_success(state, host, op_hash): print('Success on {0} for OP: {1}!'.format(host.name, op_hash)) def on_pyinfra_error(state, host, op_hash): print('Error on {0} for OP: {1}!'.format(host.name, op_hash)) # Manage init systems init.service( {'Ensure cron service with error callback'}, 'cron', running=True, sudo=True, ignore_errors=True, on_success=on_pyinfra_success, on_error=on_pyinfra_error, ) # Execute Python locally, mid-deploy def some_python(state, host, *args, **kwargs): print('connecting host name: {0}, actual: {1}'.format( host.name, host.fact.hostname)) local.shell('echo "local stuff!"') python.call( {'Execute some_python function'},
from pyinfra.modules import init SUDO = True init.d( {'Restart and enable rsyslog'}, 'rsyslog', restarted=True, enabled=True, ) init.d_enable( {'Finer control on which runlevels rsyslog should run'}, 'rsyslog', start_levels=(3, 4, 5), stop_levels=(0, 1, 2, 6), ) init.service( {'Enable open-vm-tools service'}, 'open-vm-tools', enabled=True, )
from pyinfra.modules import init from pyinfra_docker import deploy_docker SUDO = True deploy_docker(config={ 'dns': ['8.8.8.8', '8.8.4.4'], 'debug': True, }) init.service( 'docker', running=True, )
def install_nova_service(state, host, neutron=False, placement=False): create_database(state, host, 'nova') create_database(state, host, 'nova_api', name='nova') create_database(state, host, 'nova_cell0', name='nova') packages = [ 'nova-api', 'nova-conductor', 'nova-consoleauth', 'nova-novncproxy', 'nova-scheduler', ] if placement: packages.append('nova-placement-api') nova_install = apt.packages( state, host, {'Install nova compute controller packages'}, packages, ) if nova_install.changed: create_service_user(state, host, 'nova', 'compute') create_service_endpoints(state, host, 'compute', ':8774/v2.1/%\(tenant_id\)s') if packages: create_service_user(state, host, 'placement', 'placement') create_service_endpoints(state, host, 'placement', ':8778') nova_configure = files.template( state, host, {'Generate nova config'}, get_template_path('nova-controller.conf.j2'), '/etc/nova/nova.conf', neutron=neutron, placement=placement, ) server.shell( state, host, {'Sync the nova api database'}, 'nova-manage api_db sync', ) if nova_install.changed: server.shell( state, host, {'Setup nova cells and sync db'}, ( 'nova-manage cell_v2 map_cell0', 'nova-manage cell_v2 create_cell --name=cell1 --verbose', ), ) server.shell( state, host, {'Sync the nova database'}, 'nova-manage db sync', ) for service in ( 'nova-api', 'nova-consoleauth', 'nova-scheduler', 'nova-conductor', 'nova-novncproxy', ): init.service( state, host, {'Restart {0}'.format(service)}, service, restarted=nova_configure.changed, )
# Execute arbitrary shell commands server.shell([ 'echo "Shell command"', 'echo "My hostname is {{ host.fact.hostname }}"', ]) # and scripts server.script( 'files/test.sh', ) # Manage init systems init.service( 'cron', running=True, sudo=True, ignore_errors=True, on_error=on_pyinfra_error, ) # Include other files local.include( 'tasks/bsd_python.py', hosts=inventory.get_group('bsd', []), ) # Work with facts about the remote host # Storing this fact to avoid typing it so much (because the example targets a whole bunch # of distros [& 2 OSs]). distro = host.fact.linux_distribution
def install_keystone_service(state, host): create_database(state, host, 'keystone') keystone_install = apt.packages( state, host, {'Install keystone'}, ['keystone'], ) files.template( state, host, {'Generate keystone config'}, get_template_path('keystone.conf.j2'), '/etc/keystone/keystone.conf', ) server.shell( state, host, {'Sync the keystone database'}, 'keystone-manage db_sync', ) # Bootstrap keystone: only do this if newly installed if keystone_install.changed: server.shell( state, host, ''' keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone keystone-manage credential_setup --keystone-user keystone --keystone-group keystone keystone-manage bootstrap \ --bootstrap-password {{ host.data.admin_password }} \ --bootstrap-admin-url http://{{ host.data.controller_host }}:35357/v3/ \ --bootstrap-internal-url http://{{ host.data.controller_host }}:35357/v3/ \ --bootstrap-public-url http://{{ host.data.controller_host }}:5000/v3/ \ --bootstrap-region-id RegionOne ''') update_apache_config = files.line( state, host, {'Set ServerName in apache2 config'}, '/etc/apache2/apache2.conf', 'ServerName.*', replace='ServerName {{ host.data.ssh_hostname }}', ) init.service( state, host, {'Restart apache2'}, 'apache2', restarted=update_apache_config.changed, ) if keystone_install.changed: server.shell( state, host, {'Create initial projects/users/roles'}, ( 'openstack project create --domain default service', 'openstack project create --domain default user', 'openstack user create --domain default --password hamble user-1', 'openstack role create user', 'openstack role add --project user --user user-1 user', ), env=make_admin_env(host), )
linux_id = host.fact.linux_distribution['release_meta'].get('ID') code_name = host.fact.linux_distribution['release_meta'].get( 'DISTRIB_CODENAME') print(linux_id, code_name) apt.repo( {'Add the Docker CE apt repo'}, ('deb [arch=amd64] https://download.docker.com/linux/' '{} ' '{} stable'.format(linux_id, code_name)), filename='docker-ce-stable', ) apt.packages( {'Ensure Docker CE is installed'}, [ 'docker-ce', 'docker-ce-cli', 'containerd.io', ], update=True, ) init.service( {'Ensure docker service is running'}, 'docker', running=True, enabled=True, ) python.call(check_docker_works)