weblogic虚拟路径配置

前言

weblogic的虚拟路径配置有两种:

约定

详细配置

  1. 在/var/upload目录下创建WEB-INF目录,然后添加

    1. web.xml 内容如下
      1
      2
      3
          <web-app></web-app>
      ```
      2. `weblogic.xml` 内容如下
      /upload
      1
      2. 修改domain下的config/config.xml,增加如下内容,然后启动服务即可
      upload yourserver war /var/upload/ 100 DDOnly nostage false ```
  2. 配置详解

    1. name 部署名称,无特殊作用
    2. target 填写为实际部署的服务名称
    3. source-path 需要映射的物理路径
    4. staging-mode 重点!!!此处必需设为nostage,表示不复制到webloigc的stage目录下
    5. 其他配置项均为常规配置项
  3. 其他注意事项

    1. (如果是在界面上配置部署,生成的默认配置是<staging-mode xsi:nil="true"></staging-mode>,要修改为nostage时务必去掉xsi:nil="true",因为xsi:nil="true"的意思是表示标签中的内容为空)

附 关于stage

weblogic有三种部署模式

  1. nostage
    不把项目复制到stage下,服务直接读取指定路径作为部署内容
  2. stage
    把部署项目复制到服务的stage目录下
  3. External_Stage
    借助第三方工具部署项目

参考

https://blog.csdn.net/wolf863292/article/details/7615323

https://blog.csdn.net/ahhsxy/article/details/6873542


weblogic安装(无界面静默安装)

一、环境准备

1. 用户准备

Generic通用版weblogic不能用ROOT用户安装,如无其他用户需先创建用户,创建用户步骤此处略过

2. 下载weblogic

在官网下载weblogic,将下载好的jar包上传到linux服务器上

3. JDK环境

