• ansible


    ansible概述:

      Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。它用Python写成,类似于saltstackPuppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。它使用SSH来和节点进行通信。Ansible基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL  Jinja2模板语言,更强的远程命令执行操作。

    ansible具有的特点:

    1、部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;

    2、默认使用SSH协议对设备进行管理;

    3、主从集中化管理;

    4、配置简单、功能强大、扩展性强;

    5、支持API及自定义模块,可通过Python轻松扩展;

    6、通过Playbooks来定制强大的配置、状态管理

    7、对云计算平台、大数据都有很好的支持;

    1.2 ansible工作原理: 

      Ansible 在管理节点将 Ansible 模块通过 SSH 协议推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排。

    由上面的图可以看到 Ansible 的组成由 5 个部分组成:

    Ansible      ansible核心

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

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

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

    Inventory     定义 Ansible 管理主机的清单  [ˈɪnvəntri] 清单

    ansible过程 

    官方文档:https://docs.ansible.com/ansible/latest/modules/list_of_database_modules.html

    安装ansible服务

      在ansible【172.16.1.61】安装服务:

    安装epel仓库(ansible在epel扩展仓库中)

    [root@m01 ~]# yum install epel-release -y

    安装ansible:

    [root@m01 ~]# yum install ansible -y
    [root@m01 ~]#  ansible --version    #阿里云镜像可以下载最新版本的服务

      ansible 2.8.5
      config file = /etc/ansible/ansible.cfg
      configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python2.7/site-packages/ansible
      executable location = /usr/bin/ansible
      python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

     ansible参数

    anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]

    ansible详细参数:

     -v,–verbose             #  详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)
     -i PATH, -inventory=PATH        #  指定 host 文件的路径,默认是在 /etc/ansible/hosts 
    inventory [ˈɪnvəntri] 库存
     -f NUM,-forks=NUM           # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。
     -m NAME,-module-name=NAME      #   指定使用的 module 名称,默认使用 command模块
     -a,MODULE_ARGS        #指定 module 模块的参数
     -k,-ask-pass                #提示输入 ssh 的密码,而不是使用基于 ssh 的密钥认证 
     -sudo                  # 指定使用 sudo 获得 root 权限
     -K,-ask-sudo-pass              #提示输入 sudo 密码,与 -sudo 一起使用
     -u USERNAME,-user=USERNAME            # 指定移动端的执行用户
    -C,–check    #测试此命令执行会改变什么内容,不会真正的去执行

    ansible查询命令:

    ansible-doc -l           #列出所有的模块列表
    ansible-doc -s 模块名    #查看指定模块的参数  -s, --snippet   # [ˈsnɪpɪt]   片断

    定义主机清单

    基于端口,用户,密码定义主机清单

    格式:
    ansible_ssh_port   :指定ssh端口   
    ansible_ssh_user   :指定 ssh 用户 
    ansible_ssh_pass   :指定 ssh 用户登录是认证密码(明文密码不安全)  
    ansible_sudo_pass :指明 sudo 时候的密码
    ansible_host       --- 可以设置IP地址信息, 建立地址和名称解析关系
    ansible_become     --- 是否开启普通用户提权操作    yes true(开启)/no false
    ansible_become_method   --- 指定普通用户提权方法  su - root / sudo
    ansible_become_user     --- 指定提权后用户身份
    ansible_become_password --- 指定提权后用户密码

    采取用户进行批量管理提权操作:

      采用su方式进行提权:
    172.16.1.41 ansible_user=wei ansible_password=123456 ansible_become=yes ansible_become_method=su ansible_become_user=root ansible_become_password=123123
     采用sudo方式进行提权: 

    172.16.1.41 ansible_user=wei ansible_password=123456 ansible_become=yes ansible_become_method=sudo ansible_sudo_user= oldboy ansible_become_password=123456

    配置文件:     (定义的主机清单)

    [root@m01 ansible]# ls
    
    ansible.cfg      hosts (主机清单)       roles(角色)

    方式一:

    [db_server] #主机组名
    
    192.168.1.64 ansible_ssh_port=22 ansible_ssh_user=root  ansible_ssh_pass=123456 #定义:端口,登录用户,密码

    方式二:主机组变量设置方法 (剧本)

    主机组变量设置方法 (剧本)
    [rsync_server]
        172.16.1.41  
        172.16.1.42  
        172.16.1.43  
        172.16.1.44
    [rsync_server:vars]
        ansible_user=root
        ansible_password=123123
        oldboy=123

    方式三: 主机组子组配置方法

    [db:children]  #孩子
        master_db
        slave_db
        
    [master_db]
        172.16.1.7
        
    [slave_db]
       172.16.1.31
       172.16.1.41

    方式四:序列匹配配置方法

    [rsync_server]
    172.16.1.[41:100]

    前提:批量管理用户服务要创建公钥文件

    第一种方式:

    [root@m01 ansible]# ssh-keygen  #一路回车
    
    #脚本批量分发公钥文件
    #!/bin/bash
    #先下载 yum install sshpass 
    #创建秘钥
    # ssh-keygen 
    . /etc/init.d/functions
    
    for ip in {7,31,41}   
    do
       sshpass -pnihao123! ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.$ip -o StrictHostKeyChecking=no &>/dev/
    null
       if [ $? -eq 0 ]
       then
              action   "主机 172.16.1.$ip"     /bin/true
              echo   ""
    else
              action   "主机 172.16.1.$ip"     /bin/false
              echo   ""
       fi
    done

    第二种方式:

    [root@m01 .ssh]# ansible db_server -m  copy -a "src=/root/.ssh/id_rsa.pub dest=/root/.ssh"    #创建完公钥通过ansible发送过去

    简单测试主机是否可以ping通:

    [root@m01 ansible]# ansible -i /etc/ansible/hosts db_server -m ping 

     -i    #  指定 host 文件的路径,默认是在 /etc/ansible/hosts 

     -m    #   指定使用的ping模块

    在ansible服务端运行命令

    例1:ping模块检查网络连通性

    command模块执行shell命令,command:作为ansible的默认模块,可以运行远程权限范围内的所有shell命令
    例1:使用ping检查‘db_server’或者ansible节点的连通性。
    [root@ansible ~]# ansible -i /etc/ansible/hosts 'db_server'  -m ping
    或:
    [root@ansible ~]# ansible 'db_server'  -m ping  #不指定,默认使用/etc/ansible/hosts文件
    192.168.1.63 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    192.168.1.64 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }

    2:检查Ansible节点的运行时间(uptime)

    [root@ansible ~]# ansible -m command -a "uptime" 'db_server'   #也可以把主机清单组名写到最后,这样方便阅读命令
    172.16.1.7 | SUCCESS | rc=0 >>
    12:45:23 up 32 min,  5 users,  load average: 0.17, 0.11, 0.27
    
    172.16.1.41 | SUCCESS | rc=0 >>
     12:45:23 up 26 min,  2 users,  load average: 0.03, 0.03, 0.10

    例3:检查节点的内核版本

    [root@ansible ~]# ansible -m command -a "uname -r" 'db_server'

    例4:给节点增加用户

    [root@ansible ~]# ansible -m command -a "useradd wei" 'db_server'
    172.16.1.7  | SUCCESS | rc=0 >>
    172.16.1.41| SUCCESS | rc=0 >>
    [root@ansible ~]# ansible -m command -a "grep wei /etc/passwd" 'db_server'

    例5:将df命令在所有节点执行后,重定向输出到本机的/tmp/command-output.txt文件中

    [root@ansible ~]# ansible -m command -a "df -Th" 'db_server' > /tmp/command.txt
    [root@ansible ~]# cat /tmp/command-output.txt 

    ansible常见模块高级使用方法 

    command模块

    作用:为ansible默认模块,不指定-m参数时,使用的就是command模块; comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些 "<", ">", "|", and "&"操作都不可以,当然,也就不支持管道; 缺点:不支持管道,没法批量执行命令;

    参数 选项/默认值 释义
    chdir   在执行命令前,进入到指定目录中
    creates   判断指定文件是否存在,如果存在,不执行后面的操作
    removes   判断指定文件是否存在,如果存在,执行后面的操作
    free_form   必须要输入一个合理的命令

    shell模块:

    作用:在远程命令通过/bin/sh来执行

    例1:运行free -m 命令

    [root@ansible ~]# ansible -i /etc/ansible/hosts  db_server -m shell -a "free -m"

    注:但是我们自己定义在~/.bashrc或~/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;
    对shell模块的使用可以分成两块: 
    1) 如果待执行的语句少,可以直接写在一句话中:

    [root@ansible ~]# ansible -i /etc/ansible/hosts  db_server -m shell -a "source  ~/.bash_profile && df -h | grep sda1" 

    2) 如果在远程待执行的语句比较多,可写成一个脚本,通过copy模块传到远端,然后再执行;但这样就又涉及到两次ansible调用;对于这种需求,ansible已经为我们考虑到了,script模块就是干这事的;

    scripts模块

    作用:在远程服务器上使用本地脚本

    [root@m01 scripts]# vim ansible.sh
    #!/bin/bash
    ifconfig 
    
    [root@ansible ~]# ansible -i /etc/ansible/hosts  db_server  -m script -a "/server/scripts/ansible.sh"   #执行在/server下的脚本

    copy模块:

    作用:实现主控端向目标主机拷贝文件,类似scp功能

    1:把ansible主机上的/etc/hosts文件复制到主机组中机器的/tmp目录下

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

    file模块

    作用:设置文件属性。

    例如:

    [root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m file -a "path=/tmp/hosts mode=0777"

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

    剧本:

    # 更改文件所有权,组和模式。 当使用八进制数指定模式时,第一个数字应始终为0。
    - file:
        path: /etc/foo.conf
        owner: foo
        group: foo
        mode: 0644
    
    # touch创建文件,使用符号模式设置权限(相当于0644)
    - file:
        path: /etc/foo.conf
        state: touch
        mode: "u=rw,g=r,o=r"
    
    # touch创建文件,添加/删除一些权限
    - file:
        path: /etc/foo.conf
        state: touch
        mode: "u+rw,g-wx,o-rwx"
    
    # 创建一个目录,如果它不存在
    - file:
        path: /etc/some_directory
        state: directory
        mode: 0755

    stat模块

    作用:获取远程文件信息

    [root@ansible ~]# ansible -i /etc/ansible/hosts db-servers -m stat -a "path=/tmp/hosts"

    path:文件路径信息

    get_url模块

    作用:实现远程主机下载指定url到本地,支持sha256sum文件校验

    例如:下载nginx-1.6.3.tar.gz到主机清单中的/tmp/目录下

    [root@ansible ~]# ansible  db-servers -m get_url -a "url=http://nginx.org/download/nginx-1.6.3.tar.gz  dest=/tmp/ mode=0440 force=yes"

    剧本:

    - name: Download foo.conf
    
      get_url:
        url: http://example.com/path/file.conf
        dest: /etc/foo.conf
        mode: 0440
     
    - name: Download file with custom HTTP headers
      get_url:
        url: http://example.com/path/file.conf
        dest: /etc/foo.conf
        headers: 'key:value,key:value'
     
    - name: Download file with check (sha256)
      get_url:
        url: http://example.com/path/file.conf
        dest: /etc/foo.conf
        checksum: sha256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c

    dest:指定节点目录

    mode:权限

    force:如果force=yes,当下载文件时,如果所下的内容和原目录下的文件内容不一样,则替换原文件,如果一样,就不下载了。

    如果为“否”,则仅在目标不存在时才下载文件。 一般来说,只有小型本地文件才应该为“是”。 在0.6之前,该模块表现为默认为“是”。

    yum模块

    linux平台软件包管理:

    state状态(安装)

    。lstest

    。present

    。installed 

    (卸载)

    。removed

    。absent

    例:安装httpd

    [root@ansible ~]# ansible -i /etc/ansible/hosts db-servers -m yum -a "name=httpd  state=latest"

     剧本:

    [root@ansible ~]# vim apache.yml
    - hosts: db_server
      remote_user: root
      gather_facts: False
      tasks:
        - name: install apache on CentOS 7
          yum: 
            name=httpd 
            state=present
        - name: copy httpd conf
          copy: 
            src=/etc/httpd/conf/httpd.conf 
            dest=/etc/httpd/conf/httpd.conf
        - name: start apache service
          service: 
            name=httpd 
            state=started             

    cron模块

    作用:远程主机crontab配置

    例: 每三十分钟执行 df -h 查看磁盘情况

    [root@ansible ~]# ansible -i /etc/ansible/hosts db-servers -m cron -a "name='list fdisk' minute='*/30' job='df  -h'"

    常用参数:

    。minute参数: 分钟

    。hour参数:小时

    。day参数: 天数

    。month参数:月

    。weekday参数:周

    其他参数:

    user参数:此参数用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户。

    job参数:此参数用于指定计划的任务中需要实际执行的命令或者脚本,比如上例中的 “echo test” 命令。

    name参数:此参数用于设置计划任务的名称,计划任务的名称会在注释中显示,当不指定计划任务的名称时,ansible 会默认为计划任务加入注释,注释的内容为 #Ansible: None,假设指定计划任务的名称为 test,那么注释的内容为#Ansible: test,在一台机器中,计划任务的名称应该具有唯一性,方便我们以后根据名称修改或删除计划任务。

    disabled参数:当计划任务有名称时,我们可以根据名称使对应的任务”失效”(注释掉对应的任务)。注意,使用此参数时,除了需要指定任务的名称,还需要同时指定任务的job 以及任务的时间设定,而且任务的时间设定必须和对应任务完全相同,否则在注释任务的同时,任务的时间设定会被修改,除非你确定这样做。

    backup参数:如果此参数的值设置为 yes,那么当修改或者删除对应的计划任务时,会先对计划任务进行备份,然后再对计划任务进行修改或者删除,cron 模块会在远程主机的 /tmp 目录下创建备份文件,以 crontab 开头并且随机加入一些字符,具体的备份文件名称会在返回信息的 backup_file 字段中看到,推荐将此此参数设置为 yes。

    service模块

    作用:远程主机系统服务管理

    service模块常用参数:

    。name:此参数用于指定需要操作的服务名称,比如 nginx,httpd。

    。 state参数:此参数用于指定服务的状态

       I:started(启动)

       II:stopped(停止)

       III:restarted(重启)

       vi:reloaded(平滑重启)

    enabled参数:此参数用于指定是否将服务设置为开机

       I:yes(开机自启)

       II:no(不开机自启)

    例:远程启动Apache服务

    [root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd state=restarted"

    user模块

    作用:远程主机用户管理

    [root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m user -a "name=xuegod6 state=present"

    常用参数:

    name参数:必须参数,用于指定要操作的用户名称,可以使用别名 user。

    group参数:此参数用于指定用户所在的基本组。

    gourps参数:此参数用于指定用户所在的附加组。(附加组之间用逗号隔开)注意,如果说用户已经存在并且已经拥有多个附加组,那么如果想要继续添加新的附加组,需要结合 append 参数使用,否则在默认情况下,当再次使用 groups 参数设置附加组时,用户原来的附加组会被覆盖。

    append参数:如果用户原本就存在多个附加组,那么当使用 groups 参数设置附加组时,当前设置会覆盖原来的附加组设置,如果不想覆盖原来的附加组设置,需要结合 append 参数,将 append 设置为 yes,表示追加附加组到现有的附加组设置,append 默认值为 no。

    shell参数:此参数用于指定用户的默认 shell。

    uid参数:此参数用于指定用户的 uid 号。

    expires参数:此参数用于指定用户的过期时间,相当于设置 /etc/shadow 文件中的的第8列,比如,你想要设置用户的过期日期为2018年12月31日,那么你首先要获取到2018年12月31日的 unix 时间戳,使用命令 “date -d 2018-12-31 +%s” 获取到的时间戳为1546185600,所以,当设置 expires=1546185600 时,表示用户的过期时间为2018年12月31日0点0分,设置成功后,查看远程主机的 /etc/shadow 文件,对应用户的第8八列的值将变成17895(表示1970年1月1日到2018年12月31日的天数,unix 时间戳的值会自动转换为天数,我们不用手动的进行换算),目前此参数只支持在 Linux 和 FreeBSD 系统中使用。

    comment参数:此参数用于指定用户的注释信息。

    state参数:此参数用于指定用户是否存在于远程主机中,可选值有 present、absent,默认值为 present,表示用户需要存在,当设置为 absent 时表示删除用户。

    remove参数:(是否删除家目录)当 state 的值设置为 absent 时,表示要删除远程主机中的用户。但是在删除用户时,不会删除用户的家目录等信息,这是因为 remove 参数的默认值为 no,如果设置为yes,在删除用户的同时,会删除用户的家目录。当 state=absent 并且 remove=yes 时,相当于执行 “userdel --remove” 命令。

    password参数:(密文加密)此参数用于指定用户的密码。但是这个密码不能是明文的密码,而是一个对明文密码”加密后”的字符串,相当于 /etc/shadow 文件中的密码字段,是一个对明文密码进行哈希后的字符串,你可以在 python 的命令提示符下输入如下命令,生成明文密码对应的加密字符串。
    例:

    [root@ansible-manager ~]# python  
    Python 2.7.5 (default, Aug  4 2017, 00:39:18) 
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import crypt;crypt.crypt('666666')
    '$6$ziT/sb5KRtUaxoq7$ulfHVLqVgXfmfFUYY7FppzqBQMUYd.2GLDyQwmKv4dYAd0zpgtt5JDheoO/OvvTvY53x9UShX.PtHykJEvsmG0'
    
    ansible ansible-demo3 -m user -a ' name=ding password="$6$ziT/sb5KRtUaxoq7$ulfHVLqVgXfmfFUYY7FppzqBQMUYd.2GLDyQwmKv4dYAd0zpgtt5JDheoO/OvvTvY53x9UShX.PtHykJEvsmG0" '

    group模块

    作用:批量创建用户组

    常用参数:

      gid:创建的组ID信息

      name:创建组名称信息

      state:参数

        。absent:删除指定的用户组

        。present:创建指定的用户组

    创建一个指定的用户组 god  gid=666

    [root@ansible ~]# ansible  db_server -m  group -a "name=god   gid=666"

    删除一个指定的组用户god  gid=666

    [root@ansible ~]# ansible  db_server  -m group  -a "name=god  gid=666 state=absent"

         备注:无法支持"<",">","|",";","&"等符号

    作用:批量进行挂在操作

    常用选项:

    src:需要挂载的存储设备或文件信息

    path:指定目标挂在的目录

    fstype:指定挂载是的文件系统类型

    state:状态

      进行挂载:present / mounted

      present:不会实现立即挂载,修改fstab文件,实现开机自动挂载

      mounted:会立即实现挂载,并且会修改fstab文件,实现开机自动挂载

      进行卸载:absent / umounted 

      absent:会实现立即卸载,并且会删除fstab信息,禁止开机自动挂载

      umounted:会实现立即卸载,但是不会删除fstab文件信息

    [root@ansible ~]# ansible  db_server -m mount -a " src=172.16.1.31:/data path=/data fstype=nfs  state=present"
    # 将web服务器挂载到nfs存储服务器/data上面
  • 相关阅读:
    CSS样式
    Python宏观
    javaScript----------(函数)
    vue-----5计算属性
    python之函数作用域、嵌套以及闭包
    python之函数的定义、传参以及动态参数
    python之文件操作
    基础数据类型的补充以及深浅copy
    小数据池、代码块以及编码转换
    python基础二
  • 原文地址:https://www.cnblogs.com/Mercury-linux/p/11766475.html
Copyright © 2020-2023  润新知