• Ansible自动化运维


    目录

    前言

    一、概述

    常见的开源自动化运维工具比较

    二、ansible环境搭建

    三、ansible模块

    (一)、hostname模块

    (二)、file模块

    (三)、copy模块

    (四)、fetch模块

    (五)、user模块

    (六)、group模块

    (七)、cron模块

    (八)、yum_repository模块

    (九)、yum模块

    (十)、service模块

    (十一)、script模块

    (十二)、command与shell模块

    三、playbook

    (一)、YAML格式

    (二)、Playbook常见语法

    (三)、实例

    四、roles介绍

    (一)、roles的目录结构

    (二)、roles实现lamp

      (三)、拓展安装discuz

    总结




    前言

    公司的服务器越来越多, 维护一些简单的事情都会变得很繁琐。用shell脚本来管理少量服务器效率还行, 服务器多了之后, shell脚本无法实现高效率运维。这种情况下,我们需要引入自动化运维工具, 对多台服务器实现高效运维。

    一、概述

    ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

    架构图

    特点

    • 部署简单

    • 默认使用ssh进行管理,基于python里的==paramiko==模块开发

    • 管理端和被管理端不需要启动服务

    • 配置简单,功能强大,扩展性强

    • 能过playbook(剧本)进行多个任务的编排

    常见的开源自动化运维工具比较

    1. puppet(拓展)

      基于ruby语言,成熟稳定。适合于大型架构,相对于ansible和saltstack会复杂些。

    2. saltstack(拓展)

      基于python语言。相对简单,大并发能力比ansible要好, 需要维护被管理端的服务。如果服务断开,连接就会出问题。

    3. ansible

      基于python语言。简单快捷,被管理端不需要启服务。直接走ssh协议,需要验证所以机器多的话速度会较慢。

    二、ansible环境搭建

    一台管理

    192.168.238.129(hd1)

    两台被管理

    192.168.238.130(hd2)

    192.168.238.131(hd3)

    防火墙设置、宽容模式(selinux )、NAT模式

    所有主机都要配置主机名和 hosts文件

    192.168.238.129

    1. yum install -y epel-release
    2. yum install -y ansible

    设置免密登录

    若不免密操作在后面操作agent时都要加-k参数传密码;或者在主机清单里传密码。

    ssh-keygen

    ssh-copy-id hd2

    ssh-copy-id hd3

    vim /etc/ansible/hosts

    若不进行免密会失败

    免密后进行ping通测试(绿色为成功,红色为失败)

    主机清单功能

    因为未给自己免密所以129会失败

    三、ansible模块

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

    ansible支持的模块非常的多,我们并不需要把每个模块都记住,而只需要熟悉一些常见的模块,其它的模块在需要用到时再查询即可。

    ​官网模块文档地址:Ansible Documentation

    (一)、hostname模块

    hostname模块用于修改主机名(注意: 它不能修改/etc/hosts文件) 

    基本格式为: ansible 操作的机器名或组名 -m 模块名 -a "参数1=值1 参数2=值2" argment

    例:修改hd3的hostname

    (二)、file模块

    file模块:用于对文件相关的操作(创建, 删除, 软硬链接等)

    stat模块:类似linux的stat命令,用于获取文件的状态信息 。(了解)

    创建一个目录

    ansible my -m file -a 'path=/test state=directory'

    创建一个文件

    注意:my组的验证文章中多数只截取了一台机器

    ansible my -m file -a 'path=/test/1.txt state=touch'

    递归修改owner,group,mode

    ansible 192.168.238.130 -m file -a 'path=/root/OK recurse=yes owner=bin group=bin mode=1777'

    创建文件并指定owner,group,mode等

    ansible my -m file -a 'path=/test/1.txt state=file owner=bin group=daemon mode=1777'

    也可以指定其中一项进行创建修改

    删除文件

    删除目录 absent(缺席的) 会连同目录里的所有文件,删除文件值删除对应文件

    ansible my -m file -a 'path=/test/1.txt state=absent '

    创建软链接文件

    ansible my -m file -a 'src=/etc/fstab path=/opt/fstab state=link'

    创建硬链接文件

    ansible my -m file -a 'src=/etc/fstab path=/opt/fstab2 state=hard'

    (三)、copy模块

    copy模块用于对文件的远程拷贝操作(如把本地的文件拷贝到远程的机器上)

    echo master > OK

    ansible my -m copy -a 'src=/root/OK dest=/opt/word'

    content参数

    使用content参数直接往远程文件里写内容(会覆盖原内容)

    注意:ansible中-a后面的参数里也有引号时,记得要单引双引交叉使用,如果都为双引会出现问题。

    ansible my -m copy -a 'content="hello\n" dest=/opt/word'

    force参数

    使用force参数控制是否强制覆盖

    如果目标文件已经存在,则不覆盖
    ansible my -m copy -a 'src=/root/OK dest=/opt/word force=no'
    
    
    如果目标文件已经存在,则会强制覆盖
    ansible my -m copy -a 'src=/root/OK dest=/opt/word force=yes'

    backup参数

    使用backup参数控制是否备份文件

    backup=yes表示如果拷贝的文件内容与原内容不一样,则会备份一份
    my的机器上会将/opt/word备份一份(备份文件命名加上时间),再远程拷贝新的文件为/opt/word
    ansible my -m copy -a 'src=/root/OK dest=/opt/word backup=yes owner=daemon group=daemon mode=1777'

    "/"符号

    copy模块拷贝时要注意拷贝目录后面是否带"/"符号

    /etc/yum.repos.d后面不带/符号,则表示把/etc/yum.repos.d整个目录拷贝到/tmp/目录下
    ansible my -m copy -a 'src=/etc/yum.repos.d dest=/mnt/'
    
    
    /etc/yum.repos.d/后面带/符号,则表示把/etc/yum.repos.d/目录里的所有文件拷贝到/tmp/目录下
    ansible my -m copy -a 'src=/etc/yum.repos.d/ dest=mnt/'

    (四)、fetch模块

    fetch模块与copy模块类似,但作用相反。用于把远程机器的文件拷贝到本地。

    注意: fetch模块不能从远程拷贝目录到本地

    创建同名文件

    (五)、user模块

    user模块用于管理用户账号和用户属性。

    创建aaa用户,默认为普通用户,创建家目录

    ansible 192.168.238.130 -m user -a 'name=aaa state=present'

    创建bbb系统用户,并且登录shell环境为/sbin/nologin

    ansible 192.168.238.130 -m user -a 'name=bbb state=present system=yes shell="/sbin/nologin"'

    创建ccc用户, 使用uid参数指定uid, 使用password参数传密码密码要用双引号引起来,单引号的话验证时会密码不正确

    1. echo 123123 | openssl passwd -1 -stdin
    2. ansible 192.168.238.130 -m user -a 'name=ccc uid=2000 state=present password="$1$TyI.ymu/$bDnWZc.re9V/37HAZAgrf0"'

    删除aaa用户,但家目录默认没有删除

    ansible 192.168.238.130 -m user -a 'name=aaa state=absent'

    删除bbb用户,使用remove=yes参数让其删除用户的同时也删除家目录

    ansible 192.168.238.130 -m user -a 'name=bbb state=absent remove=yes'

    创建一个普通用户叫badboy,并产生空密码 密钥对echo

     ansible 192.168.238.130 -m user -a 'name=badboy generate_ssh_key=yes'

    产生空密码指的是这个,并非空密码

    (六)、group模块

    group模块用于管理用户组和用户组属性。

    创建组

    ansible 192.168.238.130 -m group -a 'name=long gid=3000 state=present'

    删除组(如果有用户的gid为此组,则删除不了)

    1. ansible 192.168.238.130 -m group -a 'name=long state=absent'
    2. ansible 192.168.238.130 -m group -a 'name=ss state=absent'

    (七)、cron模块

    cron模块用于管理周期性时间任务。

    创建一个cron任务,不指定user的话,默认就是root。

    minute,hour,day,month,week不指定的话,默认都为*

    ansible 192.168.238.130 -m cron -a 'name="test cron1" user=root job="touch /mnt/mnt.txt"  minute=*/2'

    也可以crontab -l查看任务

    删除cron任务

    ansible 192.168.238.130 -m cron -a 'name="test cron1" state=absent'

    (八)、yum_repository模块

    yum_repository模块用于配置yum仓库。

    注意:此模块只帮助配置yum仓库,但如果仓库里没有软件包,安装一样会失败。所以可以手动去挂载光驱。

    增加一个/etc/yum.repos.d/local.repo配置文件 。(输入命令注意-a后引号)

    ansible 192.168.238.130 -m yum_repository -a "name=local description=localyum baseurl=file:///mnt/ enabled=yes gpgcheck=no"

    删除/etc/yum.repos.d/local.repo配置文件

    ansible 192.168.238.130 -m yum_repository -a "name=local state=absent"

    (九)、yum模块

    yum模块用于使用yum命令来实现软件包的安装与卸载。

    使用yum安装一个软件前提:被安装的机器上yum配置都已经OK)

    ansible 192.168.238.130 -m yum -a 'name=dhcp state=present'

    使用yum安装l软件,state=latest表示安装最新版本

    ansible 192.168.238.130 -m yum -a 'name=dhcp state=latest'

    使用yum卸载一个软件

    ansible 192.168.238.130 -m yum -a 'name=dhcp state=absent'

    (十)、service模块

    service模块用于控制服务的启动,关闭,开机自启动等。

    启动vsftpd服务,并设为开机自动启动

    1. ansible 192.168.238.130 -m yum -a 'name=vsftpd state=present'
    2. ansible 192.168.238.130 -m service -a 'name=vsftpd state=started enabled=on'

    关闭vsftpd服务,并设为开机不自动启动

    ansible 192.168.238.130 -m service -a 'name=vsftpd state=stoppd enabled=fales'

    (十一)、script模块

    script模块用于在远程机器上执行本地脚本。(不用给权限

    1. vim /root/test.sh
    2. ansible 192.168.238.130 -m script -a '/root/test.sh'

    (十二)、command与shell模块

    两个模块都是用于执行linux命令的,这对于命令熟悉的工程师来说,用起来非常high。

    shell模块与command模块差不多(command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以)

    注意: shell模块并不是百分之百任何命令都可以,比如vim或ll别名就不可以。不建议大家去记忆哪些命令不可以,大家只要养成任何在生产环境里的命令都要先在测试环境里测试一下的习惯就好。

    查看my组IP

     ansible my -m command -a 'ifconfig ens33'

    对比于shell

    1. ansible my -m command -a 'ifconfig ens33 |grep netmask'
    2. ansible my -m shell -a 'ifconfig ens33 |grep netmask'

    三、playbook

    playbook(剧本): 是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。

    使用的格式为yaml格式。(saltstack,elk,docker,docker-compose,kubernetes等也都会用到yaml格式)

    (一)、YAML格式

    注意: 写这种文件不要使用tab键,都使用空格。

    • 以.yaml或.yml结尾

    • 文件的第一行以 "---"开始,表明YMAL文件的开始(可选的)

    • 以#号开头为注释

    • 列表中的所有成员都开始于相同的缩进级别, 并且使用一个 "- " 作为开头(一个横杠和一个空格)

    • 一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格)

    (二)、Playbook常见语法

    hosts用于指定要执行任务的主机,其可以是一个或多个由冒号分隔主机组
    remote_user用于指定远程主机上的执行任务的用户
    tasks任务列表, 按顺序执行任务
    如果一个host执行task失败, 这个tasks会回滚, 修正playbook 中的错误, 然后重新执行即可
    handlers类似task,但需要使用notify通知调用
    不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次
    handlers最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了
    variables变量

    定义变量可以被多次方便调用

    (三)、实例

    playbook编排my组安装httpd

    mkdir /root/palybook

    vim /root/palybook/test.yml

    可以中文,最好注释以免造成异常(传输的文件要确保主机有不然会失败)

    执行写好的palybook :ansible-playbook /root/playbook/test.yml

    vim /etc/httpd/conf/httpd.conf

    修改配置文件端口为443

    再次执行palybook: ansible-playbook /root/playbook/test.yml

    playbook编排多个hosts任务

    vim /etc/httpd/conf/host.conf

    ansible-playbook /root/playbook/host.yml

    书写错误

    my组用变量

    vim /etc/httpd/conf/host.conf

    ansible-playbook /root/playbook/host.yml

    四、roles介绍

    roles(角色): 就是通过分别将variables, taskshandlers等放置于单独的目录中,并可以便捷地调用它们的一种机制。

    假设我们要写一个playbook来安装管理lamp环境,那么这个playbook就会写很长。所以我们希望把这个很大的文件分成多个功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使用的时候直接调用就可以了,以免重复写。就类似编程里的模块化的概念,以达到代码复用的效果。

    (一)、roles的目录结构

    注意: 在每个角色的目录中分别创建files, tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录.。

    files用来存放由copy模块或script模块调用的文件
    tasks至少有一个main.yml文件,定义各tasks
    handlers有一个main.yml文件,定义各handlers
    templates用来存放jinjia2模板
    vars有一个main.yml文件,定义变量
    meta有一个main.yml文件,定义此角色的特殊设定及其依赖关系

    (二)、roles实现lamp

    创建目录及文件,并确认目录结构

    1. mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
    2. touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml

    准备httpd服务器的主页文件,php测试页和配置文件等

    1. echo "hello" > /etc/ansible/roles/httpd/files/index.html
    2. echo -e "" > /etc/ansible/roles/httpd/files/test.php
    3. yum install -y httpd
    4. cp /etc/httpd/conf/httpd.conf /etc/ansible/roles/httpd/files/

    编写httpd角色的main.yml文件

    vim /etc/ansible/roles/httpd/tasks/main.yml

    编写httpd角色里的handler

    vim /etc/ansible/roles/httpd/handler/main.yml

    编写php角色的main.yml文件

    vim /etc/ansible/roles/php/tasks/main.yml

    编写mysql角色的main.yml文件

    vim /etc/ansible/roles/mysql/tasks/main.yml

    编写lamp的playbook文件调用前面定义好的三个角色

    创建个playbook/lamp.yaml文件,位置随意

    vim /root/playbook/lamp.yaml

    注意:要与前面创建的名称一样

    执行lamp的playbook文件

    ansible-playbook /root/playbook/lamp.yml

      (三)、拓展安装discuz

    在此基础上安装discuz

    discuz包放在/roles/httpd/files中

    修改httpd角色的main.yml文件进行添加

    vim /etc/ansible/roles/httpd/tasks/main.yml

    修改mysql角色的main.yml文件

    vim /etc/ansible/roles/mysql/tasks/main.yml

    编写mysql的建库脚本

    vim /etc/ansible/roles/mysql/files/create.sh

    执行lamp的playbook文件

    后续用mysql创建的授权用户和数据库即可。


    总结

    今天内容相当于可以舒缓下大脑了,没有zabbix那么繁琐的的流程。与基础命令的使用相似,只是在基础稍微扩展,模版较多熟记常用的就好,要理解含义再操作更有助于背记。playbook为整体,roles为进行分类,显得比较有序,报错可找到对应的地方进行处理。

  • 相关阅读:
    Docker
    基于BP神经网络、RBF神经网络以及PSO优化的RBF神经网络进行数据的预测(Matlab代码实现)
    转铁蛋白靶向肽标记PEG化磷脂DSPE-PEG-T7(HAIYPRH)
    尚硅谷kubernates学习笔记 1
    Gitlab的安装与配置
    Qt http
    day012--mysql中的聚合函数
    分布式 PostgreSQL - Citus 架构及概念
    2024蓝桥杯每日一题(双指针)
    更新表的统计信息并清空缓存--DM8达梦数据库
  • 原文地址:https://blog.csdn.net/2301_78534660/article/details/132721722