一、操作过程(以JDK安装部署过程为例):
1、服务器准备:为受管服务器配置公钥进行连接
安装命令:
yum -y install epel-release
yum -y install ansible
生成公钥:
ssh-keygen -t rsa -P ""
复制公钥到受管服务器:
ssh-copy-id -i /root/.ssh/id_rsa.pub root@[受管服务器ip]
ps:Linux的ssh-copy-id命令没有,那是当前系统没有安装openssh-clients客户端组件,你可以通过如下命令安装:
yum install openssh-clients*
(如果安装不成功,则需要把原有的openssh相关文件先全部remove)
systemctl start sshd.service(重启ssh服务,不然以后就登不上去啦!)
检查受管节点连通性:
ansible -m ping all
2、修改受管服务器host配置:
vim /etc/ansible/hosts
在host中加入并保存:
[jdk] ---------------- 定义的分组名
受管服务器ip1
受管服务器ip2
...
3、上传jdk安装包到ansible主机的/opt/jdk/files目录,并在该目录下添加.bashrc文件
4、编写ansible剧本:
vim [playbook所在路径]/jdkinstall.yml
5、执行ansible剧本:
ansible-playbook [playbook所在路径]/jdkinstall.yml
二、playbook:可持久化使用
1、核心元素:
Hosts:执行的远程主机列表(可以为ip或定义的分组名)
Tasks:所有需要执行的任务,最少需要包括一个(name: task)元素
Vars:内置变量或自定义变量,在playbook中调用
Templates:使用模板语法的文件,如配置文件等
Handlers/notity:结合使用,用于特定条件触发的操作
tags:用于选择执行某条或某部分任务
2、基本语法:使用yaml语法格式,后缀可为yaml或yml
1.同一个playbook中可以通过三连破折号(---)区分多个play
2.缩进必须统一,空格与tab不能混用,同样的缩进代表同样的级别(建议只使用空格来进行缩进)
3.大小写敏感
4.k/v的值可同行(用:分割)也可换行,v可以是字符串也可是一个列表
3、元素属性:
1.每一个task必须要有一个name,若没有定义则action的值会用作输出信息中标记特定的task;所有在hosts中定义的主机或主机组都将执行task
2.notify action会在每一次task结束时被动触发,且只会被触发一次(如配置发生改动需要重启服务等)
3.可以在命令行执行playbook时通过- e传入变量,该变量在整个playbook中都可以被使用,其优先级比playbook中直接定义的变量优先级高,格式如下:
ansible-playbook - e "[变量名]=[值]" [playbook文件名]
4.可以在/etc/ansible/hosts文件中为主机组或单个主机定义变量,组中定义的没有单个主机中的优先级高,主机组定义变量格式如下:
[[组名]:vars]
[变量名]=[值]
5.可以将所有变量统一放在一个yaml文件中,在要使用的playbook中直接引用该文件,引用格式如下:
var_files:
- [变量文件路径]
6.可以为任务加上tag,在命令行执行playbook时可以通过-t参数来指定执行或--skip-tags来忽略某任务
三、playbook模板:提供动态配置服务,使用jinja2语言
四、使用非root账号实现自动部署:
1、以非root账号登录,为该账号在所有受管主机中增加管理员权限:
1.编辑/etc/sudoers文件,在root下添加本账号
2.删掉%wheel前的#
3.执行 sudo useradd -G root [账号名]
4.通过 id [账号名] 命令查看权限状态
2、生成公钥:
以非root账户执行命令:
ssh-keygen -t rsa -P ""
生成的公钥保存在/home/[非root账户]/.ssh/id_rsa.pub
3、复制公钥到对应受管主机:
以非root账户执行命令:
ssh-copy-id -i /home/[非root账户]/.ssh/id_rsa.pub [非root账户]@[受管服务器ip]
4、在/etc/ansible/hosts文件中配置sudo密码,在对应受管服务器后增加 ansible_sudo_pass=[账户对应的密码]
5、在对应的playbook.yml文件中启用sudo:
1.在hosts下一行配置 become: yes
2.在become下一行配置 become_method: sudo
五、使用role与template实现多任务的自动部署:
因为在实际部署中,可能会需要部署多个程序、多个主机,而不同的主机可能需要部署不同的一组程序,因此就需要对要安装的程序和主机进行切分,程序分为多个任务称为role,主机分为多个主机组称为host
1、编写主yml文件:该yml文件将作为最终去执行的ansible playbook,需要在文件中指定要执行的主机组,及该主机组要执行的任务角色;以site.yml为例:
---
- hosts: webserver
become: yes
become_method: sudo
roles:
- jdk
- nginx
- redis
- consul
...
- hosts: webclient
become: yes
become_method: sudo
roles:
- jdk
- nginx
...
2、role文件目录:每一个在主yml中使用的role需要包含以下对应的目录及文件
(1)tasks目录:必需,在该文件夹下有一个main.yml(即上面基本的playbook剧本),当ansible运行到主yml的对应role时会自动读取该yml文件并执行
(2)files目录:非必需,用于存放该role的部署操作中需要使用的文件资源,文件操作可以省略文件路径(相对路径),ansible会自动在该目录下读取对应文件
(3)templates目录:非必需,如果部署操作中有某个配置文件需要根据不同情况配置不同的参数,则可以将配置文件放入该文件夹,并为对应参数声明对应的变量;templates/文件夹下的文件需要转为jinja2类型(后缀改为.j2)
(4)vars目录:非必需,在该文件夹下有一个main.yml,用于存放本role所使用的所有变量
(5)handlers目录:非必需,目录下有一个main.yml,用于存放handlers
(6)meta目录:非必需,目录下有一个main.yml,用于定义本role的依赖关系(ansible1.3及以后的版本支持)
(7)default目录:非必需,目录下有一个main.yml,用于存放role定义的默认变量
3、在hosts文件中定义主机组:如果部分主机只执行部分的roles任务,则可以在/etc/ansible/hosts文件中为其定义单独的主机组名,并在主yml文件中配置其对应的roles
六、playbook常用语法:
1、文件操作:
1.1 创建目录:file: path=[要创建的目录路径] state=directory owner=root group=root
1.2 删除文件/目录: file: path=[要删除的文件/目录路径] state=absent
1.3 复制文件/目录:copy: src=[源文件/目录路径] dest=[目的路径]
dest如果已存在则会报错
1.4 获取远端主机文件:fetch: src=[远端主机上的文件路径] dest=[本地保存路径]
2、文件压缩/解压:
2.1 文件解压:unarchive: src=[源压缩文件路径] dest=[目的路径]
2.2 文件压缩:archive: path=[待压缩文件路径] dest=[目的路径] format=[打包的类型]
3、远程执行命令:
3.1 shell命令:shell: [shell命令]
3.2 command命令:格式同上
3.3 yum命令:yum: name=[要安装的包名] state=[present/installed/lastest/absent/remove]
present/installled表示安装程序包;lastest表示安装最新版本;absent/remove表示卸载程序包
默认安装最新版本