如果原来已配置好JDK环境可跳过该步骤
步骤

  1. 编辑器打开.bash_profile文件
    1
    vi ~/.bash_profile
  2. 填写jdk相关环境变量
    1
    2
    3
    export JAVA_HOME=/usr/local/jdk1.7.0_80
    export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
    export PATH=$JAVA_HOME/bin:$PATH
  3. 使配置生效
    source ~/.bash_profile

    二、安装

    0. 约定

  4. 本例中安装路径为/usr/local/weblogic12c,可根据自己情况修改
    最终目录结构为
    1
    2
    3
    4
    /usr/local/weblogic12
    |--bea // 程序目录
    |--user_projects // 域集合
    |--xxxDomain // 域
    注:weblogic下可以创建多个域,很多教程创建域时目录命名为domain,与bea同级,如此不利于多个域的管理,所以把域归集到user_projects目录下,一个项目对应一个域
  5. 用户 weblogic
    用户组 weblgoicgroup

    1. 创建oraInst.loc文件

    注:文件路径无所谓,注意修改inst_group为实际的组名
    1
    vi oraInst.loc
    1
    2
    inventory_loc=/home/weblogic/oraInventory
    inst_group=weblgoicgroup

    安装程序使用Oracle清单目录来跟踪安装在计算机上的所有Oracle产品。清单目录中存放的文件名为orainst.loc。如果该文件不存在于您的系统上,则必须在启动静默安装之前创建该文件。安装程序使用此文件。
    用你想要安装程序创建清单目录的完整路径目录替换oui_inventory_directory。然后,用其成员有这个目录的写权限的组的名称替换oui_install_group。

    2. 创建响应文件wls.rsp

    注:文件路径无所谓,注意修改ORACLE_HOME
    1
    vi wls.rsp
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    [ENGINE]
    #DO NOT CHANGE THIS.
    Response File Version=1.0.0.0.0
    [GENERIC]
    #The oracle home location. This can be an existing Oracle Home or a new Oracle Home
    ORACLE_HOME=/usr/local/weblogic12c/bea
    #Set this variable value to the Installation Type selected. e.g. WebLogic Server, Coherence, Complete with Examples.
    INSTALL_TYPE=WebLogic Server
    #Provide the My Oracle Support Username. If you wish to ignore Oracle Configuration Manager configuration provide empty string for user name.
    MYORACLESUPPORT_USERNAME=
    #Provide the My Oracle Support Password
    MYORACLESUPPORT_PASSWORD=<SECURE VALUE>
    #Set this to true if you wish to decline the security updates. Setting this to true and providing empty string for My Oracle Support username will ignore the Oracle Configuration Manager configuration
    DECLINE_SECURITY_UPDATES=true
    #Set this to true if My Oracle Support Password is specified
    SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
    #Provide the Proxy Host
    PROXY_HOST=
    #Provide the Proxy Port
    PROXY_PORT=
    #Provide the Proxy Username
    PROXY_USER=
    #Provide the Proxy Password
    PROXY_PWD=<SECURE VALUE>
    #Type String (URL format) Indicates the OCM Repeater URL which should be of the format [scheme[Http/Https]]://[repeater host]:[repeater port]
    COLLECTOR_SUPPORTHUB_URL=
  6. 安装
    注:注意指定wls.rsp和oraInst.loc路径
    1
    java -jar fmw_12.1.3.0.0_wls.jar -silent -responseFile /usr/local/weblogic12c/wls.rsp -invPtrLoc /usr/local/weblogic12c/oraInst.loc
    安装过程比较久,耐心等待即可

    三、创建域

    0. 准备

  7. 由于Linux下的Java生成随机数规则与Windows的机制不一样,需要修改securerandom.source为/dev/./urandom (原值为/dev/random),否则会出现创建、启动域的时候耗时非常长的问题。(共性问题,请放心更改,如不放心可百度权威解释)
    1
    2
    3
    4
    5
    cd $JAVA_HOME/jre/lib/security
    vi java.security
    securerandom.source=file:/dev/random
    # 修改为
    securerandom.source=file:/dev/./urandom
  8. 配置环境变量
    1
    vi ~/.bash_profile
    1
    export MW_HOME=/usr/local/weblogic12c/bea
    1
    source ~/.bash_profile

    1. 创建域

  9. 创建目录
    1
    mkdir /usr/local/weblogic12c/user_projects/xxxDomain
  10. 执行运行文件
    1
    2
    3
    cd $MW_HOME/wlserver/common/bin
    ./commEnv.sh
    ./wlst.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    wls:/offline> 
    wls:/offline> readTemplate('/usr/local/weblogic12c/bea/wlserver/common/templates/wls/wls.jar')
    wls:/offline/base_domain>cd('Servers/AdminServer')
    wls:/offline/base_domain/Server/AdminServer>set('ListenAddress','')
    wls:/offline/base_domain/Server/AdminServer>set('ListenPort', 7001)
    wls:/offline/base_domain/Server/AdminServer>cd('/')
    wls:/offline/base_domain>cd('Security/base_domain/User/weblogic')
    wls:/offline/base_domain/Security/base_domain/User/weblogic>cmo.setPassword('YourPassword')
    wls:/offline/base_domain/Security/base_domain/User/weblogic>setOption('OverwriteDomain', 'true')
    wls:/offline/base_domain/Security/base_domain/User/weblogic>writeDomain('/usr/local/weblogic12c/user_projects/xxxDomain')
    wls:/offline/domain/Security/domain/User/weblogic>closeTemplate()
    wls:/offline>exit()
    注:注意根据需要修改端口、密码、域路径

    四、启动weblogic

    1
    2
    3
    cd /usr/local/weblogic12c/user_projects/xxxDomain/bin/ -- 进入创建的域目录bin下
    ./startWebLogic.sh -- 后台启动使用nohup ./startWebLogic.sh &
    ./stopWeblogic.sh -- 关闭weblogic
    启动浏览器访问weblogic控制台http://IP:7001/console,用户名默认是weblogic,密码是创建域时设置的。

