linux自动化运维工具---ansible

自动化运维工具Ansible

人工运维

人工运维时代运维人员早期需要维护数量众多的机器,因此需要执行反复,重复的劳动力,很多机器需要同时部署相同的服务或是执行相同的命令,还得反复的登录不同的机器,执行重复的动作

自动化运维

早期运维人员会结合ssh免密登录以及shell脚本来完成自动化的部署操作。

系统管理员面临的问题主要是,配置管理系统,远程执行命令,批量安装服务,启停服务等等

后来也就诞生了众多的开源软件,自动化运维软件

  • fabric

  • puppet

  • saltstack

  • chef

  • Ansible<<<<<<<<<<

其中有两款软件是基于python语言开发的,saltstack,ansible都是基于python编写

自动化运维的好处

  • 提高工作效率

  • 减少重复性的劳动力操作

  • 大大的减少了人为出错的可能性

  • 支持数据化管理,数据化追源,找到问题的来源点

Ansible简介

ansible是一个同时管理多个远程主机的软件。通过shh协议实现了,管理节点(老板,安装了ansible服务的机器),被管理节点(员工,被管理的机器节点)的通信。

只要是通过ssh协议登录的主机,就可以完成ansible自动化部署操作

  • 批量文件分发

  • 批量数据复制

  • 批量数据修改,删除

  • 批量自动化安装软件服务

  • 批量服务启停脚本化

  • 自动批量服务部署

模块化

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

 connection plugins:连接插件,负责和被监控端实现通信,默认使用SSH连接
 host inventory:主机清单,是一个配置文件里面定义监控的主机
 modules : 模块,核心模块、command模块、自定义模块等
 plugins : modules功能的补充,包括连接插件,邮件插件等
 playbook:编排,定义 Ansible 多任务配置文件,非必需。服务部署的流程:上传tar包-解压-改名字-写变量-检测是否成功

安装

  1. 准备环境

    环境:
    主机:3台  1个控制节点Ansible, 2个被控制节点
  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密码

基础操作

  1. 配置文件

    ansible经常操作的配置文件有两个
    主配置文件:
    /etc/ansible/ansible.cfg  #主要设置一些ansible初始化的信息,比如日志存放路径、模块、等配置信息
    主机清单文件:
    默认位置/etc/ansible/hosts #设置被管理主机的相关信息

    添加被管理主机

    1. 添加单个主机

      [root@ansible-server ~]# vim /etc/ansible/hosts  #在最后追加被管理端的机器
      192.168.157.113                      #单独指定主机,可以使用主机名称或IP地址
    2. 添加主机群

      [root@ansible-server ~]# vim /etc/ansible/hosts 
      [webservers]        #使用[]标签指定主机组 ----标签自定义
      192.168.157.113        #如果未解析添加ip,解析添加主机名
      192.168.157.114         
    3. 包含其他组

      [webservers1]     #组一
      ansible-web1
      [webservers2]     #组二
      ansible-web2
      [weball:children]      #children是关键字  表示 weball中包含 webserver1 和 webserver2
      webservers1        #组一  
      webservers2        #组二
    4. 为一个组设置内置变量

      [weball:vars]         #vars关键字,表示为weball组群设置变量
      ansible_ssh_port=22     #指定ssh端口  
      ansible_ssh_user=root   #指定用户

      5,别名连接其他服务器

      • 配置 /etc/hosts

      • 配置 /etc/ansible/hosts

      配置完别名后需要用别名从新远程连接一次打通连接

      # ssh root@node01

  2. 执行命令

    #语法
    ansible  <pattern>   -m <module_name>   -a <arguments>  ...
    
    pattern:主机清单里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则
    -m module_name: 模块名称,默认为command
    -a arguments: 传递给模块的参数
    [root@localhost ansible]# ansible weball -m command -a "hostname" -k -u root
    颜色含义
    绿色执行成功但为对远程主机做任何改变
    黄色执行成功并对远程主机做改变
    红色执行失败

Ansible模式

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: 在执行命令前先判断指定文件是否存在,存在则执行,不存在则不执行
输出当前目录
[root@localhost tmp]# ansible weball -m command -a "pwd"

/tmp/a.txt文件存在则不输出当前目录,否则输出
[root@localhost tmp]# ansible weball -m command -a "pwd creates=/tmp/a.txt"

