Ansible

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密码

基础操作

  1. 配置文件

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

       vim /etc/ansible/hosts  #在最后追加被管理端的机器
      192.168.157.101                #单独指定主机,可以使用主机名称或IP地址
    2. 添加主机群                                                                                                  [root@ansible-server ~]# vim /etc/ansible/hosts                                          [webservers]        #使用[]标签指定主机组 ----标签自定义                            192.168.157.101        #如果未解析添加ip,解析添加主机名              192.168.157.102          
    3. 包含其他组
      1. [webservers1]     #组一
        ansible-web1
        [webservers2]     #组二
        ansible-web2
        [weball:children]      #children是关键字  表示 weball中包含 webserver1 和 webserver2
        webservers1        #组一  
        webservers2        #组二
    4. 为一个组设置内置变量
      1. [weball:vars]         #vars关键字,表示为weball组群设置变量
        ansible_ssh_port=22     #指定ssh端口  
        ansible_ssh_user=root   #指定用户

  2. 执行命令

#语法
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"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值