《Maven实战》笔记
  • (P47)需求用例模板

  • (P67)在 项目B中可以使用元素指定X、Y模块是可选依赖,此时X、Y模块只对当前项目B影响,项目A依赖于项目B的时候X、Y模块将不会被传递;当项目A依赖于项目B的时候,如果实际使用中需要使用X模块则需要在项目A中显式声明X模块依赖,选择使用Y模块时同理。(请留意下一点,不建议使用可选依赖)
    f21944ea-d6a0-41f8-bfc6-e3d15da8bb0e.png

  • (P68)在理想的情况下,是不应该使用可选依赖的,使用可选依赖的原因是某一个项目实现了多个特性,在面向对象设计中,应遵循单一职责性原则。在上例中,更好的做法是为X和Y分别创建一个Maven项目,基于同样的groupId分配不同的artifactId,如com.juvenxu.mvnbook:project-b-x和com.juvenxu.mvnbook:project-b-y。

  • (P79)修改M2_HOME/conf/settings.xml文件可以修改maven的全局配置项,但是建议把该文件复制到/.m2目录下再进行修改,因为如果直接改maven安装目录下的settings.xml文件将会对本机的所有用户影响,而修改/.m2/settings.xml则可以控制只对当前用户生效,避免对其他用户造成不必要的干扰。(个人认为windows系统比较少存在多用户的情况,直接修改M2_HOME/conf/settings.xml也无妨)

  • (P83)【远程仓库调用】大部分远程仓库无需认证就可以访问,但有时候出于安全方面的考虑,我们需要提供认证信息才能访问一些远程数据库。配置认证信息和配置仓库信息不同,仓库信息可以直接配置在POM文件中,但是认证信息必须匹配置在settings.xml文件中。这是因为POM往往被提交到代码仓库中供所有成员访问,而settings.xml一般只放在本机,相对更安全。
    setttings.xml中通过配置认证信息,其中必须与POM中repository元素的id完全一致。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <settings>
    ...
    <servers>
    <id>my-proj</id>
    <username>repo-user</username>
    <password>repo-pwd</password>
    <servers>
    ...
    </settings>
  • (P86)Maven的快照机制

  • (P90)由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而无法下载构件

  • (P117)一般来说,一个项目的子模块都应该使用同样的groupId,如果它们一起开发和发布,换应该使用同样的version,此外,它们的artifactId还应该使用一致的前缀,以方便同其他项目区分。

  • (P118)例:account-persist的Java代码位于默认的src/mainjava目录,包含Account.java、AccountPersistServiceImpl.java和AccountPersistException.java四个文件,它们的包名都是com.juvenxu.mvnbook.accoount.persist,该包名与account-persist的groupId com.juvenxu.mvnbook.account及artifactId account-persist对应。

  • (P126)聚合模块与其他模块的目录结构并非一定要是夫子关系。

    • 聚合模块的父子目录结构
      ae480e4e-0a24-4cb3-a9ef-b87f1acfafaa.png
    • 聚合模块的平行目录结构
      65853ead-8f80-43d2-ac51-4220871e3245.png
      如果使用平行目录结构,聚合模块的POM也需要做响应的修改,以指向正确的模块目录:
      1
      2
      3
      4
      <modules>
      <module>../account-email</module>
      <module>../account-persist</module>
      </modules>
  • (P128)作为父模块,其打包类型必须是pom
    由于父模块只为了帮助消除配置的重复,因此它本身不包含除POM之外的项目文件,也就不需要src/main/java/之类的文件夹了

  • (P131)dependencyManagement元素的使用

  • (P137)多模块Maven项目中的聚合与继承其实是两个概念,其目的完全是不同的。前者主要是为了方便快速构建项目,后者主要是为了消除重复配置。
    在现有的实际项目中,往往会出现一个POM既是聚合POM,又是父POM,这么做主要是为了方便。

  • (P145)模块间的依赖关系会将反应堆构成一个有向非循环图,各个模块是该图的节点,依赖关系构成有向边。这个图不允许出现循环,因此,当出现模块A依赖于模块B,而B又依赖于A的情况时,Maven就会报错。

  • (P145)裁剪反应堆

  • (P153)Nexus的仓库列表

  • (P195)Hudson(jenkins)的使用

  • (P231)web项目依赖于servlet-api和jsp-api这两个包,它们为servlet和jsp的编译提供支持。需要注意,这两个依赖的范围是provided,表示它们最终不会被打包至war文件中,这是因为几乎所有Web容器都会提供这两个类库,如果war包中重复出现,就会导致潜在的依赖冲突问题。

  • (P231)配置可以指定war包名称

  • (P246)Maven的版本号定义约定如下:
    <主版本>.<次版本>.<增量版本>-<里程碑版本>
    如1.3.4-beta-2,1表示该版本是第一个重大版本;3表示这是基于重大版本的第三个次要版本;4表示该次要版本的第四个增量;beta-2表示该增量的某一次里程碑

  • (P263)profile


