Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

ติดตั้ง OpenStack จากซอร์ส - ตอนที่ 2

ในบทความแรกของชุดนี้ เราเริ่มติดตั้ง OpenStack จากแหล่งที่มา เราติดตั้งคีย์สโตนและเติมข้อมูลพื้นฐานบางอย่าง รวมถึงโปรเจ็กต์บริการและผู้ดูแลระบบสำหรับการติดตั้ง OpenStack ใหม่ของเรา นอกจากนี้ ในสคริปต์เริ่มต้น เราตั้งค่าผู้ใช้และไดเร็กทอรีสำหรับการติดตั้งอิมเมจเซอร์วิส (ภาพรวม) บริการเครือข่าย (นิวตรอน) บริการประมวลผล (nova) และบริการ Volume (ถ่าน) ตอนนี้ ไปต่อและติดตั้งและเริ่มกระบวนการชำเลืองบนโหนดคอนโทรลเลอร์กัน

ในบทความแรก เราได้เพิ่มข้อมูลบางอย่างลงในไฟล์ bashrc เพื่อตั้งค่าตัวแปรเชลล์สองตัวเพื่อใช้ในชุดที่เหลือ ตรวจสอบว่ามีการตั้งค่าตัวแปรเหล่านี้อย่างน้อยหนึ่งตัว:

echo $MY_IP

ในการเริ่มต้นติดตั้งบริการอิมเมจ (ภาพรวม) เราจำเป็นต้องสร้างไดเร็กทอรีย่อยเพิ่มเติมและตรวจสอบให้แน่ใจว่าไดเร็กทอรีย่อยเหล่านี้ได้รับการอนุญาตอย่างถูกต้อง (ไดเร็กทอรีเหลือบพื้นฐานถูกสร้างขึ้นโดยสคริปต์ในบทความก่อนหน้านี้):

mkdir -p /var/lib/glance/images
mkdir -p /var/lib/glance/scrubber
mkdir -p /var/lib/glance/image-cache

ถัดไป ดาวน์โหลด (โคลน repo) และติดตั้งอย่างรวดเร็ว:

git clone https://github.com/openstack/glance.git -b stable/kilo

หมายเหตุ:จำไว้ว่าเราสามารถเปลี่ยนเป็นติดตั้งจาก trunk โดยกำจัด -b stable/kilo ออกจากคำสั่งด้านบน

