Ansuble介绍
自动化运维工具Ansible是基于python编写
ansible是一个同时管理多个远程主机的软件
只要是通过ssh协议登录的主机,就可以完成ansible自动化部署操作:
-
批量文件分发
-
批量数据复制
-
批量数据修改,删除
-
批量自动化安装软件服务
-
批量服务启停脚本化
-
自动批量服务部署
ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署的是ansible所运行的模 块,ansible只是提供一种框架。
connection plugins:连接插件------负责和被监控端实现通信,默认使用SSH连接
host inventory:主机清单------是一个配置文件里面定义监控的主机
modules : 模块------核心模块、command模块、自定义模块等
plugins : modules功能的补充----包括连接插件,邮件插件等
playbook:编排--------定义 Ansible 多任务配置文件,非必需。服务部署的流程:
上传tar包-解压-改名字-写变量-检测是否成功
安装
准备环境
主机:3台 1个控制节点Ansible, 2个被控制节点
控制节点
1. 配置EPEL网络yum源
[root@ansible-server ~]# yum install -y epel-release
2. 安装ansible
[root@ansible-server ~]# yum install -y ansible
3.查看版本
[root@ansiable-server ~]# ansible --version
4.看帮助
[root@ansible-server ~]# ansible --help
命令 | 作用 |
---|---|
-m module | 指定模块,默认为command模块 |
–version | 显示版本 |
-v | 详细过程 -vv -vvv更详细过程 |
–list | 显示主机列表,也可以用–list-hosts |
-k | 提示输入ssh连接密码,默认key认证 |
-C | 预执行检测 |
-T | 执行命令的超时时间,默认10s |
-u | 指定远程执行的用户 |
-b | 执行sudo切换身份操作 |
-become-user | 指定sudo的用户 |
-K | 提示输入sudo密码 |
基础操作
-
配置文件
ansible经常操作的配置文件有两个 主配置文件: /etc/ansible/ansible.cfg #主要设置一些ansible初始化的信息,比如日志存放路径、模块、等配置信息 主机清单文件: 默认位置/etc/ansible/hosts #设置被管理主机的相关信息
添加被管理主机
-
添加单个主机
vim /etc/ansible/hosts #在最后追加被管理端的机器 192.168.157.101 #单独指定主机,可以使用主机名称或IP地址
- 添加主机群 [root@ansible-server ~]# vim /etc/ansible/hosts [webservers] #使用[]标签指定主机组 ----标签自定义 192.168.157.101 #如果未解析添加ip,解析添加主机名 192.168.157.102
- 包含其他组
-
[webservers1] #组一 ansible-web1 [webservers2] #组二 ansible-web2 [weball:children] #children是关键字 表示 weball中包含 webserver1 和 webserver2 webservers1 #组一 webservers2 #组二
-
- 为一个组设置内置变量
-
[weball:vars] #vars关键字,表示为weball组群设置变量 ansible_ssh_port=22 #指定ssh端口 ansible_ssh_user=root #指定用户
-
-
-
执行命令
#语法
ansible <pattern> -m <module_name> -a <arguments> ...pattern:主机清单里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则
-m module_name: 模块名称,默认为command
-a arguments: 传递给模块的参数
ansible weball -m command -a "hostname" -k -u root
颜色 | 含义 |
---|---|
绿色 | 执行成功但为对远程主机做任何改变 |
黄色 | 执行成功并对远程主机做改变 |
红色 | 执行失败 |
ansible有两种运行模式
Ad-hoc 命令行运行模式,适合执行短小命令
playbook 剧本模式,适合执行复杂命令
Ad-hoc
命令行运行模式,通过在shell中输入命令完成自动化控制
#语法
ansible <pattern> -m <module_name> -a <arguments> ...
pattern:主机清单里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则
-m module_name: 模块名称,默认为command
-a arguments: 传递给模块的参数都有什么模块??
ansible-doc -l #查看支持的模块
常用模块
command---远程执行命令
模块参数详解:
free_from:要执行的命令一个命令,注意只有该参数不需要键值对形式
注意该命令中不能有shell命令的特殊字符,如果想执行有,使用shell模块
chdir: 在执行命令前先进入到指定目录
creates: 在执行命令前先判断指定文件是否存在,存在则不执行,不存在则执行
removes: 在执行命令前先判断指定文件是否存在,存在则执行,不存在则不执行
输出当前目录
ansible weball -m command -a "pwd"
/tmp/a.txt文件存在则不输出当前目录,否则输出
ansible weball -m command -a "pwd creates=/tmp/a.txt"
/tmp/a.txt文件不存在则不输出当前目录,否则输出
ansible weball -m command -a "pwd removes=/tmp/a.txt"
shell---远程执行命令
与command模块作用相同,但是命令中可以有特殊字符
script---脚本执行模块
将管理机的脚本传输到节点运行
copy---远程复制模块
模块参数详解:
src:指定源文件路径
dest:目标地址(拷贝到哪里)
owner:指定属主
group:指定属组
mode:指定权限,可以以数字指定比如0644
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
远程复制
vim a.txt #创建一个测试文件
123123
ansible weball -m copy -a 'src=/root/a.txt dest=/opt owner=root group=root mode=644'远程复制并备份
vim a.txt #追加如下内容
123123
234234
ansible weball -m copy -a 'src=/root/a.txt dest=/opt/ owner=root group=root mode=644 backup=true'
file---文件管理模块
用于创建,修改文件及目录
参数
path:创建的文件或目录的路径
owner:指定属主
group:指定属组
mode:指定权限,可以以数字指定比如0644
src:指定源文件路径 用于创建软链接
dest:软链接位置
state:
directory 创建目录
touch 创建文件
link 创建软连接
absent 删除
远程创建文件夹
ansible weball -m file -a "path=/tmp/shuaihui mode=666 state=directory"
远程创建文件
ansible weball -m file -a "path=/tmp/shuaihui/hello2.txt mode=666 state=touch"
远程创建软连接
ansible weball -m file -a "src=/tmp/shuaihui/hello2.txt dest=/tmp/hl.txt state=link"
远程删除文件
ansible weball -m file -a "path=/tmp/shuaihui/hello2.txt state=absent"
yum--远程下载
yum远程安装nginx
[root@localhost tmp]# ansible weball -m yum -a "name=nginx state=present"
yum远程更新nginx
[root@localhost tmp]# ansible weball -m yum -a "name=nginx state=latest"
yum远程删除nginx
[root@localhost tmp]# ansible weball -m yum -a "name=nginx state=absent"
cron---定时任务
[root@localhost ~]# ansible weball -m cron -a "name=dateflush job='htpdate ntp.aliyun.com' minute=0 hour=0 state=absent"
每天0时更新时间
corn远程删除定时任务
[root@localhost ~]# ansible weball -m cron -a "name=dateflush job='htpdate ntp.aliyun.com' minute=0 hour=0 state=absent"
playbook
playbook顾名思义,即剧本,现实生活中演员按照剧本表演,在ansible中,这次由被控计算机表演,进行安装,部署应用,提供对外的服务等,以及组织计算机处理各种各样的事情。
剧本的编写需要用到.yml或.yaml文件
编写规范
1)大小写敏感2)使用缩进表示层级关系
3)缩进时不允许使用Tab键,只允许使用空格。
4)缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
5)键值使用:分割,且值与:之间有一个空格
5)使用‘-’表示同组
班级如下
name=一班 address=一楼 student= (name=dawa,sex=m),(name=erwa,sex=f)
name=二班 address=二楼 student= (name=sanwa,sex=m),(name=siwa,sex=f)
name=三班 address=三楼 student= (name=wuwa,sex=m),(name=liuwa,sex=f)
-name: 一班
address: 一楼
student:
- name: dawa
sex: m
- name: erwa
sex: f
-name: 二班
address: 二楼
student:
- name: sanwa
sex: m
- name: siwa
sex: f
-name: 三班
address: 三楼
student:
- name: wuwa
sex: m
- name: liuwa
sex: f
playbook中的参数
name:
定义playbook或者task的名称(描述信息),每一个play都可以完成一个任务。
hosts:
hosts用于指定要执行指定任务的主机.
user:(去root化)www-data /data/log/拥有所有权限
remote_user则用于指定远程主机上的执行任务的用户
tasks:
任务列表play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。
vars:
定义变量(如果不使用内部变量需要提前定义)
vars_files:
调用定义变量文件
notify:
任务执行结果如果是发生更改了的则触发定义在handler的任务执行
handlers:
用于当前关注的资源发生变化时采取一定指定的操作
使用playbook创建/tmp/pb1.txt
[root@ansible-server ~]# cd /tmp/ansible/
[root@ansible-server ansible]# vim test.yml #创建文件必须以.yml/.yaml结尾
---
- name: pb_test
hosts: weball
user: root
tasks:
- name: pb_test1
file: path=/tmp/pb1.txt state=touch
检测语法:
[root@ansible-server ansible]# ansible-playbook --syntax-check test.yml
运行Playbook:
[root@ansible-server ansible]# ansible-playbook test.yml #加剧本名称
使用playbook条件触发器
handlers:由特定条件触发的Tasks
handlers:处理器
notify:触发器
语法:
tasks:
- name: TASK_NAME
module: arguments #1.上面任务执行成功,然后
notify: HANDLER_NAME #2.通知他
handlers:
- name: HANDLER_NAME #3.一一对应,这里的描述与notify定义的必须一样
module: arguments #4.执行这个命令
---
- hosts: weball
user: root
tasks:
- name: test shell
shell: pwd creates=/tmp/pb1.txt
notify: h1
handlers:
- name: h1
file: path=/tmp/pb2.txt state=touch
当shell执行时,创建pb2.txt
不执行时,不创建
使用playbook循环
循环:迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为”item”,使用with_item属性给定要迭代的元素;将zhangsan,lisi,wangwu 输出到pb3.txt中
---
- hosts: weball
name: while
user: root
tasks:
- name: test while
shell: echo {{item}} >>/tmp/pb3.txt
with_items:
- zhangsan
- lisi
- wangwu
自定义参数
参数文件
vi vars.yml
---
- hosts: weball
user: root
vars_files:
- /tmp/ansible/vars.yml
tasks:
- name: copy test
copy: src={{ src_path }} dest={{ dest_path }}
批量部署Jdk+Tomcat
- hosts: webadd
user: root
tasks:
- name: copy Jdk1.8
copy: src=/tmp/jdk-8u171-linux-x64.rpm dest=/tmp
- name: rpm to java
shell: rpm -ivh /tmp/jdk-8u171-linux-x64.rpm
- name: configure envirement1
shell: echo -e "JAVA_HOME=/usr/local/java\nPATH=$JAVA_HOME/bin:$PATH\nCLASSPATH=." >> /etc/profile
- name: flush profile
shell: source /etc/profile
- name: copy tomcat
copy: src=/tmp/apache-tomcat-8.5.78.tar.gz dest=/tmp
- name: unzip tomcat
shell: tar -xvzf /tmp/apache-tomcat-8.5.78.tar.gz -C /tmp
- name: start tomcat
shell: nohup /tmp/apache-tomcat-8.5.78/bin/startup.sh &
总结
安装
控制节点
1. 配置EPEL网络yum源
[root@ansible-server ~]# yum install -y epel-release
2. 安装ansible
[root@ansible-server ~]# yum install -y ansible
3.查看版本
[root@ansiable-server ~]# ansible --version
4.看帮助
[root@ansible-server ~]# ansible --help
添加被管理主机
vim /etc/ansible/hosts #在最后追加被管理端的机器
执行命令
输出当前目录
ansible weball -m command -a "pwd"
/tmp/a.txt文件存在则不输出当前目录,否则输出
ansible weball -m command -a "pwd creates=/tmp/a.txt"
/tmp/a.txt文件不存在则不输出当前目录,否则输出
ansible weball -m command -a "pwd removes=/tmp/a.txt"
copy---远程复制模块
vim a.txt #创建一个测试文件
123123
ansible weball -m copy -a 'src=/root/a.txt dest=/opt owner=root group=root mode=644'远程复制并备份
vim a.txt #追加如下内容
123123
234234
ansible weball -m copy -a 'src=/root/a.txt dest=/opt/ owner=root group=root mode=644 backup=true'
远程创建文件夹
ansible weball -m file -a "path=/tmp/shuaihui mode=666 state=directory"
远程创建文件
ansible weball -m file -a "path=/tmp/shuaihui/hello2.txt mode=666 state=touch"
远程创建软连接
ansible weball -m file -a "src=/tmp/shuaihui/hello2.txt dest=/tmp/hl.txt state=link"
远程删除文件
ansible weball -m file -a "path=/tmp/shuaihui/hello2.txt state=absent"
yum远程安装nginx
[root@localhost tmp]# ansible weball -m yum -a "name=nginx state=present"
yum远程更新nginx
[root@localhost tmp]# ansible weball -m yum -a "name=nginx state=latest"
yum远程删除nginx
[root@localhost tmp]# ansible weball -m yum -a "name=nginx state=absent"
cron---定时任务
[root@localhost ~]# ansible weball -m cron -a "name=dateflush job='htpdate ntp.aliyun.com' minute=0 hour=0 state=absent"
每天0时更新时间
corn远程删除定时任务
[root@localhost ~]# ansible weball -m cron -a "name=dateflush job='htpdate ntp.aliyun.com' minute=0 hour=0 state=absent"