基于maven的profile实现动态选择配置文件

需求

根据选择不同的部署环境自动替换相关配置变量,如连接的数据库等。

最终效果概览

  • 部署环境分为dev和release
  • 工程目录结构
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    myproject
    |-profile
    | |-dev
    | | |-dbconfig.properties
    | |-release
    | |-dbconfig.properties
    |-src
    | |-main
    | |-java
    | |-webapp
    | |-resources
    | |-dbconfig.properties
    |-pom.xml
  • 部署时执行命令
    • dev
      mvn clean package -Pdev
    • release
      mvn clean package -Prelease

实现步骤

1. 编辑各环境的变量

按如下结构创建目录和文件(各目录、文件的名字和路径均可更改,与下一步的配置对应即可)

1
2
3
4
5
6
myproject
|-profile
| |-dev
| | |-dbconfig.properties
| |-release
| |-dbconfig.properties

dev/dbconfig.properties内容如下

1
2
3
4
jdbc.url=jdbc\:oracle\:thin\:@111.00.00.111\:1521\:orcl
jdbc.username=myproject
jdbc.password=myproject_test
jdbc.dbType=oracle

release/dbconfig.properties内容如下

1
2
3
4
jdbc.url=jdbc\:oracle\:thin\:@222.00.00.222\:1521\:orcl
jdbc.username=myproject
jdbc.password=myproject_release
jdbc.dbType=oracle

项目实际访问的数据库配置文件位于myproject/src/main/resources/dbconfig.properties,内容如下

1
2
3
4
jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}
jdbc.dbType=${jdbc.dbType}

在部署过程中${xxx}将被替换为对应环境的值,变量名称与dev/dbconfig.properties、release/dbconfig.properties的字段名对应。

2. pom.xml中配置profile

在pom.xml的<project></project>中添加如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<profiles>
<profile>
<!-- 开发环境 -->
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<filters>
<filter>${basedir}/profile/dev/dbconfig.properties</filter>
</filters>
</build>
</profile>

<profile>
<!-- 生产环境 -->
<id>release</id>
<build>
<filters>
<filter>${basedir}/profile/release/dbconfig.properties</filter>
</filters>
</build>
</profile>
</profiles>

此处添加两个profile,分别为开发环境的dev和正式环境的release,其中dev环境配置了<activeByDefault>true</activeByDefault>,指定dev为默认配置

3. 激活过滤资源

pom.xml配置资源时,针对待替换的资源设置<filtering>true</filtering>。本例中配置为src/main/resources下的所有properties文件都需要检测替换。

1
2
3
4
5
6
7
8
9
10
11
12
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>

4. 部署

mvn命令中-P可指定profile
根据配置中profile的id可选择对应的部署环境,如部署到正式环境时执行如下命令即可完成打包
mvn clean package -Prelease

其他

IDEA中的使用

在idea的Maven Project标签中可以看到项目配置的profile,如果通过<activeByDefault>true</activeByDefault>指定了默认环境,在项目构建过程将会自动勾选默认的环境,如此可以在其他开发成员对profile概念不熟悉时仍然能正常运行项目。


【杂谈】我又迁服务器了

