April 29, 2013
We needed more space for cinder and had no nice way to expand it on our existing cinder server so after banging my head a bit I got assistance from Giulio Fidente who was able to show me a working config that let me figure out what I was missing. Below I document it so others might be able to find it, too.
NOTE: this works under folsom on rhel 6.4. I cannot vouch for anything else -but Giulio had it running on grizzly I think so…
You have an existing cinder server setup and running – which includes
a volume server, an api service and a scheduler service. You need to
add more space and you have a system where that can run.
Here’s all you need to do:
1. install openstack-cinder on the server you want to be a new volume server
2. make sure your new system can access the mysql server on your primary
3. make sure tgtd knows to import the files /etc/cinder/volumes
4. make sure your other computer nodes can access the iscsi-target port
iscsi-target 3260/tcp on the system you want to add as an cinder-volume server
5. setup your /etc/cinder/cinder.conf
sql_connection = mysql://cinder_user:cinder_pass@mysqlhost/cinder
auth_strategy = keystone
rootwrap_config = /etc/cinder/rootwrap.conf
rpc_backend = cinder.openstack.common.rpc.impl_qpid
qpid_hostname = qpid_hostname_ip_here
volume_group = cinder-volumes
iscsi_helper = tgtadm
iscsi_ip_address = my_volume_ip
logdir = /var/log/cinder
state_path = /var/lib/cinder
lock_path = /var/lib/cinder/tmp
volumes_dir = /etc/cinder/volumes
6. start tgtd and openstack-cinder-volume
service tgtd start
service openstack-cinder-volume start
7. check out /var/log/cinder/volume.log
8. Verifying it worked:
on your cloud controller run:
cinder-manage host list
you should see all of your volume servers there.
9. creating a volume. – just make a volume as usual – the scheduler
should default to the volume server with the most space available
10. on your new cinder-volume server run lvs to look for the new volume.
Things I learned today:
1. the predictable network device naming stuff in systemd is kinda arbitrary when it comes to cloud imgs that may run on a variety of virt systems – so to turn it off just add this to your %post in your kickstart:
# disable systemd ‘predictable’ device names for networks w/a hammerln -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF DEVICE="eth0" BOOTPROTO="dhcp" ONBOOT="yes" TYPE="Ethernet" EOF
That last bit is just to make a generic ifcfg-eth0 so ifup eth0 works normally. 2. the hostonly initramfs that dracut makes now plays up when you are moving an image around. make sure you add
to %packages to get it to behave as you’d expect
3. if you don’t have a lot of memory then you may not want tmpfs for /tmp – to turn that off just do:
systemctl mask tmp.mount
in %post and it will be as you’d expect.
4. syslinux-extlinux is WAY nicer and simpler to use than grub2 🙂
Thanks to Mattdm for making the syslinux-extlinux option for anaconda happen.
April 25, 2013
A while back I wrote this for func – and I found I needed it ported to ansible.
I enhanced it to make it take more than just 2 systems. It can now compare any number of systems to the base system
Takes a first argument of your ‘baseline’ host that’s the host all the other hosts package sets will be compared to.
It grabs the list of rpms installed on each system (just using rpm -qa, I’m lazy, or I could have used the yum list=installed option)
It transforms that output into a set – then does a difference on them each way.
Output looks like this
$ ans_rpm_compare.py app01.phx2.fedoraproject.org app02.phx2.fedoraproject.org
Packages on app01.phx2.fedoraproject.org not on app02.phx2.fedoraproject.org
Packages on app02.phx2.fedoraproject.org not on app01.phx2.fedoraproject.org
Trivial but should be straightforward to follow how it works in the code.
No idea where else to put it so it goes into my scripts git repo.
April 22, 2013
If you see this traceback in your /var/log/mailman/error file
File “/usr/lib/mailman/Mailman/Queue/Runner.py”, line 120, in _oneloop
File “/usr/lib/mailman/Mailman/Queue/Runner.py”, line 191, in _onefile
keepqueued = self._dispose(mlist, msg, msgdata)
File “/usr/lib/mailman/Mailman/Queue/ArchRunner.py”, line 73, in _dispose
File “/usr/lib/mailman/Mailman/Archiver/Archiver.py”, line 216, in ArchiveMail
File “/usr/lib/mailman/Mailman/Archiver/pipermail.py”, line 583, in processUnixMailbox
File “/usr/lib/mailman/Mailman/Archiver/pipermail.py”, line 635, in add_article
article.parentID = parentID = self.get_parent_info(arch, article)
File “/usr/lib/mailman/Mailman/Archiver/pipermail.py”, line 669, in get_parent_info
if parentID and not self.database.hasArticle(archive, parentID):
File “/usr/lib/mailman/Mailman/Archiver/HyperDatabase.py”, line 273, in hasArticle
File “/usr/lib/mailman/Mailman/Archiver/HyperDatabase.py”, line 251, in __openIndices
t = DumbBTree(os.path.join(arcdir, archive + ‘-‘ + i))
File “/usr/lib/mailman/Mailman/Archiver/HyperDatabase.py”, line 65, in __init__
File “/usr/lib/mailman/Mailman/Archiver/HyperDatabase.py”, line 170, in load
self.dict = marshal.load(fp)
ValueError: bad marshal data
It is due to a corrupted archive database. Those live in /var/lib/mailman/archives/private/$list/database/*
In order to figure out which one it is – you have to run this:
import os, sys
for fn in sys.argv[1:]:
c = marshal.load(open(fn))
against the files in the dir I mentioned above.
python thatscript /var/lib/mailman/archives/private/$list/database/2013-April*
That will tell you if a file is busted, (it will print out an exception) but it won’t fix it.
You will probably need to run it against all of the current files for all the lists you have 😦
Once you figure out which lists are broken you SHOULD be able to run
bin/arch –wipe listname /var/lib/archives/private/$list.mbox/$list.mbox
and have it recreate the whole thing.