一鍵部署Linux服務(wù)器
本來最近幾天是要搞Gerapy的侣颂,奈何最近幾天運氣太好损拢,好多以前苦苦都無法解決的課題,在網(wǎng)上都找到了解決方案溺蕉。順帶學(xué)會了幾個新玩具: expect、sed悼做、awk疯特。精通算不上,入個門玩玩還是挺有意思的肛走。
配置文件的自動化編輯問題
首先是配置文件的自動化編輯漓雅。因為最近我的服務(wù)器總是刪了再裝,裝了又刪。所以就總是要手動去改配置文件邻吞,就搞得很惡心庶灿。本著解決問題,就要先解決最惡心的問題吃衅。不然解決的事情不痛不癢往踢,浪費那閑工夫干嘛...
最先想到的是sed。前幾天搞《Docker搭建Hadoop》出現(xiàn)過徘层,用它編輯了CentOS軟件包倉庫峻呕。但是直接從網(wǎng)上找出來,復(fù)制粘貼就拿來用了趣效。這貨印象里總是和vim一起出現(xiàn)瘦癌,目測不難。那就找找資料學(xué)一下跷敬。
豆瓣圖書搜索sed讯私,相關(guān)圖書沒幾本,從上往下找西傀,第一本是O'Reilly出版社的書《sed & awk》斤寇。這出版社挺有意思的,印象里封面用的全都是某種動物拥褂,而且書名一如既往的簡短娘锁。找了一下中文版,粗讀了一遍饺鹃,沒怎么讀懂莫秆。就知道sed和awk都是用來處理文本文件的,awk強(qiáng)大得一批悔详,居然是一種語言镊屎。臥槽,這玩意搞會了茄螃,自動化運維缝驳、自動化部署服務(wù)器,豈不是指日可待责蝠?果斷放棄sed党巾,去找了一下awk的資料。
這次直接讀了《The GNU Awk User’s Guide》霜医,GNU官方出的用戶手冊。讀了大概兩三個小時驳规,基本上awk能干啥大概了解了:
- awk起源于sed和grep
- awk擅長數(shù)據(jù)統(tǒng)計
得出這么兩個結(jié)論之后肴敛,覺得跟自己要解決的問題關(guān)系不大。既然awk是一門語言,想要編輯文本文件自然不在話下医男,但為了改一個文本文件砸狞,去寫一個腳本,貌似沒有這個必要镀梭,所以又折回來搞sed了...
MD刀森,早知道,還浪費感情报账、花時間研底、弄一個用不上的技術(shù)。但是呢...當(dāng)初學(xué)vim的時候透罢,也是浪費感情榜晦、花時間、弄了一個用不上的sed羽圃。要是以前沒研究過sed乾胶,這次搞sed也不會這么容易。嗯朽寞,多看點東西也不虧识窿,興許以后用得上呢。嗯脑融,就是安慰安慰自己吧腕扶。
b站搜了一下sed,學(xué)了大概兩三個小時吨掌,覺得這玩意不是跟vim正則替換差不多么半抱?所以學(xué)習(xí)過程意外地順利,起碼正則表達(dá)式不用學(xué)了膜宋。(意外學(xué)了一下重定向窿侈,不過還是拿來就用的程度。就是——知道這條命令好用秋茫,但為啥好用史简?給我說一下唄?不好意思肛著,不知道圆兵,解釋不了...)。
# 配置hadoop-env.sh
sed 's@export JAVA_HOME=${JAVA_HOME}@export JAVA_HOME=/usr/local/jdk1.8.0_331@g' $HADOOP_HOME/etc/hadoop/hadoop-env.sh -i
# 配置core-site.xml
sed '/<configuration>/,/<\/configuration>/d' $HADOOP_HOME/etc/hadoop/core-site.xml -i
cat >> $HADOOP_HOME/etc/hadoop/core-site.xml << EOF
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-2.10.1/data</value>
</property>
</configuration>
EOF
自動化完成交互式命令
第一個問題解決了枢贿,本來想寫個腳本記錄一下殉农,但總感覺這腳本寫得不倫不類。這玩意我以后肯定嫌棄: 自動化完成了配置文件的編輯局荚,但是其余軟件的安裝超凳,還是得手動安裝愈污。就嘗試寫了個jdk、hadoop轮傍、hive的自動化部署腳本暂雹,發(fā)現(xiàn)了一個問題:
ssh-keygen
、ssh-copy-id
這種必須與控制臺交互的命令创夜,還是要手動敲杭跪。那就一個一個解決
ssh-keygen
想要擺脫交互式比較簡單,命令本身就支持
ssh-keygen -f /root/.ssh/id_rsa -t rsa -N ''
ssh-copy-id
這玩意就比較麻煩了驰吓,本著拿來就用的原則涧尿,先找了sshpass。發(fā)現(xiàn)在進(jìn)行ssh localhost
免密登錄時棚瘟,第一次會彈出yes/no
這種選項现斋,所以還是需要交互式...
然后就找到了expect
,學(xué)了一下偎蘸,這工具挺強(qiáng)——在控制臺出現(xiàn)了什么提示時庄蹋,往里邊敲什么都支持。有點類似程序設(shè)計語言里的if-elseif-else這種結(jié)構(gòu)迷雪。
# 配置root密碼
echo 'root' | passwd --stdin root
# 配置免密登錄
ssh-keygen -f /root/.ssh/id_rsa -t rsa -N ''
/usr/bin/expect <<-END &>/dev/null
spawn ssh-copy-id localhost
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" {send "root\r" }
}
expect eof
END
/usr/bin/expect <<-END &>/dev/null
spawn ssh-copy-id 0.0.0.0
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" {send "root\r" }
}
expect eof
END
總結(jié)一下
一鍵部署Linux服務(wù)器腳本
運行腳本之后限书,如果用的是docker compose,可以用env_file,就不需要用腳本去配置環(huán)境變量了;但如果直接用Linux的話傲霸,需要手動source /etc/profile
一下甲脏,才能hive
铅匹。那就留個課題,以后再解決吧。目前已經(jīng)把n條命令,優(yōu)化成3條命令了...
# 1.
# 在`/root`目錄下準(zhǔn)備三個文件:
# - apache-hive-2.1.1-bin.tar.gz
# - hadoop-2.10.1.tar.gz
# - jdk-8u331-linux-x64.tar.gz
# 2.
# 將以下腳本保存為deploy.sh卤档,鍵入以下命令等待安裝、配置完成
# bash deploy.sh
# 3.
# 等待腳本全部執(zhí)行結(jié)束以后程剥,執(zhí)行以下兩條命令劝枣,進(jìn)入hive
# source /etc/profile
# hive
# 系統(tǒng)配置
sed -i 's@mirrorlist@#mirrorlist@g' /etc/yum.repos.d/CentOS-*
sed -i 's@#baseurl=http://mirror.centos.org@baseurl=http://vault.centos.org@g' /etc/yum.repos.d/CentOS-*
# yum update -y
# yum grouplist
# yum groupinstall -y "Minimal Install"
yum install -y initscripts curl which tar sudo rsync openssh-server openssh-clients passwd vim expect
systemctl start sshd
# 配置root密碼
echo 'root' | passwd --stdin root
# 配置免密登錄
ssh-keygen -f /root/.ssh/id_rsa -t rsa -N ''
/usr/bin/expect <<-END &>/dev/null
spawn ssh-copy-id localhost
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" {send "root\r" }
}
expect eof
END
/usr/bin/expect <<-END &>/dev/null
spawn ssh-copy-id 0.0.0.0
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" {send "root\r" }
}
expect eof
END
# 設(shè)置變量
jdkCompressedArchive='jdk-8u331-linux-x64.tar.gz'
jdkFolder='jdk1.8.0_331'
hadoopCompressedArchive='hadoop-2.10.1.tar.gz'
hadoopFolder='hadoop-2.10.1'
hiveCompressedArchive='apache-hive-2.1.1-bin.tar.gz'
hiveFolder='apache-hive-2.1.1-bin'
# 解壓軟件
tar -zxvf /root/$jdkCompressedArchive -C /usr/local
tar -zxvf /root/$hadoopCompressedArchive -C /usr/local
tar -zxvf /root/$hiveCompressedArchive -C /usr/local
# 編輯環(huán)境變量
cat >> /etc/profile << EOF
# Java Development Kit Environment
export JAVA_HOME=/usr/local/$jdkFolder
export PATH=\$PATH:\$JAVA_HOME/bin
# Hadoop Environment
export HADOOP_CONF_DIR=/usr/local/$hadoopFolder/etc/hadoop
export HADOOP_HOME=/usr/local/$hadoopFolder
export PATH=\$PATH:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin
# Hive Environment
export HIVE_HOME=/usr/local/hiveFolder
export PATH=\$PATH:\$HIVE_HOME/bin
EOF
source /etc/profile
# 配置hadoop
sed 's@export JAVA_HOME=${JAVA_HOME}@export JAVA_HOME=/usr/local/jdk1.8.0_331@g' $HADOOP_HOME/etc/hadoop/hadoop-env.sh -i
sed '/<configuration>/,/<\/configuration>/d' $HADOOP_HOME/etc/hadoop/core-site.xml -i
cat >> $HADOOP_HOME/etc/hadoop/core-site.xml << EOF
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-2.10.1/data</value>
</property>
</configuration>
EOF
sed '/<configuration>/,/<\/configuration>/d' $HADOOP_HOME/etc/hadoop/hdfs-site.xml -i
cat >> $HADOOP_HOME/etc/hadoop/hdfs-site.xml << EOF
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.secondary.http-address</name>
<value>localhost:50090</value>
</property>
</configuration>
EOF
# 格式化hdfs
hadoop namenode -format
# 啟動hdfs
start-dfs.sh
# 配置hive
cp $HIVE_HOME/conf/hive-env.sh.template $HIVE_HOME/conf/hive-env.sh
cat >> $HIVE_HOME/conf/hive-env.sh << EOF
export HIVE_CONF_DIR=$HIVE_HOME/conf
export JAVA_HOME=$JAVA_HOME
export HADOOP_HOME=$HADOOP_HOME
export HIVE_AUX_JARS_PATH=$HIVE_HOME/lib
EOF
cp $HIVE_HOME/conf/hive-default.xml.template $HIVE_HOME/conf/hive-site.xml
sed -i 's#${system:java\.io\.tmpdir}#/usr/local/hive/iotmp#g' $HIVE_HOME/conf/hive-site.xml
sed -i 's#${system:user\.name}#root#g' $HIVE_HOME/conf/hive-site.xml
hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -mkdir -p /tmp/hive/
hdfs dfs -chmod 750 /user/hive/warehouse
hdfs dfs -chmod 777 /tmp/hive
schematool --initSchema -dbType derby
# sed -i '/cdef/r add.txt' input.txt
# expect
# spawn
# send
# timeout -1
# interact