之前

迁移前我是用着香港VPS的,为什么选择境外?因为可以用来搭建VPN,而且价格相对便宜。

为什么要迁

  1. 国内很多服务都需要备案的域名才能使用,如微信公众号开发、七牛CDN等,无奈~
  2. 阿里云有活动,服务器便宜啊!

为什么不想迁

备案麻烦这一点不是我所顾虑的,毕竟我就是想备案。不想迁的主要原因是境内服务器无法搭建科学上网服务,现在我只能另外再买个最低配的VPS专门搭建VPN,而且因为价格问题买不到香港的VPS,只能选择美国西岸的机子,速度比较勉强,心痛。

迁移前的顾虑

应该也有其他人有跟我一样的顾虑,我大致说说

  • 1M带宽够吗
    境外的VPS一般都是100M带宽限流量的模式,阿里云参与活动的机子都是固定带宽的,1M看起来好像什么都做不了。首先我担心的是上传速度问题,按我们的理解1M对应的下载速度大概只有100k/s,要是上传速度只有100k/s,那要是做javaweb开发时上传个war包都能等哭。其实阿里云ECS的上传速度是不限制的(用户上传到服务器的操作对服务器来说是下载,所以准确点说是阿里云服务器的下载速度是不限制的),只跟本地上传速度相关,所以上传文件这一点不需要担心。另外一点就是网站访问速度,服务器的带宽需求一般是根据同时在线人数计算的,就是理解为一秒内请求的文件大小在1M以内带宽都是通畅的,只要带宽通畅那速度是跟10M都是一样的,所以对于1M够不够用这个问题只要考虑网站的并发量即可,不要像个人带宽一样以为10M带宽就一定比1M更快,作为个人博客1M带宽一般都足够的。
  • 1核1G内存够吗
    带宽只需考虑并发量,而CPU核数是真正影响到计算能力的,理论上肯定是CPU越强响应速度越快,不过对于个人博客,在并发压力不高的情况下1核的处理能力也是可以满足的,在其他方面优化可能比购买更高核数配置的机器效果更明显,如CDN等。(为了减少机子计算压力和方便以后服务迁移,我是另外购置了数据库服务的,当然1核1G的机子再装个mysql我觉得也是问题不大的,这一点我没亲测~)

Ansible实战[附录一]——Ansible命令参数列表
-m MODULE\_NAME, --module-name=MODULE\_NAME     要执行的模块,默认为 command  
-a MODULE_ARGS, --args=MODULE_ARGS      模块的参数  
-u REMOTE_USER, --user=REMOTE_USER ssh      连接的用户名,默认用 root,ansible.cfg 中可以配置
-k, --ask-pass      提示输入 ssh 登录密码,当使用密码验证登录的时候用     
-s, --sudo      sudo 运行
-U SUDO_USER, --sudo-user=SUDO_USER     sudo 到哪个用户,默认为 root
-K, --ask-sudo-pass     提示输入 sudo 密码,当不是 NOPASSWD 模式时使用
-B SECONDS, --background=SECONDS            run asynchronously, failing after X seconds(default=N/A)
-P POLL_INTERVAL, --poll=POLL_INTERVAL      set the poll interval if using
-B (default=15)
-C, --check     只是测试一下会改变什么内容,不会真正去执行
-c CONNECTION   连接类型(default=smart)
-f FORKS, --forks=FORKS     fork 多少个进程并发处理,默认 5
-i INVENTORY, --inventory-file=INVENTORY        指定 hosts 文件路径,默认 default    =/etc/ansible/hosts
-l SUBSET, --limit=SUBSET       指定一个 pattern,对<host_pattern>已经匹配的主机中再过滤一次
--list-hosts        只打印有哪些主机会执行这个 playbook 文件:不是实际执行该 playbook
-M MODULE_PATH, --module-path=MODULE_PATH       要执行的模块的路径,默认为/usr/share/ansible/
-o, --one-line      压缩输出,摘要输出
--private-key=PRIVATE_KEY_FILE      私钥路径
-T TIMEOUT, --timeout=TIMEOUT   ssh 连接超时时间,默认 10 秒
-t TREE, --tree=TREE            日志输出到该目录,日志文件名会以主机名命名
-v, --verbose   verbose mode (-vvv for more, -vvvv to enable connection debugging)

