zoukankan      html  css  js  c++  java
  • ansible简介

    ansible介绍

    一、ansible介绍

    1.1 概念

    Ansible自动化运维工具,基于Python开发,集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

    1.2 特点

    (1) no agents:不需要在被管控主机上安装任何客户端;

    (2) no server:无服务器端,使用时直接运行命令即可;

    (3) modules in any languages:基于模块工作,可使用任意语言开发模块;

    (4) yaml,not code:使用yaml语言定制剧本playbook;

    (5) ssh by default:基于SSH工作;

    (6) strong multi-tier solution:可实现多级管理。

    1.3 优势

    (1) 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;

    (2) 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;

    (3) 使用python编写,维护更简单;

    (4) 支持sudo。

    1.4 工作机制

    image-20191205201704208

    Ansible : 核心

    Modules : 包括 Ansible 自带的核心模块及自定义模块

    Plugins : 完成模块功能的补充,包括连接插件、邮件插件等

    Inventory : 定义 Ansible 管理主机的清单

    Playbooks : 剧本;定义 Ansible 多任务配置文件,由Ansible 自动执行

    1.5 工作流程

    image-20191205201727183

    二、Ansible安装

    1 先安装Centos7版本的EPEL源后再安装Ansible

    1
    2
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    yum -y install ansible

    2 测试 ansible –version

    image-20191206085722237

    3 Ansible配置文件

    1
    2
    3
    4
    /usr/bin/ansible-doc        帮助文件
    /usr/bin/ansible-playbook 指定运行任务文件
    /etc/ansible/ansible.cfg 主配置文件
    /etc/ansible/hosts 主机清单
    三、实验:环境准备
    3.1 准备工作
    1
    2
    一台主控主机:10.0.0.8 (Centos7.6)
    一台被控主机:10.0.0.9 (Centos7.6)

    主控与被控可以相互通信!!

    安装要求:

    1
    2
    3
    4
    控制主机:需要安装 Python2.6/2.7 安装方法见上
    管理主机:需要安装 Python2.4 以上版本,关闭selinux

    centos7.6默认python版本为2.7.5

    3.2 主控主机配置主机清单

    1
    2
    vim /etc/ansible/hosts
    10.0.0.9

    3.3 配置控制主机SSH密钥

    在控制主机中生成ssh密钥对

    1
    ssh-keygen -t rsa   # 一路回车默认

    3.4 拷贝公钥至被控机

    将公钥拷贝到管理主机中.ssh/authorized_keys文件中,实现免密码登录远程管理主机

    1
    ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.9

    image-20191206090644715

    (ssh-copy-id命令会自动将id_rsa.pub文件的内容追加到远程主机root用户下.ssh/authorized_keys文件中)

    3.5 ansible配置

    vim /etc/ansible/ansible.cfg

    找到以下两行, 将其取消注释

    1
    2
    host_key_checking = False   # 禁用每次执行ansbile命令检查ssh key host
    log_path = /var/log/ansible.log #开启日志记录

    测试:主控机

    image-20191206090935397

    四、常用模块使用

    4.1 ping(测试远程主机运行状态)

    测试主机是否连通,用法很简单,不涉及参数

    1
    ansible all -m ping

    4.2 setup(查看远程主机基本信息)

    setup模块,主要用于获取主机信息,在playbooks里经常会用到的一个参数gather_facts就与该模块相关。

    1
    ansible all -m setup

    setup模块下经常使用的一个参数是filter参数,具体使用示例如下:

    1
    ansible 10.0.0.9 -m setup -a 'filter=ansible_*_mb'  # 查看主机内存信息

    image-20191206103558546

    1
    ansible 10.0.0.9 -m setup -a 'filter=ansible_ens33'  # 查看接口为ens33的网卡信息

    image-20191206103734120

    4.3 file(设置文件属性)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    相关选项:
    group:定义文件/目录的属组
    mode:定义文件/目录的权限
    owner:定义文件/目录的属主
    path:必选项,定义文件/目录的路径
    recurse:递归设置文件的属性,只对目录有效
    src:被链接的源文件路径,只应用于state=link的情况
    dest:被链接到的路径,只应用于state=link的情况
    force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

    state相关参数:
    directory:如果目录不存在,就创建目录
    file:即使文件不存在,也不会被创建
    link:创建软链接
    hard:创建硬链接
    touch:如果文件不存在,则会创建一个新文件,如果文件或目录已存在,则更新其最后修改时间
    absent:删除目录、文件或者取消链接文件

    使用示例:
    1 远程文件链接创建

    1
    ansible [hostip] -m file -a "src=/etc/hostname dest=/opt/hostname_link state=link"

    image-20191206091711511

    被控机上查看:

    image-20191206091802453

    2 远程文件链接删除

    1
    ansible [hostip] -m file -a "path=/opt/hostname_link state=absent"

    image-20191206091921985

    4.4 copy(复制文件到远程主机)

    1
    2
    3
    4
    5
    6
    7
    8
    相关选项:
    backup:在覆盖之前,将源文件备份,备份文件包含时间信息。有两个选项:yes|no
    content:用于替代“src”,可以直接设定指定文件的值
    dest:必选项。要将源文件复制到的远程主机的绝对路径,如果源文件是一个目录,那么该路径也必须是个目录
    directory_mode:递归设定目录的权限,默认为系统默认权限
    force:如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes
    others:所有的file模块里的选项都可以在这里使用
    src:被复制到远程主机的本地文件,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用“/”来结尾,则只复制目录里的内容,如果没有使用“/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。

    实例:
    将本地文件/opt/tools/Python-3.6.6.tgz复制到远程服务器

    1
    ansible [hostip] -m copy -a "src=/opt/tools/Python-3.6.6.tgz dest=/opt/tools/Python-3.6.6.tgz owner=root group=root mode=0644"

    image-20191206092823419

    在被控机上查看:

    image-20191206092917619

    4.5 command(在远程主机上执行命令)

    1
    2
    3
    4
    5
    6
    相关选项如下:
    creates:一个文件名,当该文件存在,则该命令不执行
    free_form:要执行的linux指令
    chdir:在执行指令之前,先切换到该目录
    removes:一个文件名,当该文件不存在,则该选项不执行
    executable:切换shell来执行指令,该执行路径必须是一个绝对路径

    实例:

    1
    ansible all -m command -a "ifconfig"    # 执行命令不写入history

    image-20191206093150160

    远程文件信息查看

    1
    ansible all -m command -a "ls -l /etc/hostname"

    image-20191206093333393

    4.6 shell(切换到shell执行指定的指令)

    ​ shell的参数与command相同, 与command不同的是,此模块可以支持命令管道,同时还有另一个模块也具备此功能:raw

    实例:

    1 先在主控机本地创建一个SHELL脚本
    vim /tmp/test.sh

    1
    2
    #!/bin/sh
    date +%F_%H:%M:%S
    1
    chmod +x /tmp/test.sh  # 添加脚本可执行权限

    2 将创建的脚本文件分发到远程

    1
    ansible all -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh owner=root group=root mode=0755"

    3 远程执行

    1
    ansible all  -m shell -a "/tmp/test.sh"

    image-20191206093832254

    4.7 cron(创建和删除计划任务)

    1 创建和删除计划任务语法:

    1
    ansible [HostGroup or IP] -m cron -a "name='....' job='.....' $time"

    参数解释:

    1
    2
    3
    4
    5
    6
    7
    -m 跟模块,使用的是 cron 模块
    name= 指定计划任务的名字,方便日后管理
    job= 要执行的任务,依赖于state=present
    $time 指定具体的执行时间,minute分钟,hour小时,day 天,month 月份。weekday 0或者7代表周末。
    special_time:指定什么时候执行,参数:reboot,yearly,annually,monthly,weekly,daily,hourly
    state= 选项用来指定该任务计划是创建还是删除
    user:以哪个用户的身份执行

    2 在主控机上增加计划任务

    1
    ansible all -m cron -a "name='test cron' job='/bin/bash /tmp/test.sh' weekday=6"

    image-20191206095225425

    1
    2
    # 每月的1,10,15日的6:35清空/tmp目录的所有文件
    ansible all -m cron -a "name='clean all tmp file' job='rm -rf /tmp/*' minute=35 hour=6 day=1,10,15"

    image-20191206095536786

    3 被控机查看

    image-20191206095608032

    4 删除计划任务

    1
    2
    ansible all -m cron -a "name='test cron' state=absent"
    ansible all -m cron -a "name='clean all tmp file' state=absent"

    image-20191206101107548

    4.8 yum模块

    使用yum包管理器来管理软件包,其选项有:

    1
    2
    3
    -m 使用 yum 模块
    name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径
    state= installed removed,不加state选项默认是installed
    1
    ansible all -m yum -a "name=tree"  # 使用yum安装tree命令

    image-20191206101417097

    1
    ansible all -m yum -a "name=wget state=removed"    # 使用yum卸载wget命令

    4.9 service管理服务

    1
    2
    3
    4
    -m service 模块
    name= 必选项,系统服务名称,可以用chkconfig --list查看
    enabled= 是否开机启动,yes| no
    state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

    1 在被控机上使用yum安装一个nginx

    1
    yum install -y nginx

    2 安装好之后查看nginx服务的状态

    image-20191206101910553

    3 在主控机管理被控机的nginx服务

    1
    ansible all -m service -a "name=nginx state=started enabled=no"

    image-20191206101950592

    4 在被控机上查看当前的nginx服务状态

    image-20191206102156155

    5 在主控机上远程关闭被控机上的nginx服务

    1
    ansible all -m service -a "name=nginx state=stopped enabled=yes"

    image-20191206102349903

    4.10 其他模块使用帮助

    ​ 官方提供的可能用到模块有git、svn版本控制模块,sysctl 、authorized_key_module系统模块,apt、zypper、pip、gem包管理模块,find、template文件模块,mysql_db、redis数据库模块,url 网络模块等。具体可以参看官方手册模块部分, 或者查看帮助信息。

    1
    2
    ansible-doc -l                列出ansible所有的模块
    ansible-doc -s MODULE_NAME 查看指定模块具体适用
  • 相关阅读:
    《Java练习题》Java习题集四
    《Java基础知识》Java 泛型详解
    《Java基础知识》Java正则表达式
    《Java基础知识》Java IO流详解
    《Java基础知识》Java集合(Map)
    51nod 1191:消灭兔子 贪心+优先队列
    51nod 1430:奇偶游戏 博弈
    51nod 1429:巧克力
    POJ 1423:Big Number 求N的阶乘的长度 斯特林公式
    51nod 1103:N的倍数 抽屉原理
  • 原文地址:https://www.cnblogs.com/wpnr/p/12019270.html
Copyright © 2011-2022 走看看