• Ansible自动化运维


    目录

    一、ansible概述

    1.Ansible简介

    2.Ansible工作机制

    3.Ansible特性

    二、Asible的安装

    1)、设置EPEL仓库, Ansible仓库默认不在yum仓库中

    2)、 使用yum安装Ansible

    3)、 查看ansible的版本

    三、Ansible基本使用 

    1、配置主机清单文件

     2、测试

    四、Ansible组件 -- inventory

    五、Ansible组件 -- Ad-Hoc

    六、Ansible组件 -- facts

    七、Ansible组件 -- PlayBook

    YAML介绍

    所有的yum文件都必须以.yml或者.yaml结尾。


    一、ansible概述

    1.Ansible简介

     —基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用YAML 及 Jinja2模板语言,更强的远程命令执行操作。

    Ansible 基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible自己本身纯主要的程序是不能运行任何东西的,可以把它完全当成一个平台,在平台集合了各种各样的模块,用模块实现它想要实现的功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

    2.Ansible工作机制

         connection plugins:连接插件,负责和被监控端实现通信,有SSH,ZEROMQ等,默认使用SSH连接
    ​        host inventory:主机清单,是一个配置文件里面定义监控的主机(用来记录所有被你远程操作机器的名单)
    ​        modules : 模块,核心模块、command模块、自定义模块等
    ​        plugins : modules功能的补充,包括连接插件,邮件插件等
    ​        playbook:编排,定义 Ansible 多任务配置文件,非必需

    3.Ansible特性

        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:可实现多级指挥

    二、Asible的安装

    1)、设置EPEL仓库, Ansible仓库默认不在yum仓库中

    [root@ansible1 ~]# yum -y install epel-release  安装扩展源,启用epel仓库

    [root@ansible1 ~]# yum list | grep -i ansible    看哪个软件是哪个源装的

    2)、 使用yum安装Ansible

    [root@ansible1 ~]# yum install ansible -y

    3)、 查看ansible的版本

    [root@ansible1 ~]# ansible --version 
    ansible 2.9.27

    三、Ansible基本使用 

    1、配置主机清单文件

    主机清单文件
    ​            定义所管理的主机组及主机,可以在主配置文件中指定清单文件位置和名称
    ​            默认位置/etc/ansible/hosts
    ​ 主配置文件:
    ​            /etc/ansible/ansible.cfg 
    ​            主要设置一些ansible初始化的信息,比如日志存放路径、模块、插件等配置信息

    [root@ansible1 ~]# vim /etc/ansible/ansible.cfg   修改主配置文件的位置/名字

     [root@ansible1 ~]# vim /etc/ansible/hosts

     配置ssh公钥认证:

    控制节点需要发送ssh公钥给所有非被控制节点。主机解析。

     2、测试

    语法

    # ansible    -m  -a
    pattern--主机清单里定义的主机组名,主机名,IP,别名等,all表示所有的主机,支持通配符,正则

    -m module_name: 模块名称,默认为command
    -a arguments:   传递给模块的参数  以~开头,匹配正则

    最常用的模块:能直接让你用这个模块执行系统命令(在对面机器)
        command   默认模块  可以不加-m
        shell

    执行shell命令

    [root@ansible1 ~]#  ansible 192.168.22.169 -m shell -a 'touch /tmp/b.txt'  给ip169创建b.txt

    [root@ansible1 ~]#  ansible 192.168.22.169 -m shell -a 'rm -rf /tmp/*'   删除b.txt

    [root@ansible1 ~]# ansible 192.168.22.169 -m shell -a 'touch /tmp/c.txt;echo hello > /tmp/c.txt'  同时执行两条命令,创建一个c.txt,并且把hello重定向到c.txt
    [root@ansible1 ~]# ansible w* -m shell -a 'touch /tmp/c.txt;echo hello > /tmp/c.txt'  所有以c开头的机器全部都执行。

    执行command命令

    ansible web1 -m command -a 'uptime'

    ansible web1 -a 'uptime'

    因为默认模块就是command,所以上面命令可以不加-m

    同时指定多台机器

    ansible web1,web2,web3 -m ping

    使用ping模块检查ansible节点的连通性:

    ansible web1 -m ping -o   (-o是通用的,加上-o就是把执行结果变成一行)

    使用ssh账户和密码

    -u  用户    //指定ssh账户
    -k             //指定使用ssh密码(注意:如果设置了公钥认证,这里写什么密码都可以)

    ansible w1 -a 'uptime' -u root -k    如果这台机器没有传公钥,远程ssh,默认是以root账户,root密码,所以在这里指定用户名,密码。(一般用的少,都会给被操纵机器加公钥)

    SSH password: 
    w1 | SUCCESS | rc=0 >>
    给节点增加用户  

    ansible 192.168.22.169 -a "useradd tom"

    重定向输出到本地文件中

    [root@ansible1 ~]ansible 192.168.22.169 -a "df -h" > /tmp/a.txt
    [root@ansible1 ~]cat /tmp/a.txt 

    四、Ansible组件 -- inventory

    inventory文件通常用于定义要管理主机及其认证信息,例如ssh登录用户名、密码以及key相关信息。

    [root@ansible1 ~]# vim /etc/ansible/hosts    使用[]标签指定主机组

     [root@ansible1 ~]# ansible db_servers -m shell -a 'echo hello > /tmp/a.txt'   对两台机器同时生效

    查看组内主机列表

    [root@ansible1 ~]# ansible db_servers --list-hosts

    查看组内主机列表

    ansible w1 -a 'uptime' -i web2.host  手动指定其他任意位置的清单

    五、Ansible组件 -- Ad-Hoc

    ad hoc 临时的,在ansible中是指需要快速执行,并且不需要保存的命令。其实就是执行简单的命令,对于复杂的命令则需要playbook。

    ansible-doc命令获取模块列表及模块使用格式

    [root@ansible1 ~]# ansible-doc -l       -l               获取列表
    [root@ansible1 ~]# ansible-doc yum
    [root@ansible1 ~]# ansible-doc -s yum ( -s module_name   获取指定模块的使用信息)

    执行命令

    -m shell
    -f  2    指定定要使用的并行进程数,默认为5个。

    [root@ansible1 ~]# grep forks /etc/ansible/ansible.cfg
    #forks          = 5

    [root@ansible1 ~]# ansible all -m shell -a 'hostname' -o -f 3     all所有的机器,3台机器去处理,相当于并发控制。机器多的时候用得上

    复制文件  -m copy

    得有cp命令,源文件,目标文件

    ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts owner=root group=root mode=644 backup=yes'

    注意:src指定的是ansible本地机器上的文件

    ansible all -m shell -a 'cp /tmp/a.txt /tmp/b.txt'

    注意:如果想拷贝远程机器上的文件则需要使用remote_src=yes选项
    # ansible 192.168.22.169 -m copy -a "src=/tmp/cc.txt dest=/tmp/dd.txt remote_src=yes"

    用户管理
    -m user

    添加用户
        [root@ansible1 ~]# echo '123' | openssl passwd -1 -stdin  产生一个加密的密码
        $2$hXe3alXf$4VGhWAbRGA6tm4NMJznSf1
        [root@ansible1 ~]# ansible 192.168.22.169 -m user -a 'name=lisi password="$2$hXe3alXf$4VGhWAbRGA6tm4NMJznSf1"' -o

    测试  看密码是不是123   su - lisi

    删除用户
        [root@ansible1 ~]# ansible 192.168.22.169 -m user -a "name=lisi state=absent" -o

    使用变量需要用双引:

    [root@ansible1 ~]# pass=`echo '1' | openssl passwd -1 -stdin`  (把密码交给一个变量,ansible是可以加变量的,但是外边不能用单引号了)

    [root@ansible1 ~]# ansible 192.168.22.169 -m user -a "name=lisi password=$pass" -o  (变成双引就好了)

    使用命令替换需要用双引:
        [root@ansible1 ~]# ansible 192.168.22.169 -m user -a "name=lisi password=`echo '1234' | openssl passwd -1 -stdin" -o

    软件包管理      -m yum

    安装软件:
        [root@ansible1 ~]# ansible 192.168.22.169 -m yum  -a  'name=httpd state=latest/installed/present' 

    latest直接安装最新版本

    删除软件:
        [root@ansible1 ~]# ansible 192.168.22.169 -m yum  -a  'name=httpd state=removed/absent' 

    服务管理     -m service
    [root@ansible1 ~]# ansible 192.168.22.169 -m service -a 'name=httpd state=started enabled=yes' 

    systemctl list-unit-files    查看是不是 开机启动

    六、Ansible组件 -- facts

    最主要的功能:用来获取被操控机器的基本信息

    facts组件是Ansible用于采集被管理主机信息的一个功能,可以使用setup模块查看主机的有的facts信息。

    组件的名字叫facts,但要是想用组件获取信息用的是setup模块。

    [root@ansible1 ~]#  ansible 192.168.22.169  -m setup     可以拿到被操控机器的所有信息

    [root@ansible1 ~]#  ansible 192.168.22.169 -m setup -a 'filter=ansible_all_ipv4_addresses'

    将所有主机的信息输入到/tmp/facts目录下:
    每台主机的信息输入到主机名文件中(/etc/ansible/hosts里的主机名)
    [root@ansible1 ansible]# ansible all -m setup --tree /tmp/facts 

    [root@ansible1 ~]# cd /tmp/
    [root@ansible1 tmp]# ls
    facts
    [root@ansible1 tmp]# cd facts/
    [root@ansible1 facts]# ls
    192.168.22.169
    [root@ansible1 facts]# cat 192.168.22.169

    [root@ansible1 facts]# ansible 192.168.22.169 -m setup -a 'filter=ansible_*_mb'  查看主机内存信息

    [root@ansible1 facts]# ansible 192.168.22.169 -m shell -a "ip a"    参数忘了可以直接 ip a 拿到ip地址

    七、Ansible组件 -- PlayBook

    playbook介绍
    playbook是由一个或多个”play”组成的列表。play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来将,所谓的task无法是调用ansible的一个module。

    Playbook是Ansible的配置,部署,编排语言。他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合。
    当执行一些简单的改动时ansible命令是非常有用的,然而它真的作用在于它的脚本能力。当对一台机器做环境初始化的时候往往需要不止做一件事情,这时使用playbook会更加适合。通过playbook你可以一次在多台机器执行多个指令。通过这种预先设计的配置保持了机器的配置统一,并很简单的执行日常任务。
    Playbook还开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。

    YAML介绍

    Ansible使用标准的YAML解析器,使用YAML文件语法即可书写playbook。
    YAML是一个可读性高的用来表达资料序列的格式,YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001首次发表了这种语言。
    YAML Ain’t Makup Language,即YAML不是XML。不过,在开发这种语言时,YAML的意思是:Yet Another  Makrup  Language(仍是一种标记语言),其特性:YAML的可读性好、YAML和脚本的交互性好、YAML有一个一致的信息模型、YAML易于实现、 YAML可以基于流来处理、YAML表达能力强,扩展性好。

    playbook的基础组件

    name 定义playbook或者task的名称

    hosts playbook中的每一个paly的目的都是为了让某个或某些以某个指定用户的身份执行任务。hosts用于指定要执行指定任务的主机,其可以是一个或多个由冒号分割主机组。与命令模式下的ansible匹配规则一样

    user remote_user则用于指定远程主机上的执行任务的用户,也可以使用user

    tasks 任务列表 play的主体部分是task list. task list中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个。

    vars 定义变量

    vars_files 定义变量文件

    notify 任务执行结果如果是发生更改了的则触发定义在handler的任务执行

    handlers 用于当前关注的资源发生变化时采取一定指定的操作

    include 能包含的包括task,handler和playbook 可以在include的时候传递变量

    简单playbook

    vim test.yml   # 固定后缀为yml或者yaml

    文档以---开头,没有也可以

    #两部分
    #1.字典 映射 map dic
    #     key value的形式出现
    #     凡是value为非嵌套结构的,直接写在key的后面,冒号后面必须加空格
    #     凡是value为嵌套结构的,换行,冒号后面不需加空格
    #2.list 列表
    #     每个列表都是以-开头的,-后面必须带空格
    #     [1,2,3,[4,5,6]]
    #     - 1
    #       2
    #       3
    #       - 4
    #         5
    #         6
    #语法规则
    #1.区分大小写
    #2.同级元素缩进必须一致,缩进的空格数量不限
    #3.缩进尽量用空格,少用tab。

  • 相关阅读:
    【数据结构】带头双向循环链表
    ubuntu18.04上安装protubuf3.19.4
    坚持自学软件测试,半年的辛苦没有白费,不过才拿到10k的offer
    关于数据权限的设计
    携职教育:最新人力资源管理师报考条件政策解析
    使用 KubeBlocks 为 K8s 提供稳如老狗的数据库服务
    MySQL进阶查询
    【Java】ArrayList扩容规则
    实现 js 中所有对象的深拷贝(包装对象,Date 对象,正则对象)
    网络分级设计模型的三层架构:接入层、汇聚层、核心层到底有什么说法?
  • 原文地址:https://blog.csdn.net/weixin_53150440/article/details/127413511