Ansible实战[三] ——自动化部署实战例子

前言

本文中的脚本例子没实际执行过,是基于成功运行过的脚本提炼修改而成,语法细节上可能会有错漏,主要用于理解过程。
另外,例子中基本只使用到shell模块,有些操作用ansible自带模块效果更佳,在执行过程中ansible也会有相应优化提示,读者可自行优化。

场景

  • 控制终端 10.10.10.10
  • 受控节点
    • group1
      • 11.11.11.11
    • group2
      • 12.12.12.12
      • 13.13.13.13
  • 实现目标
    达到不停服务完成自动化发布的目的。
  • 执行过程
    1. 上传war包到控制终端;
    2. 从控制终端复制war包到group1节点;
    3. 复制group1节点上tomcat原来部署的war包到控制终端备份,并追加时间戳重命名;
    4. 重启tomcat进行部署;
    5. 检测group1节点上的tomcat是否成功启动,如果成功启动则继续往下执行;
    6. 从控制终端复制war包到group2所有节点,然后重启tomcat进行部署。

操作流程

一、配置主机

hosts清单如下

[group1]
11.11.11.11
[group2]
12.12.12.12
13.13.13.13
[myproject:children]
group1
group2

二、配置变量

vim /etc/ansible/group_vars/myproject

ansible_ssh_user: deploy
new_war_location: /var/deploydata/deploy/ROOT.war
backup_location: /var/deploydata/deploy/backupwar
tomcat_home: /home/deploy/tomcat/apache-tomcat-7.0.73_9898_dianjianbao
control_machine_ip: 10.10.10.10

三、编写脚本

注:此处默认主机间可以相互免密登录,具体配置可参考《linux配置ssh免密登录》
脚本代码如下

main.yml

- name: deploy group1
  hosts: group1_dianjianbao
  tasks:
    # 备份旧war包
    - name: backup war
      shell: scp  {{ tomcat_home }}/webapps/ROOT.war root@{{ control_machine_ip }}:{{ backup_location }}/ROOT$(date +"%Y%m%d%H%M%S").war
      # 忽略tomcat从未部署过war包会提示ROOT.war不存在的错误
      ignore_errors: yes
    - name: del old war
      shell: rm -f {{ tomcat_home }}/ROOT.war
      ignore_errors: yes
    - include: tomcat_deploy.yml
    # 暂停40s等待tomcat的启动过程
    - name: sleep 40s
      shell: sleep 40s
- name: deploy group2
  hosts: group2_dianjianbao
  tasks:
    # 检测group1主机的tomcat状态
    # (curl命令会持续监听待检测服务直到其作出响应或超时,所以虽然上边定义只暂停40s,
    # 但是实际情况tomcat的启动过程稍微大于40s是允许的)
    - name: tomcat status
      shell: curl http://10.46.66.94:9898 &>/dev/null && echo YES || echo NO
      # 此处忽略错误是因为无论成功与否都要把输出结果注入到register的变量中
      ignore_errors: True
      # 把上一条命令的执行结果赋值给is_tomcat_success
      register: is_tomcat_success
    - include: tomcat_deploy.yml
      # 此处可理解为当is_tomcat_success.stdout 为yes时,则执行include tomcat_deploy.yml
      # (命令执行结果是一个map形式,其中包含stdout代表标准输出,所以此处是is_tomcat_success.stdout获取变量值)
      # (如果需要查看变量的具体结果,可以使用debug模块查看指定变量
         - name: Show debug info 
           debug: var=is_tomcat_success verbosity=0)
      when: is_tomcat_success.stdout == "YES"

tomcat_deploy.yml