/tmp/a.txt文件不存在则不输出当前目录,否则输出
[root@localhost tmp]# ansible weball -m command -a "pwd removes=/tmp/a.txt"

shell---远程执行命令
与command模块作用相同,但是命令中可以有特殊字符
copy---远程复制模块
模块参数详解:  
src:指定源文件路径
dest:目标地址(拷贝到哪里)
owner:指定属主
group:指定属组
mode:指定权限,可以以数字指定比如0644
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
远程复制
[root@ansible-server ~]# vim a.txt  #创建一个测试文件
123123
[root@ansible-server ~]# ansible weball -m copy -a 'src=/root/a.txt dest=/opt owner=root group=root mode=644'
远程复制并备份
[root@ansible-server ~]# vim a.txt  #追加如下内容
123123
234234
[root@ansible-server ~]# 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 删除
远程创建文件夹
[root@localhost tmp]# ansible weball -m file -a "path=/tmp/shuaihui mode=666 state=directory"

远程创建文件
[root@localhost tmp]# ansible weball -m file -a "path=/tmp/shuaihui/hello2.txt mode=666 state=touch"

远程创建软连接
[root@localhost tmp]# ansible weball -m file -a "src=/tmp/shuaihui/hello2.txt dest=/tmp/hl.txt state=link"

远程删除文件
[root@localhost tmp]# ansible weball -m file -a "path=/tmp/shuaihui/hello2.txt state=absent"

yum--远程下载
使用yum远程安装
参数说明
name指定安装软件包名或软件包URL
state指定yum对应的方法,present(Defaults)表示安装;absent表示卸载;latest表示安装最新版本软件包,支持多程序一起安装,用逗号隔开
enablerepo允许从哪些仓库获取软件
disablerepo禁止从哪些仓库获取软件
exclude排除某些软件包,例如kernel
download_only仅下载软件包,不安装
disable_gpg_check不进行gpg检测
update_cache可以在安装包的同时更新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---定时任务
minute:设置计划任务中分钟设定位的值,默认为””。
hour:同上
day:同上
month:同上
weekday:此参数用于设置计划任务中周几设定位的值,默认为””。
special_time:可用值有 reboot(重启后)、yearly(每年)、annually(每年,与yearly相同)、monthly(每月)、weekly(每周)、daily(每天)、hourly(每时)。
注意:当上述时间单位设定参数都未指定时,计划任务的时间设定默认会被设定为”* * * * *”,这样表示每秒都会执行一次计划任务,所以,在使用cron模块时,我们应该确定对应的时间参数设置正确。


user:设置当前计划任务属于哪个用户。
job:指定计划的任务中需要实际执行的命令或者脚本。
name:设置计划任务的名称。
state:当计划任务有名称时,修改或删除对应的任务,当删除计划任务时,需要将 state 的值设置为 absent。
disabled:当计划任务有名称时,我们可以根据名称使对应的任务”失效”(注释掉对应的任务)。
backup:如果此参数的值设置为 yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron 模块会在远程主机的 /tmp 目录下创建备份文件,以 crontab 开头并且随机加入一些字符,具体的备份文件名称会在返回信息的 backup_file 字段中看到,推荐将此此参数设置为 yes。
cron远程添加定时任务
[root@localhost ~]# ansible weball -m cron -a "name=dateflush job='ntpdate ntp.aliyun.com' minute=0 hour=0"

每天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文件格式规范
剧本的编写需要用到.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: 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属性给定要迭代的元素; 
---
- hosts: weball
  name: while
  user: root
  tasks:
  - name: test while
    shell: echo {{item}} >>/tmp/pb3.txt
    with_items:
    - zhangsan
    - lisi
    - wangwu
------------------------------------------------------------------------------------------------将zhangsan,lisi,wangwu 输出到pb3.txt中
自定义参数
参数文件
  1. 自定义参数文件

    [root@ansible-server vars]# vi vars.yml 
  2. 编写剧本

    ---
    - hosts: weball
      user: root
      vars_files:
      - /tmp/ansible/vars.yml  # 文件引入
      tasks:
      - name: copy test
        copy: src={{ src_path }} dest={{ dest_path }}
临时参数
---
- hosts: weball
  name: var test
  user: root
  vars:
  - src_path: /tmp/ansible/pb5.txt
  - dest_path: /tmp
  tasks:
  - name: var 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 &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值