使用cloud-init初始化配置服务器环境及初始化项目,阿里云实践

目的

使用cloud-init编写脚本,在创建服务器的时候就写入脚本,在无人值守的情况下完成服务环境的配置/软件的安装(nginx/php等)/自己开发的项目的初次部署及配置.

在创建阿里云ECS的时候写入:

Screen Shot 2017-10-27 at 7.33.09 PM.png

脚本如下,我把注释写到里面了,所以就不在说明了.

主要干了两件事:

  1. 服务器基本环境配置
  2. 项目的初始化安装配置

要用cloud-init的,需要先看下cloud-init官网

#cloud-config
users:
  - default
# 创建用户www,nginx和php-fpm均使用该用户及组,web应用的所有者/组也是www.
# 日常部署任务也是使用www,所以sudo添加了重启php-fpm的权限
  - name: www
    sudo:
        - ALL=(ALL)NOPASSWD:/bin/systemctl restart php-fpm.service
# 创建用于平时登录服务器的账户mallto,配置ssh-authorized-keys
  - name: wahaha
    groups: www,wheel
    ssh-authorized-keys:
        - ssh-rsa [马赛克]
    sudo:
# dep 是php的一个部署工具的命令,在阿里云的RDC上时使用wahaha该用户连接服务器执行命令的,
# 所以需要以www用户的身份执行部署任务,不然创建的文件都是wahaha的了,还要在修改所有者等.
        - ALL=(www)NOPASSWD:/usr/local/bin dep
# 设置root和mallto的密码
chpasswd:
  expire: false
  list: |
    root:[马赛克]
    mallto:[马赛克]
package_upgrade: true
# 因为后面部署项目需要从git库拉取代码,所以要配置www的ssh密钥对和known_hosts,
# 在这里直接设置文件的`owner`属性不行,因为文件的写入先于www用户的创建.所以后面的命令中还需要修改文件拥有者
write_files:
- content: |
    [马赛克]
  path: /home/www/.ssh/known_hosts
  permissions: '0644'
- content: |
    ssh-rsa [马赛克]
  path: /home/www/.ssh/id_rsa.pub
  permissions: '0600'
- content: |
    -----BEGIN RSA PRIVATE KEY-----
    [马赛克]
    -----END RSA PRIVATE KEY-----
  path: /home/www/.ssh/id_rsa
  permissions: '0600'
runcmd:
# 修改默认的ssh端口
  - sed -i -e '/^#Port/s/^.*$/Port 8888/' /etc/ssh/sshd_config
# 因为创建阿里云ECS的时候,没有设置密码选择的是秘钥登录,所以默认是禁止了密码登录,配置中只禁止了root登录
  - sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin no/' /etc/ssh/sshd_config
# 修改上面write_files创建文件的所有者
  - chown -R www /home/www
  - chgrp -R www /home/www
  - systemctl reload sshd
# yum源配置,我使用cloud-init的yum_repos设置一直不行...
  - yum install -y epel-release
  - yum install -y https://dl.iuscommunity.org/pub/ius/stable/CentOS/7/x86_64/ius-release-1.0-15.ius.centos7.noarch.rpm
  - yum install -y https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
  - yum install -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  - yum update
# 安装postgresql客户端,因为使用的是阿里云的数据库服务,所以不安装数据库服务
  - yum install -y postgresql96
# 安装nginx并配置运行用户
  - yum install -y nginx
  - sed -i -e '/^user  nginx;/s/^.*$/user  www www;/' /etc/nginx/nginx.conf
  - systemctl start nginx
  - systemctl enable nginx
# 安装php-fpm及常用库及配置运行用户
  - yum install -y php71u-fpm
  - systemctl start php-fpm
  - systemctl enable php-fpm
  - yum install -y php71u-gd php71u-mysqlnd php71u-pdo php71u-mcrypt php71u-mbstring php71u-json php71u-cli php71u-xml php71u-pgsql php71u-pecl-redis php71u-opcache
  - sed -i -e '/^user = php-fpm/s/^.*$/user = www/' /etc/php-fpm.d/www.conf
  - sed -i -e '/^group = php-fpm/s/^.*$/group = www/' /etc/php-fpm.d/www.conf