- name: stop tomcat
  action: shell {{ tomcat_home }}/bin/shutdown.sh
  # 忽略原本并没有tomcat运行的错误提示
  ignore_errors: yes
- name: del ROOT dir
  shell: rm -rf {{ tomcat_home }}/webapps/ROOT
  ignore_errors: yes
- name: del old war
  shell: rm -f {{ tomcat_home }}/webapps/ROOT.war
  ignore_errors: yes
- name: copy war
  shell: scp  root@{{ control_machine_ip }}:{{ new_war_location }}  {{ tomcat_home }}/webapps/ROOT.war
- name: start tomcat
  shell: chdir={{ tomcat_home }}/bin nohup ./startup.sh &

四、执行脚本

ansible-playbook main.yml

[目录]
[上一篇] Ansible实战[二] ——playbook初探



Ansible实战[二] ——playbook初探

简述

Ansible的脚本被称为playbook,playbook是基于YAML语法进行编写的,一个playbook会包含多个play,每个play中会包含一系列的任务,所有的play组合起来共同完成一系列的运维操作。

YAML语法简介

1、列表

每一个YAML文件都是从一个列表开始,列表中的所有成员都开始于相同的缩进级别, 并且使用一个”- “作为开头(一个横杠和一个空格),如

# Address Book
- Amy
- Jerry
- Tom

2、哈希/字典

在YAML中使用键值对表示成员属性,它们被称为“哈希” 或 “字典”,如

name: amy
age: 20

也可以用以下语法表示字典集(在Ansible中不常见)

{name: amy, age: 20}

更常见的情况是每一个列表都是包含一组字典集,如

# Address Book
- name: Amy
  age: 20
- name: Jerry
  age: 21
  job: teacher
- name: Tom
  age: 25

playbook结构示例

#playbookdemo.yml
#play1
- hosts: group1
  vars: 
    tomcat_home: ~/tomcat
  tasks:
    - name: shutdown tomcat
      shell: {{ tomcat_home }}/bin/shutdown.sh
    - name: startup tomcat
      shell: {{ tomcat_home }}/bin/startup.sh
#play2
- hosts: group2
  tasks:
    - name: restart nginx
      shell: service nginx restart

示例详解:

  • 实例playbook中包含了两个play,分别针对group1主机组和group2主机组进行了一些操作
  • play1的tasks中包含了两个操作,而两个操作都是通过调用shell模块执行linux命令
  • 除了shell模块,Ansible还内置了许多非常常用的模块,如远程复制的copy模块
  • 脚本中通过的形式使用变量,变量的定义可以在play中的vars定义,也可以在之前文章提到的在hosts文件、组变量文件中定义
  • tasks中的每一个任务都指定name值可以提高脚本执行时的易读性

执行ansible脚本

通过ansible-playbook命令可以执行yml脚本,如

ansible-playbook demo.yml

执行后输出结果如图所示
QQ截图20170317084823.png

如果希望能够看见执行过程中的调试信息可增加-verbose参数

ansible-playbook -verbose demo.yml

[目录]
[上一篇] Ansible实战[一]——Ansible基础
[下一篇] Ansible实战[三] ——自动化部署实战例子



linux配置ssh免密登录

简述

ssh 无密码登录需要使用公钥与私钥,在linux下可以使用ssh-keygen生成公钥/私钥对

场景

  • 将要登录的主机ip为10.10.10.10
  • 以deploy用户登录

步骤

  1. 生成key

    ssh-keygen

    QQ截图20170310175140.png

  2. 复制key
    过程中需要输入ssh登录密码
    ssh-copy-id -i ~/.ssh/id_rsa.pub deploy@10.10.10.10

  3. 测试登录
    若配置成功则无需输入密码即可成功ssh登录
    ssh root@192.168.0.4

  4. 退出
    exit


Ansible实战[一]——Ansible基础

一、Ansible简介

Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible本身只提供一个框架,真正工作的是它内置的各种模块,通过各模块的组装配合完成一系列操作。Ansible通常以执行脚本的方式去实现自动化运维,Ansible的脚本被称为playbook,基于yaml语法编写,一个playbook可以包含多个play,每个play中可以通过调用多个模块实现部署操作。

