什么是ansible
ansible是一款简单的运维自动化工具,只需要使用ssh协议连接就可以进行系统管理,自动化执行命令,部署等任务。
Ansible的特点
1、ansible不需要单独安装客户端,也不需要启动任何服务
2、ansible是python中的一套完整的自动化执行任务模块
3、ansible playbook 采用yaml配置,对于自动化任务执行过一目了然
Ansible组成结构
Ansible
是Ansible的命令工具,核心执行工具;一次性或临时执行的操作都是通过该命令执行。
Ansible Playbook
任务剧本(又称任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,yaml格式。
Inventory
Ansible管理主机的清单,默认是/etc/ansible/hosts文件。
Modules
Ansible执行命令的功能模块,Ansible2.3版本为止,共有1039个模块。还可以自定义模块。官网参考地址:https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
Plugins
插件,模块功能的补充,常有连接类型插件,循环插件,变量插件,过滤插件,插件功能用的较少。
API
提供给第三方程序调用的应用程序编程接口。
本文通过ansible-playbook部署jdk项目展开说明
项目目录结构
|–ansible #默认ansible项目路径/etc/ansible
| hosts #配置ansible目标服务器
| jdk.yml #jdk入口文件
| ansible.cfg #配置文件
|–roles #角色
|–jdk #jdk角色文件夹
|–files #一般用于存放除配置文件外的其他文件,如部署安装包
|–templates #用于存放配置文件,可以引用变量
|–tasks #用于存放任务脚本
| main.yml #任务脚本
|–vars #用于存放变量文件
| main.yml #变量文件
hosts
[jdk] #代表组名,下包含服务器
jdk01 ansible_ssh_port=22 ansible_ssh_host=192.168.5.110 ansible_ssh_user=root
jdk02 ansible_ssh_port=22 ansible_ssh_host=192.168.5.111 ansible_ssh_user=root
jdk03 ansible_ssh_port=22 ansible_ssh_host=192.168.5.112 ansible_ssh_user=root
jdk04 ansible_ssh_port=22 ansible_ssh_host=192.168.5.113 ansible_ssh_user=root
jdk05 ansible_ssh_port=22 ansible_ssh_host=192.168.5.114 ansible_ssh_user=root
jdk06 ansible_ssh_port=22 ansible_ssh_host=192.168.5.115 ansible_ssh_user=root
jdk07 ansible_ssh_port=22 ansible_ssh_host=192.168.5.116 ansible_ssh_user=root
ansible.cfg
如:需要显示任务执行耗时:可修改参数
callback_whitelist = profile_tasks
jdk.yml
---
- hosts: jdk
roles:
- role: jdk
tags:
- jdk
注意一个缩进单位为两个空格,不能使用\t
vars/main.yml
IP: “{{ansible_default_ipv4[‘address’]}}” #定义变量IP为目标服务器ip地址
tasks/main.yml
---
#创建临时文件夹用于存放jdk部署包
- name: Creating remote directory
file:
path: /opt/deploy/jdk/
state: directory
#复制jdk部署包到远程服务器上
- name: Copying rpm packages to remote server
copy:
src: '{{item.src}}'
dest: '{{item.dest}}'
owner: root
group: root
mode: 0755
with_items:
- {src: '/etc/ansible/roles/jdk/files',dest: /opt/deploy/jdk/}
#卸载远程服务器上的旧版jdk
- name: Removing openjdk
yum:
name: "{{item.name}}"
state: "{{item.state}}"
with_items:
- {name: java-1.7.0-openjdk-headless.x86_64,state: absent}
- {name: java-1.8.0-openjdk-headless.x86_64,state: absent}
#删除远程服务器上的旧版jdk相关文件
- name: Removing old jdk files
file:
path: "{{item.path}}"
state: "{{item.state}}"
with_items:
- {path: '/usr/local/jdk1.8.0_191',state: 'absent'}
- {path: '/usr/bin/java',state: 'absent'}
- {path: '/usr/bin/jar',state: 'absent'}
#解压jdk部署包
- name: Unarchiving jdk package
unarchive:
src: /opt/deploy/jdk/files/jdk-8u191-linux-x64.tar.gz
dest: /usr/local
creates: /usr/local/jdk1.8.0_191
remote_src: yes
#创建jdk软连接
- name: Create java link
file:
src: "{{item.src}}"
dest: "{{item.dest}}"
state: "{{item.state}}"
with_items:
- {src: /usr/local/jdk1.8.0_191/bin/java,dest: /usr/bin/java,state: link}
- {src: /usr/local/jdk1.8.0_191/bin/jar,dest: /usr/bin/jar,state: link}
- {src: /usr/local/jdk1.8.0_191/bin/jps,dest: /usr/bin/jps,state: link}
#配置环境变量JAVA_HOME
- name: Configing JAVA_HOME
lineinfile:
path: /etc/profile
line: 'export JAVA_HOME=/usr/local/jdk1.8.0_191'
create: yes
#使环境变量生效
- name: Sourcing JAVA_HOME
shell: source /etc/profile
#判断jdk是否正常安装
- name: Jdk installed unsuccessfully
shell: ls /usr/local/jdk1.8.0_191/bin/java
register: result
ignore_errors: true
failed_when: result.stdout.find('1.8.0_191') == -1
#jdk部署成功
- name: Jdk installed successfully
debug: msg="服务器{{IP}}已成功部署jdk1.8.0_191"