# 配置opcache的黑名单
  - echo '/app/back_end/*/integration' >> /etc/php.d/opcache-default.blacklist
  - echo '/app/back_end/*/test' >> /etc/php.d/opcache-default.blacklist
  - systemctl reload php-fpm
# 安装其他常用库,从OneinStack抄的
  - yum install -y deltarpm gcc-c++ cmake autoconf libpng-devel freetype-devel libxml2 libxml2-devel zlib-devel glib2-devel bzip2 bzip2-devel ncurses-devel libaio numactl numactl-libs readline-devel libcurl-devel e2fsprogs-devel krb5-devel libidn-devel openssl-devel libxslt-devel libicu-devel libevent-devel libtool bison gd-devel pcre-devel zip unzip ntpdate sqlite-devel expect expat-devel rsync git lsof lrzsz mlocate
  - updatedb
# 安装部署工具
  - curl -LO https://deployer.org/deployer.phar
  - mv deployer.phar /usr/local/bin/dep
  - chmod +x /usr/local/bin/dep
# 创建项目目录
  - mkdir -p /app/back_end
  - chown -R www /app
  - chgrp -R www /app
  - chmod -R 775 /app
# 拉取web项目初始化部署需要的文件配置及命令
  - cd /home/www
  - su - www -c 'git clone git@code.aliyun.com:wahaha/project_init.git'
  - chmod +x /home/www/project_init/project_install.sh
  - chmod +x /home/www/project_init/nginx_config_install.sh
  - chmod +x /home/www/project_init/composer.sh
# 这安装composer的命令没用,php composer-setup.php 这句执行不了,不知道为什么....我先是放在runcmd中也不行  
  - /home/www/project_init/composer.sh
# web项目的nginx配置初始化  
  - /home/www/project_init/nginx_config_install.sh
# 项目初始化  
  - su - www -s /home/www/project_init/project_install.sh

项目初始化用的的几个shell脚本如下:

composer.sh:
#!/bin/bash
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer
/usr/local/bin/composer config -g repo.packagist composer https://packagist.phpcomposer.com

php composer-setup.php执行失败...原因还不知道

nginx_config_install.sh:
#!/bin/bash
cp -r /home/www/project_init/nginx.conf/* /etc/nginx/conf.d/
systemctl reload nginx
project_install.sh:

我这里三个环境的名字是:production/staging/test,各个文件的目录也是这样

#!/bin/bash
# Author:  never615 <never615 AT gmail.com>
# BLOG:  http://never615.com
#
. /home/www/project_init/option.sh


# 克隆项目,部署项目的各个环境
cd /home/www
mkdir projects
cd projects
for repository in ${repositorys[@]}
do
  echo ${repository}
  git clone ${repository}
done

for path in `ls`
do
  echo $path
  tempPath="/home/www/projects/${path}"
  cd "${tempPath}/deploy"
  for deploy in `ls`
  do
    if [$deploy == "production"]
    then
      git checkout master
    else
      git checkout develop
    fi
    cd "${tempPath}/deploy/${deploy}"
    /usr/local/bin/dep -vvv deploy ${deploy}
  done
done


初次部署项目使用的是工具deploy,在我们其他项目中也有介绍,如:
使用deployer部署工具配合阿里云RDC完成部署
deployer文档

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,087评论 18 139
  • ** 首发于www.dongxiaoxia.xyz ** 本篇文章主要围绕一个问题:本地开发完项目后如何简单部署到...
    东小侠阅读 4,420评论 1 67
  • Welcome 目前网络上充斥着大量的陈旧信息,让PHP新手误入歧途,传播着错误的实践和糟糕的代码,这必须得到纠正...
    layjoy阅读 21,595评论 7 118
  • Composer Repositories Composer源 Firegento - Magento模块Comp...
    零一间阅读 3,940评论 1 66
  • 这两天以“服务至上,顾客至上”著称的海底捞,栽了。 曾经以一本《海底捞你学不会》让餐饮乃至其他行业都奉若至宝,海底...
    菜菜元阅读 401评论 0 2