二、安装Ansible

在CentOS下直接yum即可安装

yum install ansible

输入ansible –version输出如下信息即代表安装成功
QQ截图20170310143837.png

Ansible的配置文件目录结构

-- /etc/ansible
  |-- ansible.cfg    # ansible的相关配置项
  |-- hosts          # 待连接的主机列表(可以配置独立主机或主机组)

三、基于命令行初探Ansible

3.1 写在前边

ansible主要还是以编写playbook脚本,然后执行playbook脚本来操作节点,比较少直接在控制端逐条地输入执行命令去操作受控节点,所以本小节只介绍ansible命令的简单用法,用于初步感受ansible的执行方式,后边章节将会讲解更为常用的playbook部分。

3.2 场景介绍

  • 控制终端 10.10.10.10

  • 受控节点

    • 11.11.11.11

    • 12.12.12.12

      3.3 修改hosts文件配置主机列表

      hosts文件里的初始备注已经列举了配置例子,看两眼基本都能懂,此处就不详细介绍语法了。本例中我们把受控节点的两个服务器ip归回test组,hosts文件配置如下

      [test]
      11.11.11.11
      12.12.12.12

3.4 测试连接受控节点

输入如下命令

ansible test -m ping -u deploy -k

若执行结果返回的是pong则代表访问成功

11.11.11.11 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

例子详解

  • test 指定需要控制的主机组为test,若指定为all则hosts文件中所有的主机都将被控制
  • -m 指定将要执行的模块
  • ping 执行ansible的ping模块
  • -u 指定以哪个用户登录受控节点,例子中指定登录用户为deploy,若不指定默认为root
  • -k 提示输入 ssh 登录密码,当使用密码验证登录的时候用

3.5 配置免密登录

每次执行ansible命令都指定密码是非常不方便的,而把密码在配置文件中填写只能用明文保存,这样安全性很低。为解决这个问题,通常的做法是配置主机间免密登录,具体配置方式请参考《linux配置ssh免密登录》

3.6 命令参数

参见《Ansible实战[附录一]——Ansible命令参数列表》

四、主机管理进阶

4.1 组嵌套

利用组嵌套可实现组与组之间的层级关系,提高可管理性
以下配置指定了group1、group2隶属于test组下

[group1]
10.10.10.10
[group2]
11.11.11.11
[test:children]
group1
group2

4.2 变量

通过指定变量可以在ansible执行时自动获取相应变量,例如指定变量ansible_ssh_user后在连接到主机时将会自动以变量中指定的用户登录,无需每次敲写指定用户。除了ansible_ssh_user外还有许多其他的系统参数可以更改,如ansible_ssh_pass等;当然除了系统参数外,还可以填写自定义参数(在playbook中可以用到)。

4.2.1在hosts文件中指定变量
  • 方法一 在主机后直接带上变量

    [test]
    10.10.10.10 ansible_ssh_user=deploy1
    11.11.11.11 ansible_ssh_user=deploy2

  • 方法二 对一个指定变量

    [test]
    10.10.10.10
    11.11.11.11

    [test:vars]
    ansible_ssh_user=deploy

4.2.2 在外部添加变量

  • 所有主机共享变量
    在/etc/ansible目录下创建host_vars文件,在该文件中可以指定特定变量,该变量将会对所有主机生效。
    注意变量与值之间是用冒号而不是等号

    ansible_ssh_user: deploy
    ansible_ssh_pass: 123456

  • 组内共享变量
    在/etc/ansible目录下创建group_vars目录,在该目录下以hosts文件中配置的组为文件名创建文件,如test,然后在新建的文件中指定变量则可实现组内共享变量。
    注意变量与值之间是用冒号而不是等号

    ansible_ssh_user: deploy
    ansible_ssh_pass: 123456


[目录]
[下一篇] Ansible实战[二]——playbook初探