• ansible学习基础知识和模块(一)


      基础知识补充:

    常用自动化运维工具
    
    Ansible:使用python来开发的,无需设置Agentless(代理),一般管理几百台。与ssh的方式也不一样,ssh是基于c/s模式(客户端+服务器)来使用服务端提供的服务,属于多台客户端访问一台服务器。而ansible是控制端,使用装了ansible的主机管理多台主机。也叫做主控端。Ansible是通过ssh端口来实现无代理配置。
    
    
    Saltstack:使用python语言开发,一般需部署agent(代理),执行效率更高,一般管理几千台。
    
    Puppet:使用ruby语言开发,功能强大,配置复杂,适合大型环境(了解即可)
    
    下面这些使用者较少,不做介绍
    
    Fabric:使用python语言开发,agentless(不需要设置代理)
    
    Chef: 使用ruby语言开发
    
    Cfengine
    
    Func
    
    Ansible特性
    
    模块化:调用特定的模块,完成特定任务
    
    有Paramiko(基于ssh的开发语言),PyYAML(YAML语言),Jinja2(模板语言)这三个关键模块,并支持自定义模块
    
    基于Python语言实现
    
    部署简单,基于python和SSH(默认已安装),agentless(不需要设置代理)
    
    安全,基于OpenSSH
    
    支持playbook编排任务
    
    幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
    
    无需代理不依赖PKI(无需ssl)
    
    可使用任何编程语言写模块
    
    YAML格式,编排任务,支持丰富的数据结构
    
    较强大的多层解决方案

    用户通过ANSIBLE来下达指令,通常是逐条命令执行。可以通过公有/私有云来实现远程管理.

    
    

    主机库存中包含着所有主机的列表,通过主机分组及连接插件来实现管理不同的主机,给一些主机升级,一些主机创建用户等目的。

    
    

    剧本是用在批量,定期做例行性工作的时候,比如定期做备份等等。在复杂一些的情况会使用角色(Roles),相当于多个剧本的组合。

    
    

    Ansible主要组成部

    
    

    ANSIBLE PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件

    
    

    INVENTORY:Ansible管理主机的清单,位于/etc/anaible/hosts文本文件中,内容为要管理的主机的名称或IP地址.

    
    

    MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义

    
    

    PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插

    
    

    件等,该功能不常用

    
    

    API:供第三方程序调用的应用程序编程接口

    
    

    ANSIBLE:组合INVENTORY、API、MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具

    
    

    Ansible命令执行来源:

    
    

    1 USER,普通用户,SYSTEM ADMINISTRATOR(系统管理员)

    
    

    2 CMDB(配置管理数据库) API 调用(需要开发接口)

    
    

    3 PUBLIC/PRIVATE CLOUD API调用(需要开发接口)

    
    

    USER-> Ansible Playbook -> Ansibile(运维工程师通常用这种方式)

    
    

    利用ansible实现管理的方式:

    
    

    1 Ad-Hoc 即单条ansible命令,主要用于临时命令使用场景

    
    

    Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划

    
    

    Ansible-playbook(剧本)执行过程:

    
    

    将已有编排好的任务集写入Ansible-Playbook,通过ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行

    
    

    Ansible主要操作对象:

    
    

    HOSTS主机

    
    

    NETWORKING网络设备

    
    

    注意事项

    
    

    执行ansible的主机一般称为主控端,中控,master或堡垒机

    
    

    主控端Python版本需要2.6或以上

    
    

    被控端Python版本小于2.4需要安装python-simplejson

    
    

    被控端如开启SELinux需要安装libselinux-python

    
    

    windows不能做为主控端

    
    

    ansible安装:配置好仓库的epel源,直接yum install ansible即可。

    
    

    确认版本号: ansible –version

     ansible的配置文件

    
    

    /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,大部分配置不用修改,默认值即可.

    
    

    /etc/ansible/hosts 主机清单,要控制的主机必须存放在这个文件中。

    
    

    /etc/ansible/roles/ 存放角色的目录,角色可理解为多个剧本的集合

    
    

     ansible的程序

    
    

    /usr/bin/ansible 主程序,临时命令执行工具

    
    

    /usr/bin/ansible-doc 查看配置文档,模块功能查看工具(很多模块的帮助信息都在这里,相当于man)

    
    

    /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台

    
    

    /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansible-pull 远程执行命令的工具(pull,拉取的意思。有时候把别人的文件拉取到我这来,有时候把我的东西推送到别人那)

    
    

    /usr/bin/ansible-vault 文件加密工具

    
    

    /usr/bin/ansible-console 基于Console界面与用户交互的执行工具

    
    

    ansible模块介绍:

    执行哪些模块,就使用-m参数来指定。对其执行哪些动作则使用-a参数指定。

    下面的演示都是一个中控机,然后2个node。

    1)group模块

    group模块:管理用户组模块
    
        相关选项:
    
          name:组名称
    
          gid:指定GID
    
          state:present/absent
            present:表示创建。absent:表示删除       system:yes
    /no
            yes/no:是否为系统用户。

      1.1)案例演示:

    [root@ELK-chaofeng01 ~]#ansible all -m group -a "gid=3000 name=chaofeng state=present system=no" 
    172.16.0.53 | CHANGED => {
        "changed": true, 
        "gid": 3000, 
        "name": "chaofeng", 
        "state": "present", 
        "system": false
    }
    172.16.0.52 | CHANGED => {
        "changed": true, 
        "gid": 3000, 
        "name": "chaofeng", 
        "state": "present", 
        "system": false
    }

    2)user模块

    由于user模块的选项众多,这里只介绍一些常用的选项:
    
          name:用户名
    
          password:为用户设置登陆密码,此密码是明文密码加密后的密码
    
          update_password:always/on_create
    
            always:只有当密码不相同时才会更新密码(默认)
    
            on_create:只为新用户设置密码
    
          shell:用户的shell设定
    
          groups:用户附加组设定
    
          home:指定用户的家目录
          append:yes/no
    
            yes:增量添加group
    
            no:全量变更group,只设置groups指定的group组(默认)
    
          remove:配合state=absent使用,删除用户的家目录->remove=yes

    案例演示:

      2.1)添加一个用户

    [root@ELK-chaofeng01 ~]#ansible all -m user -a "uid=5000 name=testuser state=present groups=root shell=/bin/tcsh"
    172.16.0.52 | CHANGED => {
        "changed": true, 
        "comment": "", 
        "create_home": true, 
        "group": 5000, 
        "groups": "root", 
        "home": "/home/testuser", 
        "name": "testuser", 
        "shell": "/bin/tcsh", 
        "state": "present", 
        "system": false, 
        "uid": 5000
    }
    172.16.0.53 | CHANGED => {
        "changed": true, 
        "comment": "", 
        "create_home": true, 
        "group": 5000, 
        "groups": "root", 
        "home": "/home/testuser", 
        "name": "testuser", 
        "shell": "/bin/tcsh", 
        "state": "present", 
        "system": false, 
        "uid": 5000
    }

     注意:要添加的附加组也是需要在node节点的主机上事先存在的,否则会报错:比如  

        

    3)copy模块

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

    案例:

      3.1)将中控机上/etc/fstab文件复制到远程节点上:

    [root@ELK-chaofeng01 ~]#ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600"
    172.16.0.52 | CHANGED => {
        "changed": true, 
        "checksum": "150ff5f6b99363314d375b73a5708e2a9911e52a", 
        "dest": "/tmp/fstab.ansible", 
        "gid": 0, 
        "group": "root", 
        "md5sum": "5fe64bfebc65805a98e7e9d47e9f379f", 
        "mode": "0600", 
        "owner": "root", 
        "size": 501, 
        "src": "/root/.ansible/tmp/ansible-tmp-1553574326.56-222928675924643/source", 
        "state": "file", 
        "uid": 0
    }
    172.16.0.53 | CHANGED => {
        "changed": true, 
        "checksum": "150ff5f6b99363314d375b73a5708e2a9911e52a", 
        "dest": "/tmp/fstab.ansible", 
        "gid": 0, 
        "group": "root", 
        "md5sum": "5fe64bfebc65805a98e7e9d47e9f379f", 
        "mode": "0600", 
        "owner": "root", 
        "size": 501, 
        "src": "/root/.ansible/tmp/ansible-tmp-1553574326.57-180187752562484/source", 
        "state": "file", 
        "uid": 0
    }

     我们可以在node节点上看看权限信息

    [root@ELK-chaofeng02 ~]#ls /tmp/fstab.ansible  -l
    -rw------- 1 root root 501 Mar 26 12:25 /tmp/fstab.ansible

       3.2)复制一个目录

    [root@ELK-chaofeng01 ~]#ansible 172.16.0.52 -m copy -a "src=/etc/yum.repos.d/ dest=/tmp/yum.repos_ansible owner=root"
    172.16.0.52 | CHANGED => {
        "changed": true, 
        "dest": "/tmp/yum.repos_ansible/", 
        "src": "/etc/yum.repos.d/"
    }

        注意:上面的src路径中,是我们定义的要复制的源目录,源目录后必须带上根路径”/“标识符。否则不带的话,复制的是目录本身,并非目录下的所有文件。

      在node节点上查看一下:

        

    补充:fetch的作用:将远程主机上的文件复制到本地来。用法格式:ansible-doc -s fetch

    4)shell模块:让远程主机在shell进程下执行命令,从而支持shell的特性,如管道等。

    如果说我们的目标主机需要执行一些命令类操作,因此我们就需要使用shell模块

    [root@ELK-chaofeng01 ~]#ansible all -m shell -a "ip addr"
    172.16.0.53 | CHANGED | rc=0 >>
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 52:54:00:e5:63:80 brd ff:ff:ff:ff:ff:ff
        inet 172.16.0.53/16 brd 172.16.255.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::1924:db50:da5d:2e13/64 scope link 
           valid_lft forever preferred_lft forever
    
    172.16.0.52 | CHANGED | rc=0 >>
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 52:54:00:5b:be:3f brd ff:ff:ff:ff:ff:ff
        inet 172.16.0.52/16 brd 172.16.255.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::f427:6471:2b8a:40f8/64 scope link 
           valid_lft forever preferred_lft forever

    5)file模块:多设置文件属性

    相关选项:
    
          force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
    
          group:定义文件/目录的属组
    
          mode:定义文件/目录的权限
    
          owner:定义文件/目录的属主
    
          path:必选项,定义文件/目录的路径
    
          recurse:递归设置文件的属性,只对目录有效
    
          src:被链接的源文件路径,只应用于state=link的情况
    
          dest:被链接到的路径,只应用于state=link的情况
    
          state:
    
                 directory:如果目录不存在,就创建目录
    
                 file:即使文件不存在,也不会被创建此文件
    
                 link:创建软链接
    
                 hard:创建硬链接
    
                 touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
    
                 absent:删除目录、文件或者取消链接文件

    案例:

      5.1)创建一个目录

         

      5.2)创建一个符号链接

        

    6)cron模块

    minute=/hour=/day=/month=/weekday= 某个值不写,默认就是*
    
          name:必选项,任务描述信息
    
          job:执行的任务,要加引号
    
          state:present(创建)/absent(删除)

    案例:

      6.1)定时在目标主机上执行任务

    [root@ELK-chaofeng01 ~]#ansible all -m cron -a "minute=*/3 job='/usr/sbin/echo haha &>/dev/null' name=None state=present"
    172.16.0.52 | CHANGED => {
        "changed": true, 
        "envs": [], 
        "jobs": [
            "None"
        ]
    }
    172.16.0.53 | CHANGED => {
        "changed": true, 
        "envs": [], 
        "jobs": [
            "None"
        ]
    }

      然后我们去目标主机看一下:

      

      在cron计划任务里面确实有这个任务。

      取消计划任务:

    [root@ELK-chaofeng01 ~]#ansible all -m cron -a "minute=*/3 job='/usr/sbin/echo haha &>/dev/null' name=None state=absent"

    7)yum模块:管理安装rpm程序包

    相关选项:
          name:程序包名称,可带版本号
    
          state:present、installed、latest(安装)/absent、removed(删除)

    案例:

      1、安装一个包apr-devel

      

    8)service模块:管理服务

          name:服务名称
    
          state:started/stopped/restarted/reloaded
    
          enabled:true/false  是否要开机自启。
    
          runlevel:运行级别

    案例:

      8.1)将所有节点启动nginx服务。

      

      8.2)将所有节点的nginx服务关闭了

      

    9)自定义script脚本:自动上传到所有的节点并执行此脚本。

       命令语法:

    案例演示:

      9.1)上传一个脚本到节点并执行

        先在中控机编写一个脚本:

        

        然后在中控机上传到各个节点并执行

    [root@ELK-chaofeng01 ~]#ansible all -m script -a "/tmp/echo.sh"
    172.16.0.52 | CHANGED => {
        "changed": true, 
        "rc": 0, 
        "stderr": "Shared connection to 172.16.0.52 closed.
    ", 
        "stderr_lines": [
            "Shared connection to 172.16.0.52 closed."
        ], 
        "stdout": "", 
        "stdout_lines": []
    }
    172.16.0.53 | CHANGED => {
        "changed": true, 
        "rc": 0, 
        "stderr": "Shared connection to 172.16.0.53 closed.
    ", 
        "stderr_lines": [
            "Shared connection to 172.16.0.53 closed."
        ], 
        "stdout": "", 
        "stdout_lines": []
    }

        然后到其中一个节点查看一下:

        

        执行成功了。

  • 相关阅读:
    反正我是猜错,关于javascript包装对象的一个坑
    《编写可维护的javascript》推荐的编码规范之——编程实践
    《编写可维护的javascript》推荐的编码规范之——编程风格
    35行的山寨版jQuery
    Css进度条
    nginx的location和proxy_pass是否带斜杠的区别
    mongodb笔记
    在安装完 docker for windows 之后,hype-v打开,之后再关闭,vmware无法使用,虚拟机报错:传输(vmdb)错误-32:pipe:read failed
    awk笔记备忘
    sed命令笔记备忘
  • 原文地址:https://www.cnblogs.com/FengGeBlog/p/10599410.html
Copyright © 2020-2023  润新知