cp -R glance/etc/* /etc/glance/
cd glance
python setup.py install

กำหนดค่าได้อย่างรวดเร็วโดยการตั้งค่าข้อมูลพื้นฐานบางอย่าง เช่น ข้อมูลการเชื่อมต่อฐานข้อมูล ข้อมูลคิวข้อความ และข้อมูลการเชื่อมต่อคีย์สโตน:

sed -i "s|#connection = <None>|connection = mysql://glance:glance@$MY_PRIVATE_IP/glance|g" /etc/glance/glance-api.conf
sed -i "s/rabbit_host = localhost/rabbit_host = $MY_PRIVATE_IP/g" /etc/glance/glance-api.conf
sed -i "s/auth_host = 127.0.0.1/auth_host = $MY_PRIVATE_IP/g" /etc/glance/glance-api.conf
sed -i 's/%SERVICE_TENANT_NAME%/service/g' /etc/glance/glance-api.conf
sed -i 's/%SERVICE_USER%/glance/g' /etc/glance/glance-api.conf
sed -i 's/%SERVICE_PASSWORD%/glance/g' /etc/glance/glance-api.conf
sed -i 's/#flavor=/flavor = keystone/g' /etc/glance/glance-api.conf
sed -i 's/#show_image_direct_url = False/show_image_direct_url = True/g' /etc/glance/glance-api.conf

กำหนดค่า Glance-Registry ด้วยข้อมูลเดียวกับด้านบน:

sed -i "s|#connection = <None>|connection = mysql://glance:glance@$MY_PRIVATE_IP/glance|g" /etc/glance/glance-registry.conf
sed -i "s/auth_host = 127.0.0.1/auth_host = $MY_PRIVATE_IP/g" /etc/glance/glance-registry.conf
sed -i 's/%SERVICE_TENANT_NAME%/service/g' /etc/glance/glance-registry.conf
sed -i 's/%SERVICE_USER%/glance/g' /etc/glance/glance-registry.conf
sed -i 's/%SERVICE_PASSWORD%/glance/g' /etc/glance/glance-registry.conf
sed -i 's/#flavor=/flavor = keystone/g' /etc/glance/glance-registry.conf
sed -i 's|#connection = <None>|connection = mysql://glance:glance@$MY_IP|g' /etc/glance/glance-api.conf
sed -i 's|#connection = <None>|connection = mysql://glance:glance@$MY_IP|g' /etc/glance/glance-registry.conf

สร้างฐานข้อมูล MySQL ได้อย่างรวดเร็วและเติมฐานข้อมูลที่สร้างขึ้นใหม่ด้วยตารางเหลือบ:

mysql -u root -pmysql -e 'CREATE DATABASE glance;'
mysql -u root -pmysql -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance';"
mysql -u root -pmysql -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance';"
glance-manage db_sync

แม้ว่าจะไม่จำเป็นในสภาพแวดล้อมนี้ แต่เราจะติดตั้งการซิงค์ภาพอย่างรวดเร็วและตั้งค่าให้ทำงานเป็นประจำ หากเรามีโหนด API เหลือบหลายรายการ สิ่งนี้จะซิงค์ภาพการเหลือบระหว่างโหนด:

git clone https://github.com/rcbops/glance-image-sync
pushd glance-image-sync
mv glance-image-sync.py /usr/local/bin/glance-image-sync
chmod +x /usr/local/bin/glance-image-sync
popd

cat >> /etc/glance/glance-image-sync << EOF
[DEFAULT]
api_nodes = $MY_IP
rsync_user = glance
lock_file = /var/run/glance-image-sync
EOF

cat >>  /etc/cron.d/glance-image-syn << EOF
*/5 * * * * glance /usr/local/bin/glance-image-sync
EOF

เราต้องจำไว้ว่าให้หมุนไฟล์บันทึกภาพรวม:

