使用Ansible准备机从CentOS服务器构建集群(Ansible准备章节)
这篇文章是一个案例研究系列。目录在这里。
最新的源代码正在GitHub上公开。
使用Ansible来实现以下内容。
从这里开始,使用”manageterm(Ansible管理端)”来执行。
顺便说一下,我使用PUTTY和SUPPER PUTTY(将PUTTY窗口标签化)来执行Ansible。
下面是一个类似的图像。
1. 服务器实施的步骤 suǒ zhe ge)
- 设置操作系统环境
- – 创建用户和用户组
- – 使用yum安装必要的库/中间件/软件
- – 禁用SELinux
- – 重启服务器应用SELinux的禁用设置
- – 暂时停止Firewalld
- – 创建必要的目录并设置所有者和权限
- – 将Ansible管理终端(本地)上的文件复制到adminserv01(NFS服务器)上
- – 配置HOSTS文件
- – 安装NFS,并从管理服务器(adminserv01)和AP服务器(apserv01)/DB服务器(dbserv01)连接
- – 设置环境变量
安装设置各种软件/中间件
– 安装/部署NMON
– 安装/部署Ruby
– 安装/部署Java/Tomcat
– 安装/部署Selenium
– 安装/部署Jenkins/Maven
– 安装chrony(时间服务器)
– 安装Apache并配置文件
– 安装OpenVPN并配置文件/密钥
– 安装MySQL并配置文件/密钥
防火墙设置
– 设置防火墙
更新/清理处理
– 删除不需要的文件 / 更新mlocate / 更新yum
完成构建后,将虚拟机保存为VagrantBox文件。
2. 执行目录结构
执行Ansible需要在Ansible命令中指定参数“ansible-playbook”。
Ansible-playbook可以分割成多个文件来创建。
为了符合以上的服务器配置,可以将文件分割成易于管理的结构。
文件夹结构如下。
安装Ansible后,会在/etc/ansible/下创建一个目录。
以下是原本的中文文本:
/etc/ansible/
├── ansible.cfg ・・・・・ ansible 的配置文件(本次不需要编辑)
├── execute.sh ・・・・・ 执行 ansible playbook 的脚本
├── hosts ・・・・・ 包含使用 ansible 的主机和主机组的列表
├── site.yml ・・・・・ 主要 playbook(从该文件中包含 operations 子目录)
├── operations─(1) ・・・・・ 从主要 playbook 中包含的子目录
├── roles────── ・・・・・ ansible 角色(本次不需要编辑)
├── sendfiles──(2) ・・・・・ 主要 playbook(从 manageterm 分发到每个服务器的安装程序/配置)
└── vars───────(3) ・・・・・ 自定义变量设置(在 yml 文件中进行引用)
以下是将上述文本翻译为简体中文的结果:
/etc/ansible/
├── ansible.cfg ・・・・・ ansible 的配置文件(本次无需编辑)
├── execute.sh ・・・・・ 执行 ansible playbook 的 shell 脚本
├── hosts ・・・・・ ansible 使用的主机和主机组的列表
├── site.yml ・・・・・ 主要的 playbook(从该文件中包含 operations 目录)
├── operations─(1) ・・・・・ 从主要的 playbook 中包含的子目录
├── roles────── ・・・・・ ansible 角色(本次无需编辑)
├── sendfiles──(2) ・・・・・ 主要的 playbook(从 manageterm 分发到各个服务器的安装程序/配置)
└── vars───────(3) ・・・・・ 自定义变量设置(在 yml 文件中进行引用)
红字:安装后立即配置的文件
蓝字:在服务器建设时添加的自制文件
(1) 在operations下,根据服务器配置操作,将服务器设置分割成文件。
── 0001_ansiblebef.yml
├── 0011_usergroup.yml
├── 0012_yum.yml
├── 0021_selinux.yml
├── 0031_reboot.yml
├── 0041_firewalldstop.yml
├── 0061_filedir.yml
├── 0071_filescopy.yml
├── 0075_hosts.yml
├── 0081_nfs.yml
├── 0091_env.yml
├── 1001_nmon.yml
├── 1011_ruby.yml
├── 1021_javatomcat.yml
├── 1022_selenium.yml
├── 1031_jenkinsmvn.yml
├── 1041_chrony.yml
├── 1051_apache.yml
├── 1061_openvpn.yml
├── 1071_mysql.yml
├── 3001_firewalld.yml
├── 3011_firewallreload.yml
└── 9001_finish.yml
── 0001_ansiblebef.yml
├── 0011_usergroup.yml
├── 0012_yum.yml
├── 0021_selinux.yml
├── 0031_reboot.yml
├── 0041_firewalldstop.yml
├── 0061_filedir.yml
├── 0071_filescopy.yml
├── 0075_hosts.yml
├── 0081_nfs.yml
├── 0091_env.yml
├── 1001_nmon.yml
├── 1011_ruby.yml
├── 1021_javatomcat.yml
├── 1022_selenium.yml
├── 1031_jenkinsmvn.yml
├── 1041_chrony.yml
├── 1051_apache.yml
├── 1061_openvpn.yml
├── 1071_mysql.yml
├── 3001_firewalld.yml
├── 3011_firewallreload.yml
└── 9001_finish.yml
(2) 将无法通过yum安装的安装软件和配置文件放置在sendfiles文件夹下
├── apache
│ ├── 安装程序
│ └── 设置
│ ├── ajp.conf_adminserv01
│ ├── ajp.conf_apserv01
│ ├── server_cert.pem_apserv01
│ ├── server_key.pem.nopass_apserv01
│ ├── ssl.conf_apserv01
│ └── subversion.conf_adminserv01
├── java
│ ├── 安装程序
│ │ └── jdk-7u79-linux-x64.rpm
│ └── 设置
├── jenkins_mvn
│ ├── 安装程序
│ │ ├── apache-maven-3.3.3-bin.tar.gz
│ │ └── jenkins.war
│ └── 设置
├── mysql
│ ├── 安装程序
│ └── 设置
│ ├── init.exp
│ └── my.cnf
├── nfs
│ ├── 安装程序
│ └── 设置
│ └── exports
├── openvpn
│ ├── 安装程序
│ └── 设置
│ ├── exec_ca.exp
│ ├── exec_client.exp
│ ├── exec_server.exp
│ ├── server.conf
│ └── vars
├── os
│ ├── 安装程序
│ │ └── centos7.tar.gz
│ └── 设置
│ ├── profile_init.sh
│ └── resolv.conf
├── 输出
├── selenium
│ ├── firewalld
│ │ └── selenium.xml
│ ├── 安装程序
│ │ └── selenium-server-standalone-2.48.2.jar
│ └── 设置
│ ├── node.json
│ ├── selenium.sh
│ └── selenium_systemd.template_adminserv01
└── tomcat
├── firewalld
│ └── tomcat.xml
├── 安装程序
│ └── apache-tomcat-7.0.65.tar.gz
└── 设置
├── server.xml
├── setenv.sh
├── tomcat-users.xml
├── tomcat_systemd.template
└── tomcatenviroment
在(3)个vars的子级下定义从yml文件中引用的变量。
── befdownload.yml
├── filedir.yml
├── ruby.yml
├── service.yml
├── usergroup.yml
── befdownload.yml
├── filedir.yml
├── ruby.yml
├── service.yml
├── usergroup.yml
3.主要的playbook(site.yml)
在主要的yml文件中,将服务器配置包含进去。为了方便单独检查每个服务器的配置,将其分割开来。
以下是用中文进行的原生改写:
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
主要的yml文件(site.xml)
*只写include。个别的处理委托给各自负责的yml文件来提高凝聚度。
– 主持人:全部
使用sudo:不使用
远程用户:root
任务:
– 名称:初始化Ansible
标签:全部执行
调试:消息=“将执行Ansible。”
进行操作系统环境的设置工作。
※进行操作系统本身的设置工作。
– 包括:./操作/0011_用户组.yml
– 包括:./操作/0012_yum.yml
– 包括:./操作/0021_selinux.yml
– 包括:./操作/0031_重新启动.yml
– 包括:./操作/0041_停止firewalld.yml
– 包括:./操作/0061_文件目录.yml
– 包括:./操作/0071_文件拷贝.yml
– 包括:./操作/0075_hosts.yml
– 包括:./操作/0081_nfs.yml
– 包括:./操作/0091_环境.yml
软件/中间件的安装/设置/服务启动
※将yml按照中间件/软件单元分开,尽可能在yum内实现自我完善。
– 包括:./operations/1001_nmon.yml
– 包括:./operations/1011_ruby.yml
– 包括:./operations/1021_javatomcat.yml
– 包括:./operations/1022_selenium.yml
– 包括:./operations/1031_jenkinsmvn.yml
– 包括:./operations/1041_chrony.yml
– 包括:./operations/1051_apache.yml
– 包括:./operations/1061_openvpn.yml
– 包括:./operations/1071_mysql.yml
防火墙设置
包括:./operations/3001_firewalld.yml
最后处理
包括:./operations/9001_finish.yml
1. Ansible playbook的结构
Ansible由三个部分组成。
目标(服务器或者Ansible执行用户)部分
– hosts: 所有
sudo: 否
remote_user: root
# ▼▼▼ vars(变量设置)部分
vars_files:
– ../vars/yum.yml
– ../vars/filedir.yml
– ../vars/ruby.yml
– ../vars/service.yml
– ../vars/usergroup.yml
# ▲▲▲
# ▼▼▼ 任务(执行)部分
任务:
– 名称:初始化Ansible
debug:msg=aaaaaaa
# ▲▲▲
Ansible目标部分:主机
hosts可以指定执行下方任务的服务器名称,或者不仅限于服务器名称,还可以指定在/etc/ansible/hosts中指定的组名。
而”all”特殊,表示指定了在/etc/ansible/hosts中指定的所有服务器。
书面格式:
主机 \${/etc/ansible/hosts文件中所写的服务器名称或组名称}
他正在学习汉语。
他正忙着学习汉语。
hosts all
hosts apservers
Ansible目标部分:sudo
Ansible使用SSH登录服务器并执行在yml文件中编写的任务。在执行过程中,决定是否使用sudo的是sudo模块。
格式:
sudo \${是 或 否}
我喜欢吃水果。
我喜欢吃水果。
sudo no
iv. Ansible目标部分: remote_user
使用SSH,Ansible会登录服务器并执行在yml文件中写的任务。
在执行时,我们可以通过remote_user来指定使用的用户名。
书格式:
远程用户\${在连接的服务器上执行Ansible任务的用户名}。
假如您有任何問題,請隨時與我們聯繫。
remote_user root
v. Ansible变量部分:var_files(vars)
在实际进行服务器构建时,本服务器和开发服务器有许多不同的环境特定IP地址、主机名等具体值需要进行替换。在这种情况下,将变量外部化,就可以透明地执行Ansible而无需逐个修改playbook的优点。
格式:
var_files
– ${外部文件路径设置的变量}
请你把这句话翻译成汉语。
vars_files:
- ../vars/yum.yml
- ../vars/filedir.yml
- ../vars/ruby.yml
当变量数量较少时,可以直接进行描述而无需写入外部文件。在这种情况下,可以使用”vars”进行描述。
格式:
变量:
键名:值
请帮我倒杯水。
请帮我把水倒进杯子里。
vars:
abc_path: /var/log/abc.log
任务部分的Ansible任务:tasks
tasks是Ansible的主要组成部分。
在tasks下的yml文件中编写对服务器的操作。
书格式:
远程用户 \${在连接目标服务器上运行ansible tasks的用户名}
例子:
remote_user root
在接下来的章节中,我们将主要介绍已包含playbook的tasks部分。
下一次的主题是关于使用Ansible添加用户和组。
连载的目录在【这里】。