def register_image(self): """ trove images for ubuntu http://tarballs.openstack.org/trove/images/ubuntu/ building guest images http://docs.openstack.org/developer/trove/dev/building_guest_images.html ``` git clone https://github.com/openstack/trove-integration git clone https://github.com/openstack/tripleo-image-elements.git export PATH_TRIPLEO_ELEMENTS=$PWD/tripleo-image-elements export REDSTACK_SCRIPTS=$PWD/trove-integration/scripts export DIB_CLOUD_INIT_DATASOURCES="ConfigDrive" export ELEMENTS_PATH=$REDSTACK_SCRIPTS/files/elements:$PATH_TRIPLEO_ELEMENTS/elements disk-image-create -a amd64 -o ./ubuntu-percona.qemu ubuntu vm heat-cfntools \ cloud-init-datasources ubuntu-guest ubuntu-mysql ``` """ glance = Glance() image_id = glance.create_image( 'trove_mysql', 'http://tarballs.openstack.org/trove/images/ubuntu/mysql.qcow2') sudo("/opt/trove/bin/trove-manage --config-file /etc/trove/trove.conf datastore_update mysql ''") # noqa sudo("/opt/trove/bin/trove-manage --config-file /etc/trove/trove.conf datastore_version_update mysql mysql-5.6 mysql {0} '' 1".format(image_id)) # noqa
def setup_prepare(self): if self.is_tag('package'): if env.node['package_manager'] == 'yum': filer.template('/etc/yum.repos.d/mariadb.repo') self.init_package_manager() self.install_packages() sudo('setenforce 0')
def touch(dest, is_local=False, owner='root:root', mode='775'): cmd_touch = 't={0} && touch $t'.format(dest) if is_local or env.is_local: cmd(cmd_touch) else: sudo('{0} && chmod {1} $t && chown {2} $t'.format( cmd_touch, mode, owner))
def setup(self): data = self.init() if self.is_tag('package'): self.python.setup() self.python.setup_package(**self.package) if self.is_tag('conf'): # setup conf files filer.template( '/etc/rally/rally.conf', src='{0}/rally.conf.j2'.format(data['version']), data=data, ) filer.template( '/etc/rally/rally-existing.json', src='{0}/rally-existing.json.j2'.format(data['version']), data=data, ) if self.is_tag('data') and env.host == env.hosts[0]: sudo('rally deployment list | grep {0} || ' 'rally deployment create --file=/etc/rally/rally-existing.json --name={0}'.format( env.cluster['keystone']['service_region']))
def enable_nova_services(self): result = sudo("nova-manage service list 2>/dev/null | grep disabled | awk '{print $1,$2}'") services = result.split('\r\n') services = map(lambda s: s.split(' '), services) for service in services: sudo("nova-manage service enable --service {0} --host {1}".format( service[0], service[1]))
def install(self, option=''): with api.warn_only(): if env.node['package_manager'] == 'yum': self.result = run('rpm -q {0}'.format(self.package_name)) if not self.result.return_code == 0: if self.path: self.result = sudo('yum install {0} -y {1}'.format(self.path, option)) else: self.result = sudo('yum install {0} -y {1}'.format( self.package_name, option)) elif env.node['package_manager'] == 'apt': self.result = run('dpkg -l {0} | grep "^ii "'.format(self.package_name)) if not self.result.return_code == 0: if self.path: self.result = sudo('apt-get install {0} -y {1}'.format(self.path, option)) else: self.result = sudo('apt-get install {0} -y {1}'.format( self.package_name, option)) else: self.unsupport() print self.result if self.result.return_code != 0: msg = 'Failed install {0}.'.format(self.package_name) log.error(msg) raise Exception(msg) return self
def mount_local(self): data = self.init() for volume in data['volume_map'].values(): filer.Editor('/etc/fstab').a('localhost:/{0} /mnt/{0} glusterfs ' 'defaults,_netdev 0 0'.format(volume['name'])) filer.mkdir('/mnt/{0}'.format(volume['name'])) sudo('mount -a')
def setup(self): data = self.init() if self.is_tag('package'): self.python.setup() self.python.setup_package(**self.package) if self.is_tag('conf'): # setup conf files is_updated = filer.template( '/etc/heat/heat.conf', src='{0}/heat.conf.j2'.format(data['version']), data=data, ) if self.is_tag('data') and env.host == env.hosts[0]: utils.oscmd('/opt/heat/bin/heat-keystone-setup-domain \ --stack-user-domain-name {0} \ --stack-domain-admin {1} \ --stack-domain-admin-password {2}'.format( self.data['stack_user_domain_name'], self.data['stack_domain_admin'], self.data['stack_domain_admin_password'])) sudo('{0}/bin/heat-manage db_sync'.format(self.prefix)) if self.is_tag('conf', 'service'): self.enable_services().start_services(pty=False) if is_updated: self.restart_services(pty=False)
def setup(self): data = self.init() if self.is_tag('package'): self.python.setup() self.python.setup_package(**self.package) filer.mkdir(data['glance_store']['filesystem_store_datadir']) if self.is_tag('conf'): # setup conf files if filer.template( '/etc/glance/glance-api.conf', src='{0}/glance-api.conf.j2'.format(data['version']), data=data): self.handlers['restart_glance-api'] = True if filer.template( '/etc/glance/glance-registry.conf', src='{0}/glance-registry.conf.j2'.format(data['version']), data=data): self.handlers['restart_glance-registry'] = True if self.is_tag('data') and env.host == env.hosts[0]: sudo('{0}/bin/glance-manage db_sync'.format(self.prefix)) if self.is_tag('conf', 'service'): self.enable_services().start_services(pty=False) self.exec_handlers()
def setup(self): data = self.init() sudo('setenforce 0') self.install_packages() sudo("sh -c \"echo 'hacluster:{0}' |chpasswd\"".format(data['ha_password'])) Service('pcsd').start().enable()
def setup_pacemaker(self): data = self.init() if env.host == data['hosts'][0]: # stonith を無効化しておかないとresouceがスタートしない sudo('pcs property set stonith-enabled=false') sudo('pcs resource show vip || ' 'pcs resource create vip ocf:heartbeat:IPaddr2 ' 'ip="{0[vip]}" cidr_netmask="{0[cidr_netmask]}" ' 'op monitor interval="{0[monitor_interval]}s"'.format(data)) sudo( 'pcs resource show lb-haproxy || ' 'pcs resource create lb-haproxy systemd:haproxy --clone --force' ) sudo( 'pcs constraint order | grep "start vip then start lb-haproxy-clone" || ' 'pcs constraint order start vip then lb-haproxy-clone') sudo( 'pcs constraint colocation | grep "vip with lb-haproxy-clone" || ' 'pcs constraint colocation add vip with lb-haproxy-clone') is_change = filer.template('/etc/haproxy/haproxy.cfg', data=data) if env.host == data['hosts'][0] and is_change: Service('haproxy').reload() self.enable_services()
def setup(): sudo('setenforce 0') Editor('/etc/selinux/config').s('SELINUX=enforcing', 'SELINUX=disable') Service('firewalld').stop().disable() return {'status': 1}
def setup(self): data = self.init() if self.is_tag('package'): self.python.setup() self.python.setup_package(**self.package) if self.is_tag('conf'): is_updated = filer.template( '/etc/ceilometer/ceilometer.conf', src='{0}/ceilometer.conf.j2'.format(data['version']), data=data, ) is_updated = filer.template( '/etc/ceilometer/pipeline.yaml', src='{0}/pipeline.yaml'.format(data['version']), data=data, ) or is_updated if self.is_tag('data') and env.host == env.hosts[0]: sudo('{0}/bin/ceilometer-dbsync'.format(self.prefix)) if self.is_tag('conf', 'service'): self.enable_services().start_services(pty=False) if is_updated: self.restart_services(pty=False)
def file(dest, mode='644', owner='root:root', src=None, src_file=None, src_str=None, override=False): if src_str is not None: src_file = __create_src_file(dest, src_str) is_updated = False with api.warn_only(): if exists(dest) and not override: log.info('file "{0}" exists'.format(dest)) else: if not src_file: src_file = __get_src_file(dest, src_dirname='files', src=src) if env.is_local: sudo('cp {0} {1}'.format(src_file, dest)) else: scp(src_file, dest) is_updated = True sudo('chmod -R {0} {1}'.format(mode, dest) + ' && chown -R {0} {1}'.format(owner, dest)) return is_updated
def setup(self): data = self.init() if self.is_tag('package'): self.python.setup() self.python.setup_package(**self.package) if self.is_tag('conf'): # setup conf files if filer.template( '/etc/trove/trove.conf', src='{0}/trove.conf.j2'.format(data['version']), data=data): self.handlers['restart_trove-*'] = True if filer.template( '/etc/trove/trove-taskmanager.conf', src='{0}/trove-taskmanager.conf.j2'.format(data['version']), data=data): self.handlers['restart_trove-*'] = True if filer.template( '/etc/trove/trove-guestagent.conf', src='{0}/trove-guestagent.conf.j2'.format(data['version']), data=data): self.handlers['restart_trove-*'] = True if self.is_tag('data') and env.host == env.hosts[0]: sudo('{0}/bin/trove-manage db_sync'.format(self.prefix)) self.register_image() if self.is_tag('conf', 'service'): self.enable_services().start_services(pty=False) self.exec_handlers()
def setup(): git.setup() sudo('rm -rf /tmp/git') git.sync('https://github.com/fabrickit-fablib/git.git') git.sync('https://github.com/fabrickit-fablib/git.git', dest='/tmp/git') git.sync('https://github.com/fabrickit-fablib/git.git', dest='/tmp/git') git.sync('https://github.com/fabrickit-fablib/git.git', dest='/tmp/git-sudo', use_sudo=True) git.sync('https://github.com/fabrickit-fablib/git.git', dest='/tmp/git-sudo', use_sudo=True)
def mkdir(dest, is_local=False, owner='root:root', mode='775', use_sudo=True): cmd_mkdir = 't={0} && mkdir -p $t'.format(dest) if is_local or env.is_local: cmd(cmd_mkdir) elif use_sudo: sudo('{0} && chmod {1} $t && chown {2} $t'.format(cmd_mkdir, mode, owner)) else: run('{0} $t'.format(cmd_mkdir, mode, owner))
def add(name, group=None): with api.warn_only(): passwd = run('cat /etc/passwd | grep ^{0}:'.format(name)) if passwd.return_code != 0: sudo('useradd {0} -M -s/bin/false'.format(name)) if group is not None: sudo('gpasswd -add {0} {1}'.format(name, group))
def mount_local(self): data = self.init() for volume in data["volume_map"].values(): filer.Editor("/etc/fstab").a( "localhost:/{0} /mnt/{0} glusterfs " "defaults,_netdev 0 0".format(volume["name"]) ) filer.mkdir("/mnt/{0}".format(volume["name"])) sudo("mount -a")
def add(name, gid=None): with api.warn_only(): getent = sudo('getent group | grep ^{0}:'.format(name)) if getent.return_code != 0: if gid is None: sudo('groupadd {0}'.format(name)) else: sudo('groupadd -g {0} {1}'.format(gid, name))
def sql(self, query): self.init() if self.is_ubuntu(): return sudo( 'mysql -uroot ' '-p`grep ^password /root/.my.cnf | head -1 | awk \'{{print $3}}\'` ' '-e"{0}"'.format(query)) else: return sudo('mysql -uroot ' '-e"{0}"'.format(query))
def start(self, targets=None): if targets is not None: self.targets = targets filer.mkdir(CONF._remote_stats_dir) dstat_csv = CONF._remote_stats_dir + '/dstat.csv' dstat_out = CONF._remote_stats_dir + '/dstat.out' sudo("rm -rf {0}".format(dstat_csv)) sudo("sh -c 'dstat -tTlpyirdfmsgn --tcp --socket --vm --lock --aio --fs --ipc --output {0} > {1} &'".format(dstat_csv, dstat_out), pty=False)
def setup_peer(self): """ require serial task. """ data = self.init() for host in data["hosts"]: if host != env.host: sudo("gluster peer probe {0}".format(host))
def setup_peer(self): """ require serial task. """ data = self.init() for host in data['hosts']: if host != env.host: sudo('gluster peer probe {0}'.format(host))
def setup(): print '{0}: hello'.format(env.host) print env.cluster run('hostname') sudo('hostname') Package('memcached').install() Service('memcached').start() # run('touch /tmp/test') filer.file('/etc/memcached.conf') filer.template('/etc/memcached.conf')
def append(self, txt, start=None, end=None): # TODO 正規表現による行指定も冪等性持ってできるようにする if start: if end: if type(start) is IntType: result_start = sudo('sed -n "{0}p" {1}'.format( start + 1, self.file_path)) result_end = sudo('sed -n "{0}p" {1}'.format( end + 1, self.file_path)) if result_start != txt and result_end != txt: sudo('sed -i "{0},{1}a {2}" {3}'.format( start, end, txt, self.file_path)) else: if type(start) is IntType: result = sudo('sed -n "{0}p" {1}'.format( start + 1, self.file_path)) if result != txt: sudo('sed -i "{0}a {1}" {2}'.format( start, txt, self.file_path)) else: sudo('grep "{0}" {1} || echo "{0}" >> {1}'.format( txt, self.file_path)) return self
def setup(self): data = self.init() if RE_CENTOS.match(env.node['os']): sudo('setenforce 0') self.install_packages() filer.mkdir('/var/log/corosync') Service('haproxy').disable() sudo("sh -c \"echo 'hacluster:{0}' |chpasswd\"".format( data['ha_password'])) Service('pcsd').start().enable()
def wrap_cmd(self, option, **kwargs): with api.warn_only(): service_manager = env.node['service_manager'] if service_manager == 'systemd': self.result = sudo('systemctl {0} {1}'.format(option, self.name), **kwargs) elif service_manager == 'service': self.result = sudo('/etc/init.d/{1} {0}'.format(option, self.name), **kwargs) elif service_manager == 'upstart': self.result = sudo('initctl {0} {1}'.format(option, self.name), **kwargs) else: self.unsupport() return self
def setup(self): data = self.init() if self.is_tag('package'): self.install_packages() self.python.setup() self.python.setup_package(**self.package) if self.is_tag('conf'): # setup conf files if filer.template( '/etc/swift/swift.conf', src='{0}/swift/swift.conf.j2'.format(data['version']), data=data): self.handlers['restart_swift-proxy-server'] = True if filer.template( '/etc/swift/proxy-server.conf', src='{0}/swift/proxy-server.conf.j2'.format(data['version']), data=data): self.handlers['restart_swift-proxy-server'] = True if filer.template( '/etc/swift/account-server.conf', src='{0}/swift/account-server.conf.j2'.format(data['version']), data=data): self.handlers['restart_swift-account-server'] = True if filer.template( '/etc/swift/container-server.conf', src='{0}/swift/container-server.conf.j2'.format(data['version']), data=data): self.handlers['restart_swift-container-server'] = True if filer.template( '/etc/swift/object-server.conf', src='{0}/swift/object-server.conf.j2'.format(data['version']), data=data): self.handlers['restart_swift-object-server'] = True if self.is_tag('data'): filer.mkdir('/mnt/swift/main') for ring in ['account', 'object', 'container']: port = data['{0}_port'.format(ring)] sudo('cd /etc/swift &&' '[ -e {0}.builder ] || swift-ring-builder {0}.builder create 9 1 1 && ' '[ -e {0}.ring.gz ] || swift-ring-builder {0}.builder add z1-127.0.0.1:{1}/main 100 &&' # noqa '[ -e {0}.ring.gz ] || swift-ring-builder {0}.builder rebalance'.format(ring, port)) # noqa if self.is_tag('conf', 'service'): self.enable_services().start_services(pty=False) self.exec_handlers()
def disable(self, **kwargs): with api.warn_only(): init_manager = env.node['init_manager'] if init_manager == 'systemd': self.result = sudo('systemctl disable {0}'.format(self.name), **kwargs) elif init_manager == 'chkconfig': self.result = sudo('chkconfig {0} off'.format(self.name), **kwargs) elif init_manager == 'update-rc.d': self.result = sudo('update-rc.d -f {0} remove'.format(self.name), **kwargs) else: self.unsupport() return self
def setup(self): """ easy_install, pipをインストールします。 また、pipはパッケージインストール時にソースからコンパイルするため、 いくつかのdevelパッケージをインストールしておきます。 """ self.init() git.setup() self.install_packages() with api.warn_only(): result = run('which easy_install') if result.return_code != 0: sudo('sh -c "cd /tmp/ && wget https://bootstrap.pypa.io/ez_setup.py -O - | python"') with api.warn_only(): result = run('which pip') if result.return_code != 0: sudo('easy_install pip') if self.prefix != '/usr': sudo('pip install virtualenv') if not filer.exists(self.prefix): sudo('virtualenv {0} --system-site-packages'.format(self.prefix))
def mkdir(dest, is_local=False, owner='root:root', mode='775', use_sudo=True): cmd_mkdir = 't={0} && mkdir -p $t'.format(dest) if is_local or env.is_local: if use_sudo: sudo("sh -c '{0} && chmod {1} $t && chown {2} $t'".format( cmd_mkdir, mode, owner)) else: cmd(cmd_mkdir) elif use_sudo: sudo('{0} && chmod {1} $t && chown {2} $t'.format( cmd_mkdir, mode, owner)) else: run('{0} $t'.format(cmd_mkdir, mode, owner))
def upgrade(self): with api.warn_only(): if env.node['package_manager'] == 'yum': self.result = sudo('yum upgrade {0} -y'.format(self.package_name)) elif env.node['package_manager'] == 'apt': self.result = sudo('apt-get upgrade {0} -y'.format(self.package_name)) else: self.unsupport() if self.result.return_code != 0: msg = 'Failed upgrade {0}.'.format(self.package_name) log.error(msg) raise Exception(msg) return self
def wrap_cmd(self, option, **kwargs): with api.warn_only(): service_manager = env.node['service_manager'] if service_manager == 'systemd': self.result = sudo( 'systemctl {0} {1}'.format(option, self.name), **kwargs) elif service_manager == 'service': self.result = sudo( '/etc/init.d/{1} {0}'.format(option, self.name), **kwargs) elif service_manager == 'upstart': self.result = sudo('initctl {0} {1}'.format(option, self.name), **kwargs) else: self.unsupport() return self
def add(name, uid=None, group=None, gid=None): with api.warn_only(): getent = sudo('getent passwd | grep ^{0}:'.format(name)) if getent.return_code != 0: group_option = '' if group is not None: group_mod.add(group, gid=gid) group_option = '-g {0}'.format(group) if uid is None: sudo('useradd -M -s/bin/false {0} {1}'.format( name, group_option)) else: sudo('useradd -M -s/bin/false -u {1} {0} {2}'.format( name, uid, group_option))
def disable(self, **kwargs): with api.warn_only(): init_manager = env.node['init_manager'] if init_manager == 'systemd': self.result = sudo('systemctl disable {0}'.format(self.name), **kwargs) elif init_manager == 'chkconfig': self.result = sudo('chkconfig {0} off'.format(self.name), **kwargs) elif init_manager == 'update-rc.d': self.result = sudo( 'update-rc.d -f {0} remove'.format(self.name), **kwargs) else: self.unsupport() return self
def setup(self): self.init() sudo('setenforce 0') Editor('/etc/selinux/config').s('SELINUX=enforcing', 'SELINUX=disable') Service('firewalld').stop().disable() if self.is_tag('package'): self.install_packages() self.python.setup() self.python.setup_package(**self.package) if self.is_tag('conf'): self.dump_openstackrc
def upgrade(self): with api.warn_only(): if env.node['package_manager'] == 'yum': self.result = sudo('yum upgrade {0} -y'.format( self.package_name)) elif env.node['package_manager'] == 'apt': self.result = sudo('apt-get upgrade {0} -y'.format( self.package_name)) else: self.unsupport() if self.result.return_code != 0: msg = 'Failed upgrade {0}.'.format(self.package_name) log.error(msg) raise Exception(msg) return self
def exists(dest, is_local=False): cmd_exists = '[ -e {0} ]'.format(dest) if is_local or env.is_local: result, result_out = cmd(cmd_exists) return True if result == 0 else False else: with api.warn_only(): return True if sudo(cmd_exists).return_code == 0 else False
def setup_pcs(self): data = self.init() if env.host == data['hosts'][0]: with api.warn_only(): result = sudo("pcs cluster status") if result.return_code != 0: ha_hosts = ' '.join(data['hosts']) sudo("pcs cluster auth {0} -u hacluster -p {1}".format( ha_hosts, data['ha_password'])) # pcs cluster setup で/etc/corosync/corosync.conf が自動生成される sudo("pcs cluster setup --name hacluster {0}".format(ha_hosts)) sudo("pcs cluster start --all") sudo("corosync-cfgtool -s")
def delete(self): data = self.data for i, vm in enumerate(data['libvirt_vms']): with api.warn_only(): sudo("virsh net-update default delete ip-dhcp-host \"`virsh net-dumpxml default" " | grep '{0}' | sed -e 's/^ *//'`\"".format(vm['ip'])) sudo('virsh list | grep {0} && virsh destroy {0}'.format(vm['name'])) sudo('virsh list --all | grep {0} && virsh undefine {0}'.format(vm['name'])) instance_dir = os.path.join(self.instances_dir, vm['name']) sudo('rm -rf {0}'.format(instance_dir))
def wget_src_image(self, vm): images_dir = os.path.join(self.libvirt_dir, 'images') filer.mkdir(images_dir) src_image = vm['src_image'].rsplit('/', 1)[1] src_image_path = '{0}/{1}'.format(images_dir, src_image) src_image_format = 'qcow2' if src_image_path[-3:] == '.xz': src_image_path = src_image_path[:-3] src_image_format = 'xz' if not filer.exists(src_image_path): sudo('sh -c "cd {0} && wget {1}"'.format(images_dir, vm['src_image'])) if src_image_format == 'xz': sudo('sh -c "cd {0} && xz -d {1}"'.format(images_dir, src_image)) return src_image_path
def wget_src_image(self, vm): images_dir = os.path.join(self.libvirt_dir, 'images') filer.mkdir(images_dir) src_image = vm['src_image'].rsplit('/', 1)[1] src_image_path = '{0}/{1}'.format(images_dir, src_image) src_image_format = 'qcow2' if src_image_path[-3:] == '.xz': src_image_path = src_image_path[:-3] src_image_format = 'xz' if not filer.exists(src_image_path): sudo('cd {0} && wget {1}'.format(images_dir, vm['src_image'])) if src_image_format == 'xz': sudo('cd {0} && xz -d {1}'.format(images_dir, src_image)) return src_image_path
def setup_volume(self): """ require serial task. """ data = self.init() if data["hosts"][0] != env.host: return for volume in data["volume_map"].values(): bricks = "" replica_option = "replica 2" if len(data["hosts"]) > 1 else "" for host in data["hosts"]: bricks += "{0}:{1} ".format(host, volume["brick"]) sudo( "gluster volume info {0[name]} || gluster volume create " "{0[name]} {1} {2} force".format(volume, replica_option, bricks) ) sudo("gluster volume info {0[name]} | grep Started" " || gluster volume start {0[name]}".format(volume))
def setup_volume(self): """ require serial task. """ data = self.init() if data['hosts'][0] != env.host: return for volume in data['volume_map'].values(): bricks = '' replica_option = 'replica 2' if len(data['hosts']) > 1 else '' for host in data['hosts']: bricks += '{0}:{1} '.format(host, volume['brick']) sudo('gluster volume info {0[name]} || gluster volume create ' '{0[name]} {1} {2} force'.format( volume, replica_option, bricks)) sudo('gluster volume info {0[name]} | grep Started' ' || gluster volume start {0[name]}'.format( volume))
def install(self, option=''): with api.warn_only(): if env.node['package_manager'] == 'yum': self.result = run('rpm -q {0}'.format(self.package_name)) if not self.result.return_code == 0: if self.path: self.result = sudo('yum install {0} -y {1}'.format( self.path, option)) else: self.result = sudo('yum install {0} -y {1}'.format( self.package_name, option)) elif env.node['package_manager'] == 'apt': splited_name = self.package_name.split('=') if len(splited_name) > 1: package_name = splited_name[0] version = splited_name[1] else: package_name = self.package_name version = '' self.result = run('dpkg -l {0} | grep "^ii *{1}"'.format( package_name, version)) if not self.result.return_code == 0: if self.path: self.result = sudo( 'RUNLEVEL=1 apt-get install {0} -y {1}'.format( self.path, option)) else: self.result = sudo( 'RUNLEVEL=1 apt-get install {0} -y {1}'.format( self.package_name, option)) else: self.unsupport() if self.result.return_code != 0: msg = 'Failed install {0}.'.format(self.package_name) log.error(msg) raise Exception(msg) return self
def setup(self): data = self.init() if self.is_tag('package'): self.python.setup() self.python.setup_package(**self.package) if self.is_tag('conf'): # setup conf files if filer.template( '/etc/designate/designate.conf', src='{0}/designate.conf.j2'.format(data['version']), data=data): self.handlers['restart_ironic-*'] = True if self.is_tag('data') and env.host == env.hosts[0]: sudo('{0}/bin/designate-manage database sync'.format(self.prefix)) if self.is_tag('conf', 'service'): self.enable_services().start_services(pty=False) self.exec_handlers()
def setup(self): data = self.init() if self.is_tag('package'): self.python.setup() self.python.setup_package(**self.package) if self.is_tag('conf'): if filer.template( '/etc/aodh/aodh.conf', src='{0}/aodh.conf.j2'.format(data['version']), data=data, ): self.handlers['restart_aodh-*'] = True if self.is_tag('data') and env.host == env.hosts[0]: sudo('{0}/bin/aodh-dbsync'.format(self.prefix)) if self.is_tag('conf', 'service'): self.enable_services().start_services(pty=False) self.exec_handlers()
def setup(self): data = self.init() self.install_packages() var_dir = CONF.client.package_var_dir common_repo = '{0}/fabkit-repo-common'.format(var_dir) server_repo = '{0}/fabkit-repo-server'.format(var_dir) filer.template('{0}/fabfile.ini'.format(server_repo), data=data) sudo('rm -rf {0}/fabfile && ' 'cp -r {1}/fabfile {0}/fabfile && ' 'chown -R {2}:{3} {0}/fabfile'.format(server_repo, common_repo, data['user'], data['group'])) if re.match('CentOS .*', env.node['os']): log_prefix = '/var/log/httpd/{0}'.format(env.user) data.update({ 'repo': server_repo, 'python_path': self.python.get_site_packages(), 'error_log': 'fabkit-error.log'.format(log_prefix), 'custom_log': 'fabkit-access.log'.format(log_prefix), }) if filer.template( src='httpd.conf', dest='/etc/httpd/conf.d/fabkit_httpd.conf'.format( env.user), data=data): self.handlers['restart_httpd'] = True self.exec_handlers() if env.host == env.hosts[0]: sudo("cd {0}/fabfile/core/webapp && " "{1}/bin/python manage.py migrate --noinput".format( server_repo, CONF.client.package_prefix)) sudo( "cd {0}/fabfile/core/webapp && " "echo \"from django.contrib.auth.models import User;" "User.objects.create_superuser('admin', '*****@*****.**', 'admin')\"" " | {1}/bin/python manage.py shell".format( server_repo, CONF.client.package_prefix)) self.start_services().enable_services() self.restart_services() sudo('/opt/fabkit/bin/fabserver -l')
def delete(self): data = self.data for i, vm in enumerate(data['libvirt_vms']): with api.warn_only(): self.pdns.delete_record('{0}.{1}'.format(vm['name'], CONF.network.domain)) for port in vm['ports']: if port['ip'] == 'none': continue if sudo('virsh list | grep {0}'.format(vm['name'])).return_code == 0: sudo('virsh destroy {0}'.format(vm['name'])) if sudo('virsh list --all | grep {0}'.format(vm['name'])).return_code == 0: sudo('virsh undefine {0}'.format(vm['name'])) instance_dir = os.path.join(self.instances_dir, vm['name']) sudo('rm -rf {0}'.format(instance_dir))
def sync(url, branch='master', dest=None, user=None): if not dest: name = url.rsplit('/', 1)[1] dest = os.path.join(tmp_dest, name) if not filer.exists(dest): with api.cd('/tmp'): expect( 'git clone -b {0} {1} {2}'.format(branch, url, dest), expects=[ [ 'Are you sure you want to continue connecting (yes/no)?', 'yes\\n' ], ], user=user) else: if user is not None: sudo('cd {0} && git pull'.format(dest), user=user) else: run('cd {0} && git pull'.format(dest)) return dest
def create_configiso(self, vm, instance_dir): data = self.data template_data = { 'user': CONF.job_user, 'password': CONF.job_password, 'vm': vm, 'gateway': data['libvirt']['gateway'], 'netmask': data['libvirt']['netmask'], } metadata_path = '{0}/meta-data'.format(instance_dir) userdata_path = '{0}/user-data'.format(instance_dir) configiso_path = '{0}/config.iso'.format(instance_dir) src_metadata_path = os.path.join(self.template_dir, 'meta-data') src_userdata_path = os.path.join(self.template_dir, vm['template']) filer.template(metadata_path, src_file=src_metadata_path, data=template_data) filer.template(userdata_path, src_file=src_userdata_path, data=template_data) if not filer.exists(configiso_path): sudo('genisoimage -o {0} -V cidata -r -J {1} {2}'.format( configiso_path, metadata_path, userdata_path)) return configiso_path
def substitute(self, pattern, txt, option='', start=None, end=None): if start: if end: sudo('sed -i "{0},{1}s/{2}/{3}/{4}" {5}'.format( start, end, pattern, txt, option, self.file_path)) else: sudo('sed -i "{0}s/{1}/{2}/{3}" {4}'.format( start, pattern, txt, option, self.file_path)) else: sudo('sed -i "s/{0}/{1}/{2}" {3}'.format(pattern, txt, option, self.file_path))
def set(key_path, file): tmp_file = '{0}{1}'.format(CONF.remote_tmp_dir, file) local_file = '{0}{1}'.format(CONF._filebag_dir, key_path) sudo('mkdir -p {0}'.format(os.path.direname(tmp_file))) sudo('cp {0} {1}'.format(file, tmp_file)) sudo('chmod 666 {0}'.format(tmp_file)) api.get(tmp_file, '/tmp/authkey') sudo('rm {0}'.format(tmp_file)) key, data_file = __get_key_file(key_path) data_dir = os.path.dirname(data_file) if not os.path.exists(data_dir): os.makedirs(data_dir) databag = get_databag(key_path) databag.update({key: value}) with open(data_file, 'w') as f: yaml.dump(databag, f) return
def setup(self): data = self.init() if self.is_tag('conf'): if env.node['package_manager'] == 'yum': if filer.template('/etc/my.cnf.d/server.cnf', data=data): self.handlers['restart_mariadb'] = True elif env.node['package_manager'] == 'apt': pass if self.is_tag('service'): if self.data['hosts'][0] == env.host: with api.warn_only(): result = sudo('systemctl status mariadb') if result.return_code != 0: sudo('galera_new_cluster') else: self.exec_handlers() self.enable_services().start_services() else: self.enable_services().start_services() self.exec_handlers() if self.is_tag('data'): # init root_password if not filer.exists('/root/.my.cnf'): root_password = data['root_password'] if data['hosts'][0] == env.host: if self.is_ubuntu(): sudo('mysqladmin password {0} -uroot -ptmppass'.format( root_password)) else: sudo('mysqladmin password {0} -uroot'.format( root_password)) filer.template('/root/.my.cnf', data={'root_password': root_password}) if data['hosts'][0] == env.host: self.create_users() self.delete_default_users() self.create_databases()
def insert(self, txt, start=None, end=None): # TODO 正規表現による行指定も冪等性持ってできるようにする if start: if end: if type(start) is IntType: result_start = sudo('sed -n "{0}p" {1}'.format( start, self.file_path)) result_end = sudo('sed -n "{0}p" {1}'.format( end, self.file_path)) if result_start != txt and result_end != txt: sudo('sed -i "{0},{1}i {2}" {3}'.format( start, end, txt, self.file_path)) else: if type(start) is IntType: result = sudo('sed -n "{0}p" {1}'.format( start, self.file_path)) if result != txt: sudo('sed -i "{0}i {1}" {2}'.format( start, txt, self.file_path)) return self