cat >> /etc/logrotate.d/glance << EOF
/var/log/glance/*.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}
EOF

หากคุณไม่ได้รับใบรับรองการลงนามบริการ Identity สำหรับบริการ Image คำขอ Image API จะล้มเหลว ป้องกันสิ่งนี้โดยรับใบรับรองการลงนามหลักสำคัญอย่างรวดเร็ว:

cp /etc/keystone/ssl/certs/ca.pem /var/lib/glance/cacert.pem
cp /etc/keystone/ssl/certs/signing_cert.pem /var/lib/glance/
chown glance:glance /var/lib/glance/*
chmod 600 /var/lib/glance/cacert.pem
chmod 600 /var/lib/glance/signing_cert.pem

เราเกือบจะพร้อมที่จะเริ่มชำเลืองมองแล้ว แต่ก่อนอื่นเราต้องสร้างสคริปต์พุ่งพรวดก่อน:

หมายเหตุ:สคริปต์เหล่านี้เพิ่งคัดลอกมาจากสคริปต์ที่ระบบปฏิบัติการ Ubuntu เวอร์ชันแพ็คเกจติดตั้งได้อย่างรวดเร็ว

cat >> /etc/init/glance-api.conf << EOF
description "Glance API server"
author "Soren Hansen <soren@linux2go.dk>"

start on runlevel [2345]
stop on runlevel [!2345]

respawn

exec start-stop-daemon --start --chuid glance --exec /usr/local/bin/glance-api -- --config-file=/etc/glance/glance-api.conf --config-file=/etc/glance/glance-api-paste.ini
EOF

cat >> /etc/init/glance-registry.conf << EOF
description "Glance registry server"
author "Soren Hansen <soren@linux2go.dk>"

start on runlevel [2345]
stop on runlevel [!2345]

respawn

exec start-stop-daemon --start --chuid glance --exec /usr/local/bin/glance-registry -- --config-file=/etc/glance/glance-registry.conf --config-file=/etc/glance/glance-registry-paste.ini

EOF

เริ่มเหลือบและตรวจสอบว่ากำลังทำงานอยู่:

start glance
start glance-registry

รอประมาณ 15 วินาทีแล้วเรียกใช้สิ่งต่อไปนี้เพื่อตรวจสอบว่าเหลือบมองอยู่:

ps aux|grep glance

หากเริ่มเหลือบมอง เราควรเห็นบรรทัดจากคำสั่งสุดท้ายที่แสดงข้อมูลเกี่ยวกับกระบวนการที่ทำงานอยู่ หากไม่เกิดขึ้นและการเหลือบมองไม่เริ่มทำงานหรือยังคงทำงานอยู่ ให้ใช้ข้อมูลต่อไปนี้เพื่อเริ่มการแก้ไขปัญหาด้วยตนเอง:

sudo -u glance glance-api --config-file=/etc/glance/glance-api.conf --config-file=/etc/glance/glance-api-paste.ini > /dev/null 2>&1 &

sudo -u glance glance-registry --config-file=/etc/glance/glance-registry.conf --config-file=/etc/glance/glance-registry-paste.ini > /dev/null 2>&1 &

หมายเหตุ: การตั้งค่า debug = True ในไฟล์ /etc/glance/glance.conf จะเพิ่มเอาต์พุตการบันทึกเพื่อช่วยในการดีบักความล้มเหลว

ถัดไป ติดตั้งอิมเมจเพื่อใช้งานทันทีที่เราติดตั้ง OpenStack อย่างสมบูรณ์เพื่อเป็นพื้นฐานสำหรับ VM มีภาพคลาวด์ขนาดเล็กที่ใช้ระบบปฏิบัติการ Ubuntu ที่ชื่อ cirros ดาวน์โหลดรูปภาพ cirros และโหลดได้อย่างรวดเร็ว:

wget https://cdn.download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img

glance image-create --name=cirros-qcow2 \
                    --disk-format=qcow2 \
                    --container-format=bare \
                    --is-public=true < cirros-0.3.3-x86_64-disk.img

กระบวนการที่สองของเรากำลังทำงานอยู่ และตอนนี้เราสามารถหันมาสนใจการติดตั้งบริการเครือข่าย (นิวตรอน) ได้แล้ว นี่เป็นครั้งแรกในการติดตั้งนิวตรอน 3 รายการที่เราจะต้องทำ ได้แก่ เซิร์ฟเวอร์นิวตรอนบนโหนดคอนโทรลเลอร์ และตัวแทนนิวตรอนบนเครือข่ายและโหนดคอมพิวท์

เนื่องจากโปรเซสโนวา นิวตรอน และกระบวนการเหลือบมองต้องใช้สิทธิ์รูทหรือ sudo เพื่อทำงานต่างๆ ให้สำเร็จ เราจึงต้องสร้างการอนุญาตพิเศษ sudo สำหรับผู้ใช้กระบวนการเหล่านี้ OpenStack ยังจำกัดขอบเขตของสิทธิ์เหล่านี้ผ่านการใช้การกำหนดค่า rootwrap เรียกใช้สคริปต์ต่อไปนี้เพื่อตั้งค่าการอนุญาต sudo:

for SERVICE in neutron nova cinder
do
echo $SERVICE
cat > '/etc/sudoers.d/'$SERVICE'_sudoers' << EOF
Defaults:$SERVICE !requiretty

$SERVICE ALL = (root) NOPASSWD: /usr/local/bin/$SERVICE-rootwrap  /etc/$SERVICE/rootwrap.conf *
EOF

chmod 440 /etc/sudoers.d/$SERVICE_sudoers
done
chmod 750 /etc/sudoers.d

ข้อกำหนดเบื้องต้นของ pip บางส่วนมีข้อกำหนดเบื้องต้นของแพ็คเกจสองสามข้อที่ไม่ได้ติดตั้งโดยอัตโนมัติ ติดตั้งแพ็คเกจเหล่านี้ทันที:

apt-get -y install git mysql-client python-dev libxml2-dev libffi-dev

โคลนรีพอนนิวตรอน:

git clone https://github.com/openstack/neutron.git -b stable/kilo

คัดลอกไฟล์การกำหนดค่าที่ให้มา:

cp neutron/etc/* /etc/neutron/

คัดลอกไดเรกทอรีย่อยการกำหนดค่าที่จำเป็นบางส่วน:

cp -R neutron/etc/neutron/plugins/ml2/* /etc/neutron/plugins/ml2
cp -R neutron/etc/neutron/rootwrap.d/* /etc/neutron/rootwrap.d

ตอนนี้ติดตั้งนิวตรอน:

cd neutron
python setup.py install
cd ~

สร้างฐานข้อมูล MySQL สำหรับนิวตรอน:

mysql -u root -pmysql -e 'CREATE DATABASE neutron;'
mysql -u root -pmysql -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'neutron';"
mysql -u root -pmysql -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neutron';"

สคริปต์ข้อมูลตัวอย่างที่รันในบทความก่อนหน้านี้ไม่ได้แทรกข้อมูลสำหรับบริการนิวตรอน สร้างผู้ใช้บริการนิวตรอนในคีย์สโตน:

keystone user-create --tenant service --name neutron --pass neutron

มอบบทบาท "ผู้ดูแลระบบ" ให้กับผู้ใช้บริการนิวตรอนที่สร้างขึ้นใหม่:

keystone user-role-add --user neutron --tenant service --role admin

และตรวจสอบว่าการสร้างผู้ใช้ทำงาน ระบุผู้ใช้บริการและบทบาท และตรวจสอบว่าผู้ใช้นิวตรอนมีอยู่จริงและมีบทบาทผู้ดูแลระบบ:

keystone user-list --tenant Services
keystone user-role-list --tenant service --user neutron

คุณควรเห็นผลลัพธ์ของคำสั่งก่อนหน้านี้สองคำสั่งที่ผู้ใช้นิวตรอนถูกสร้างขึ้นและมีสิทธิ์ที่เหมาะสม ตอนนี้เติมบริการนิวตรอนลงในแค็ตตาล็อกบริการหลัก:

keystone service-create --name=neutron --type=network --description="Neutron Network Service"

วางข้อมูลจุดปลายนิวตรอนลงในแค็ตตาล็อกบริการคีย์สโตน:

keystone endpoint-create --region RegionOne --service neutron --publicurl=https://$MY_PUBLIC_IP:9696 --internalurl=https://$MY_PRIVATE_IP:9696 --adminurl=https://$MY_PRIVATE_IP:9696

SERVICE_TENANT_ID=`keystone tenant-get service | awk '/ id / { print $4 }'`

สุดท้ายเราต้องกำหนดค่านิวตรอน หากไฟล์คอนฟิกูเรชันพื้นฐานถูกจัดเตรียมในกระบวนการปิดแพ็คเกจ ให้ลบออก เนื่องจากไฟล์นั้นยาวมากและยากต่อการแก้ไข ถัดไป ลำดับต่อไปนี้จะแทนที่ด้วยลำดับที่ง่ายกว่า (ต้นฉบับยังคงอยู่ในไดเร็กทอรีนิวตรอนที่โคลน ถ้าเราจำเป็นต้องดูมันในอนาคต):

rm /etc/neutron/neutron.conf

cat > /etc/neutron/neutron.conf << EOF
[DEFAULT]
verbose = True
debug = True
core_plugin = ml2
service_plugins = router
auth_strategy = keystone
allow_overlapping_ips = True
dhcp_agents_per_network = 1
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = https://$MY_PRIVATE_IP:8774/v2
nova_admin_username = nova
nova_admin_tenant_id = $SERVICE_TENANT_ID
#nova_admin_tenant_name = service
nova_admin_password = nova
nova_admin_auth_url = https://$MY_PRIVATE_IP:35357/v2.0

[agent]
root_helper=sudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
[keystone_authtoken]
auth_uri = https://$MY_PRIVATE_IP:35357/v2.0/
identity_uri = https://$MY_PRIVATE_IP:5000
admin_tenant_name = service
admin_user = neutron
admin_password = neutron
[database]
connection = mysql://neutron:neutron@$MY_PRIVATE_IP/neutron

[oslo_concurrency]
lock_path = /var/lock/neutron

[oslo_messaging_rabbit]
rabbit_host = $MY_PRIVATE_IP
EOF

หมุนล็อกไฟล์นิวตรอน:

cat >> /etc/logrotate.d/neutron << EOF
/var/log/neutron/*.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}
EOF

นิวตรอนรองรับเทคโนโลยีเครือข่ายเลเยอร์ 2 หลายตัวผ่านปลั๊กอิน ML2 กำหนดค่าตัวแทนปลั๊กอินนิวตรอน ML2 เพื่อใช้อุโมงค์ข้อมูล GRE สำหรับการแยกเครือข่ายโปรเจ็กต์ แม้ว่าเอเจนต์นี้จะไม่ทำงานบนโหนดคอนโทรลเลอร์ แต่เซิร์ฟเวอร์นิวตรอนจำเป็นต้องรู้เกี่ยวกับปลั๊กอิน:

rm /etc/neutron/plugins/ml2/ml2_conf.ini
cat > /etc/neutron/plugins/ml2/ml2_conf.ini  << EOF

[ml2]
type_drivers = gre
tenant_network_types = gre
mechanism_drivers = openvswitch

[ml2_type_gre]
tunnel_id_ranges = 1:1000

[securitygroup]
enable_security_group = True
enable_ipset = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
EOF

chown neutron:neutron /etc/neutron/*.{conf,json,ini}
chown -R neutron:neutron /etc/neutron/plugins

cat > /etc/default/neutron << EOF
--config-file=/etc/neutron/plugins/ml2/ml2_conf.ini
EOF

อย่างที่เราทำไปโดยคร่าวๆ ให้สร้างตารางฐานข้อมูลนิวตรอน:

neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head

ก่อนที่เราจะเริ่มกระบวนการนิวตรอน เราต้องให้ข้อมูลตัวเลือกบางอย่างแก่สคริปต์เริ่มต้น เพื่อให้อ่านไฟล์การกำหนดค่า ml2:

cat > /etc/default/neutron-server << EOF
NEUTRON_PLUGIN_CONFIG="/etc/neutron/plugins/ml2/ml2_conf.ini"
EOF

และสุดท้าย สร้างสคริปต์พุ่งพรวดที่ใช้ในการเริ่มกระบวนการเซิร์ฟเวอร์นิวตรอน:

cat > /etc/init/neutron-server.conf << EOF
# vim:set ft=upstart ts=2 et:

start on runlevel [2345]
stop on runlevel [!2345]

script
  [ -r /etc/default/neutron-server ] && . /etc/default/neutron-server
  [ -r "\$NEUTRON_PLUGIN_CONFIG" ] && CONF_ARG="--config-file \$NEUTRON_PLUGIN_CONFIG"
  exec start-stop-daemon --start --chuid neutron --exec /usr/local/bin/neutron-server -- \
    --config-file /etc/neutron/neutron.conf \
    --log-file /var/log/neutron/server.log \$CONF_ARG
end script

EOF

เริ่มการทำงานของเซิร์ฟเวอร์นิวตรอนและตรวจสอบว่ายังคงทำงานอยู่ บรรทัดที่สองให้ข้อมูลเกี่ยวกับกระบวนการนิวตรอนที่ทำงานอยู่ (รออีกครั้งประมาณ 15 วินาทีก่อนที่จะรันคำสั่งที่สอง):

start neutron
ps aux|grep neutron

หากนิวตรอนไม่เริ่มทำงาน ให้ใช้บรรทัดต่อไปนี้เพื่อเริ่มนิวตรอนด้วยตนเอง หากกระบวนการนิวตรอนมีข้อผิดพลาดในการเริ่มต้น ก็จะให้ผลลัพธ์เพื่อช่วยในการแก้ปัญหา

sudo -u neutron neutron-server --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/plugins/ml2/ml2_conf.ini --log-file /var/log/neutron/server.log

ในบทความถัดไปของซีรีส์นี้ เราจะติดตั้งกระบวนการโนวาหลายกระบวนการบนโหนดคอนโทรลเลอร์