zoukankan      html  css  js  c++  java
  • 初识Ansible

    ansible背景

    1.什么是ansible?

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

    2.ansible的是怎么工作的?

    ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
    (1)、连接插件connection plugins:负责和被监控端实现通信;
    (2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
    (3)、各种模块核心模块、command模块、自定义模块;
    (4)、借助于插件完成记录日志邮件等功能;
    (5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

    ansible基础

    1.ansible安装

    yum install wget -y     #安装wget
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo  #下载epel源文件
    
    yum install ansible -y    #安装ansible

     2.ansible的命令格式

    -a MODULE_ARGS, --args=MODULE_ARGS  #模块参数
    
    -C, --check     #白跑一次,不做任何改变
    
    -f FORKS, --forks=FORKS   #指定进程数,做并发用
    
     --list-hosts  #列出主机
     
    -m MODULE_NAME #模块名称
    
     --syntax-check  #检查语法
    
     -k, --ask-pass  ask for connection password   #指定密码

    3.查看ansible生成的配置文件

     rpm -ql ansible  

    配置hosts文件,比如我有四台机器 ip段 192.168.220.133/134/135/136,此时安装ansible机器为192.168.220.133,以下配置

    vi /etc/ansible/hosts 
    192.168.220.134 192.168.220.135 192.168.220.136 #将这3个机器ip写入hosts文件中

    4.ansible如何通过ssh与远程服务器连接?

    第一种: 密码    ssh root@192.168.220.133 -->输入root密码即可

    第二种:秘钥 (推荐)

    • ssh -keygen  #生成秘钥
    • ssh-copy-id root@192.168.220.134  #将秘钥文件复制到远程主机

    当通过ansible控制量级比较大的机器的时候,使用秘钥连接的方法最为快捷方便

    5.ansible的第一个命令ping  

    ping走的是icmp协议

    ansible 192.168.220.134 -m ping 

    #反馈如下便能建立连接
    
    192.168.220.134 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }

    以此类推 ...

      ansible 192.168.220.135 -m ping

      ansible 192.168.220.136 -m ping

      ansible all -m ping  --->所有机器,hosts文件

      ansible 192.168.220.135,192.168.220.136 -m ping   --->探测部分机器

    6.ansible分组查看机器

    #在hosts文件中写入以下配置
    
    [web]
    192.168.220.134
    192.168.220.135
    
    [cache]
    192.168.220.135
    192.168.220.136
    
    [db]
    192.168.220.134
    192.168.220.135
    192.168.220.136

    ansible web --list-hosts     #用来获取符合条件的主机

    #反馈情况为:
    [root@localhost ~]# ansible web --list-hosts
      hosts (2):
        192.168.220.135
        192.168.220.134

    ansible web -m ping         #探测web组内的所有机器

    ansible分组并集

      ansible web,cache -m ping    #探测web,cache两个组的并集机器

    [root@localhost ~]# ansible web,cache,db -m ping
    192.168.220.135 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    192.168.220.134 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    192.168.220.136 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    #两者组内所有

    ansible分组交集 

    • ansible 'web:cache' -m ping  #获取web cache两个组交集的机器
    • ansible 'web:&cache' -m ping  #获取web cache两个组交集的机器
    [root@localhost ~]# ansible 'web:&cache' -m ping 
    192.168.220.135 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    #两者分组中共有的

    ansible分组差集

      ansible 'web:!cache' -m ping  #获取web cache两个组差集的机器

    [root@localhost ~]# ansible 'web:!cache' -m ping 
    192.168.220.134 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    #两者分组中不一样的,表现为前者分组中机器为后者没有,

    弱口令校验

    服务器密码符合规则:

    必须有大小写字母,数字,特殊字符;

    密码必须12位以上;

    密码3个月轮换;

    host-pattern的格式

    • 单个主机
    • 单个组
    • 多个组
      #交集   "web:&cache"
      
      #并集   "web:cache"    "web,cache"
      
      #差集   "web:!&cache"

       

    • 所有机器  all
    • 多个主机   

    ansible常用模块

    获取模块的帮助信息

    [root@localhost ~]# ansible-doc -h   # 显示全部信息
    Usage: ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
    
    -j, --json      #以json的方式返回所有模块的信息
    -l            # 列出所有的模块
    -s, --snippet # 以片段式显示模块的帮助信息
    
    ansible-doc -l |wc -l     #统计ansible的模块 2080

    1.command模块

    执行命令,不支持特殊字符,如$ & < > | ;

    #参数
    chdir   #切换目录 一般编译安装使用
        
    creates   #判断是否存在,如果存在就 不 执行,不存在,就执行
    
    removes  #与creates正好相反
    
    ansible web -m command -a 'pwd'      #执行web组所有机器pwd命令  ,拿到所有机器的 /root    -m表示调用模块, -a 表示参数
    ansible web -m command -a "ls /tmp"  #执行web组所有机器查看tmp目录下的文件
    
    ansible web -m command -a "chdir=/tmp pwd" #切换目录到/tmp下,一般编译安装
    
    ansible web -m command -a "creates=/tmp pwd"  #不被执行,直接跳过 ,因为/tmp已存在
    ansible web -m command -a  "creates=/tmp2 pwd"  #执行,因为/tmp2不存在
    ansible web -m command -a  "creates=/tmp2 mkdir /data" #会被执行,并且创建/data目录,因为/tmp2不存在
    
    ansible web -m command -a "removes=/tmp2 pwd" #不执行,因为tmp2不存在
    ansible web -m command -a "removes=/tmp pwd" #执行

     补充:

    #查看用户是否被成功创建
    1. ll /home
    2. tail -1 /etc/passwd #查看passwd文件(存放密码)最后一行
    3. tail  /etc/shadow   #查看shadow(存放用户信息)
    4. id coco   #查询指定用户id
    
    #给用户设置密码,不需要二次确认
    先创建一个用户 useradd Sheldon
    echo "ni666" |passwd --stdin Sheldon  
    
    #单引号和双引号在echo命令的不同
    [root@localhost ~]# name=coco
    [root@localhost ~]# echo "$name"
    coco
    [root@localhost ~]# echo '$name'
    $coco

    2.shell模块

    执行远程机器上的shell脚本或python脚本

    ansible web -m shell -a "echo 'coco'|passwd --stdin coco " #给远程机器设置用户密码,前提是远程主机上有coco账户
    
    # shell 脚本
    要在文件顶部写上#!/bin/bash
    ansible 192.168.220.134 -m  shell -a "bash /data/a.sh" #执行shell a.sh脚本内容,前提是该机器有这个文件,并有内容  
    
    #示例1
    ansible 192.168.220.134 -m shell  -a "chmod u+x /data/a.sh"  #先远程将a.sh脚本改成可执行
    ansible 192.168.220.134 -m shell  -a "/data/a.sh"  #远程执行脚本
    
    
    # python脚本
    
    开头写上如下两句
    #!/bin/env python 
    #coding:utf-8
    
    ansible 192.168.220.134 -m shell -a "python /root/b.py"  #调用python解释器运行
    
    ansible 192.168.220.134 -m shell -a " /root/b.py"  #自己将该目录下的b.py权限设置为可执行的即可  chmod u+x /root/b.py

    3.script模块

    执行的是管控机/本地的脚本

    ansible db -m script -a "python /root/a.py"  #执行的是本地的脚本,管控机上的脚本
    
    ansible db -m script -a "creates=/root/a.py /root/a.sh" # 判断是远程主机是否存在,如果存在,就不执行,如果不存在,就执行
    ansible db -m script -a "removes=/root/a.py /root/a.sh" # 判断是远程主机是否存在,如果存在,就不执行,如果不存在,就执行
    
    #以上也就是多了个远程主机的条件,但是执行的是本地的脚本

    4.copy模块

    将本地文件复制到远程机上

    #参数
    backup     #创建备份文件,以时间戳结尾
    content    #直接写内容
    dest       #目标地址
    group      #文件的属组
    mode       #文件的权限W2 R4  X1
    owner      #文件的属主
    src        #源文件 
    
    ansible db -m copy  -a "src=/root/a.py dest=/root/a.py" #复制本地文件到远程主机
    ansible db -m copy -a "src=/root/a.py dest=/data/a.py mode=755" #复制文件到远程主机指定路径,并且改变文件权限
    ansible db -m copy -a "src=/root/a.py dest=/data/a.py mode=755 owner=coco" #复制文件到远程主机指定路径,改变文件权限 属主,根据md5值进行比对,注意coco需要在远程主机建立该用户.
    
    ansible db -m copy -a "src=/etc/init.d dest=/tmp/" #复制文件夹
    ansible db -m copy -a "src=/etc/init.d/ dest=/tmp/" #复制文件夹下面的所有文件
    ansible db -m copy -a "src=/etc/init.d dest=/tmp/ owner=coco " #复制文件夹,并改变文件夹的属性,文件夹的文件的属性也会跟着改变
    
    ansible  db -m copy -a "content='生活需要勇气' dest=/tmp/a.sh"   #覆盖写入文字,慎用
    
    ansible db -m copy -a "src=/root/a.py dest=/data/a.py mode=755 owner=coco backup=yes"  #注意: 备份文件,如果远程机器上没有要备份的文件,即使指定了backup=yes也不会去备份文件

    5.file模块

    在远程主机上创建文件,文件夹,软连接,硬链接

    #参数
    access_time   #访问事件
    group         #属组
    mode          #权限
    owner         #属主
    path          #路径
    src           #原文件,link和hard的时候使用
    state:
        directory  文件夹
        file
        touch      空文件
        link       软连接:
        hard       硬链接
        absent     删除
    
    补充:
    #软连接:windows的快捷方式 ln -s 原文件 目标文件     源文件改变,目标文件也改变,可以跨越分区,源文件删除,链接失效
    
    #硬链接:指向同一个硬盘的地址 ln 原文件  目标文件    原文件改变,目标文件也改变,不可以跨越分区,原文件删除,不会受影响
    
    #软连接类似于python中的浅拷贝,硬链接则是像极了深拷贝

     示例

    ansible db -m file -a "path=/data/temp state=directory" #在远程机上创建一个目录
    
    ansible db -m file -a "path=/data/task state=directory owner=coco mode=644"  #在远程机上创建一个属主为coco 且权限为drw - r -r 权限的目录
    
    ansible db -m file -a "path=/data/aiqing.txt state=touch owner=coco mode=644" #在远程机上创建一个属主为coco 的文件
    
    ansible db -m file -a "path=/tmp/fffff src=/data/aiqing.txt state=link"  #在远程机创建一个软连接
    
    ansible db -m file -a "path=/tmp/fffff state=absent"  #删除软连接

    ------------ 平常心 ------------ 面对 ------------ ALL DIFFICULTIES ------------ 勤能补拙,熟能生巧 ------------

    1- 获取db组/opt目录下文件
    
    2- 创建icon用户,并设置密码为xiaokeai
    
    3- 在/tmp目录下生成aa.txt文件,文件的内容为"大弦嘈嘈如急雨,小弦切切如私语,嘈嘈切切错杂弹,大珠小珠落玉盘"
    
    4- 将本地的网卡配置文件复制到远程机器上,并命名为network,用户为icon,用户组为icon,权限为744
    
    5- 在/opt目录下创建ab.py文件,并指定用户为icon,用户组为icon,权限为744
    
    6- 在/opt目录下创建canglaoshi目录
    小小练习
    1. ansible db -m command -a "ls /opt"
    
    2. [root@localhost ~]# ansible db -m command -a "useradd icon"
    
    [root@localhost ~]# ansible db -m shell -a "echo 'xiaokeai'|passwd --stdin 'icon' "   #由于command模块不支持特殊字符,因此需要shell模块支持
    
    3. [root@localhost ~]# ansible db -m copy -a "content='大弦嘈嘈如急雨,小弦切切如私语,嘈嘈切切错杂弹,大珠小珠落玉盘' dest=/tmp/aa.txt"
    
    4.[root@localhost ~]# ansible db -m copy -a "src=/etc/sysconfig/network-scripts/ifcfg-ens33 dest=/opt/network group=icon owner=icon mode=744"
    
    5. ansible db -m file -a "path=/opt/ab.py state=touch group=icon owner=icon mode=744"
    
    6. ansible db -m file -a "path=/opt/canglaoshi state=directory"
    小小练习答案

     6.fetch模块   

    fetch (英 /fetʃ/ vt.取来) 将远程主机器上的文件拉取到本地/管控机,以ip或者主机名生成目录,并保留原先目录结构

    #fetch ---参数
    dest   #目标地址
    src     #源地址
    
    ansible web -m fetch -a "dest=/data src=/data/a.py"  
    #注意拉取远程主机文件的时候如果只获取到目录,无文件无效

    7.yum模块

    ① yum与rpm的区别

      rpm适用于所有环境,而yum要搭建本地yum源才可以使用;

      yum是上层管理工具,自动解决依赖关系,而rpm是底层管理工具。

    ② yum 源的配置

    #配置信息  /etc/yum.repos.d/epel.repo
    [epel]  #名称
    name=Extra Packages for Enterprise Linux 7 - $basearch  #描述信息
    baseurl=http://mirrors.aliyun.com/epel/7/$basearch      #yum源的地址
    failovermethod=priority 
    enabled=1    #指定yum源是否可用,1表示可用,0则相反
    gpgcheck=0   #是否检查gpgkey文件,0表示不检查,1表示检查
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

     ③ 包组

      linux  --> lib     | windows ---> dll

    yum grouplist  #查看包组
    
    yum groupinstall   #安装包组

     ④查看包安装状态

    yum list|grep redis     #出现 @ 代表安装成功
    rpm -q redis   
    
    rpm -qa   #查看所有安装包
    rpm -ql    #查看安装包生成的文件

     ⑤ 参数以及使用

    #yum 参数
    disable_gpg_check     #是否检查key
    disablerepo                #禁用repo
    name         #包名
    state          #状态    installed removed
    
    #注意:在给远程机器安装包组的时候要确保远程机器上有epel.repo 文件
    ansible db -m copy -a "src=/etc/yum.repos.d/epel.repo dest=/etc/yum.repos.d/"
    
    ansible web -m yum -a "name=python2-pip"  #安装一个包
    ansible web -m yum -a "name='@Development Tools'" # 安装包组
    ansible web -m yum -a "name=redis,python2-pip" # 同时安装多个包
    ansible web -m yum -a "name=redis state=absent" # 卸载

    8.pip模块

    ①pip命令

    pip list  #查看所有的python第三方包
    
    pip freeze > requirements.txt   #导出所有第三方包到 requirements.txt
    pip install -r requirements.txt    #安装这些包
     

     ②参数以及使用

    #参数
    virtualenv     #虚拟环境
    name         #包名
    
    ansible web -m pip -a "name=django==1.11.18"  
    ansible web -m pip -a "name=flask"

    9.service模块

    ①相关linux常用命令

    ps -ef|grep redis   #查看redis进程
    
    ss -tnlp    #查看端口信息
    
    #启动服务,停止和重启分别为stop,restart
    systemctl start redis    #Centos7启动方式
    service redis start        #Centos6启动方式
    
    #开机自启动
    systemctl enable redis   #Centos7启动方式
    chkconfig  redis on          #Centos6启动方式

     ②参数以及使用

    enabled   #设置开机自启动
    name      #名称
    state       #状态
        started
        stopped
        restarted    #重启
        reload        #重新加载
    
    ansible web -m service -a "name=redis state=strarted"  #开启远程机器redis
    ansible web -m service -a "name=redis state=stopped"  #关闭
    ansible web -m service -a "name=redis state=started enabled=yes"   #给远程机器设置开机自启redis

    10.crontab模块

    crontab模块 --->定时任务

    ①linux常用命令

    crontab 用途:收集日志,备份数据,同步时间
    
    * * * * * job
    分 时 日 月 周 任务
    0-59 0-23 1-31 1-12 0-7 job
    
    1 * * * * job   #代表每个小时的第一分钟执行job
    2/ * * * * * job  #代表每隔2分钟执行job
    1 10-19 * * * job   #代表10到19点的第一分钟执行job
    #注意: 分钟不要用*,最好是指定时间
    
    crontab -l   #查看计划任务
    crontab -r   # 删除所有计划任务
    crontab -e  #编辑计划任务

     ②参数以及使用

    #注意 ansible中没有crontab  它表现的为cron模块 如下参数
    day   
    huor
    job     #任务
    minute  #分钟
    month   #
    name     
    state   #状态
    user   #执行计划任务的用户
    weekday  #
    disabled  #禁止
    
    ansible web -m cron -a "minute=21 job='touch /tmp/cron.txt' name=touchfile" # 设置计划任务
    ansible web -m cron -a "minute=23 job='touch /tmp/cron.txt' name=touchfile4 disabled=yes" # 禁用计划任务,表现为加注释
    ansible web -m cron -a "name=touchfile4 state=absent" # 删除计划任务

    11.user模块

    ①常用命令

    关于user,必须聊聊用户的分类

    超级用户  --- root     uid :0

    其他用户

    • 系统用户  ---启动服务来专门设置的用户  1-999  Centos7    | 1-499 Centos6
    • 登录用户  ---普通的登录用户   1000-65535  Centos     | 500-65535 Centos6
    #useradd 命令参数
     -d      # 指定家目录
     -g      # 组id
     -G, --groups GROUPS  # 附加组
     -r, --system            # 创建系统用户
     -s, --shell SHELL    # 登陆shell
     -u, --uid UID      #用户id
    
    useradd -s /sbin/nologin -u 2000 -d /opt/coco coco #创建用户,指定用户的登录shell为不登录, id 2000,家目录在/opt/coco
    useradd -s /sbin/nologin -G root,na  -d /opt/na na #指定附加组,最大的后面+1
    useradd -r feige # 创建系统用户,从999倒序
    userdel  feige # 删除用户
    userdel -r fei # 删除用户并删除用户的家目录 

    ②参数以及使用

    #参数
    group   #
    groups  #附件组
    home    #家目录
    name    #用户名
    password    #密码
    shell    #登录shell
    remove   #删除用户并且删除用户家目录
    state    #状态
    system  #系统用户
    uid        #用户id
    
    ansible db -m user -a "name=dafei shell=/sbin/nologin home=/opt/dafei uid=2001 group=root"  #创建用户,指定用户家目录,登录shell情况,uid,组 
    
    #解释: /sbin/nologin 作用
    指的是不允许login当前Linux系统。当用户配置成/sbin/nologin时,如果再使用该用户ssh到linux操作系统,会提示如下内容:This account is currently not available。该功能类似于封掉某个帐户。
    
    ansible db -m user -a "name=dafei system=yes" #创建系统用户
    ansible db -m user -a "name=xiaofei state=absent"  #删除用户
    ansible db -m user -a "name=xiaofei state=absent remove=yes" #删除用户并且删除其家目录

    12.group模块

    ①linux常用命令

    #用户组的分类
    超级组   root                      uid 0
    其他组  
        系统组  uid  1-999 centos7  |  1-499 centos6
        普通组  uid  1000-65535centos7   |  500-65535 centos6
     
    -g    #指定组的id
    -r     #指定系统组
    
    cat /etc/group    #查看所有组
    groupadd -g 3000 xiaofei  #创建一个组id为3000的组
    groupdel  xiaofei    #指定删除改组

    ②参数以及使用

    # 常用参数 
    gid    #组id
    name   #组名
    state    #状态
    system    #系统组
    
    ansible db -m group -a "name=xiaoliu"    #创建普通组
    ansible db -m group -a  "name=xiaowang system=yes" #创建系统组
    ansible db -m group -a "name=xiaowang state=absent" #删除组
    #web组操作
    
    1 - 创建yuanyaun用户,指定用户的家目录为/opt/,指定用户的id为3000,指定用户的附加组为root
    2 - 创建tiantian用户组
    3 - 将本地的/etc/fstab 复制到远程,并指定属主是yuanyuan,属组是tiantian
    4 - 安装redis并启动,设置开机自启动
    5 - 安装django
    6 - 设置计划任务每天凌晨2点半备份/etc/目录,tar
    小小练习啦
    1. ansible web -m user -a "name=yuanyuan home=/opt/ uid=3000 groups=root"
    
    2. ansible web -m user -a "name=tiantian"
    
    3.ansible web -m copy -a "src=/etc/fstab dest=/etc/ owner=feige group=feige" 
    
    4.ansible web -m yum -a "name=redis"
      ansible web -m service -a "name=redis state=started enabled=yes"
    
    5.absible web -m pip -a "name=django"
    
    6. 30 2 * * *   tar -zvcf  alletc.tar.gz   /etc/* 
    ansible web -m cron -a "minute=30 hour=2 job='tar a.tar.gz /etc/*' name=aaa"
    小小练习啦答案

     

  • 相关阅读:
    小记:xml画一个爱心。
    类似UC天气下拉和微信下拉眼睛头部弹入淡出UI交互效果(开源项目)。
    FloatingActionButton增强版,一个按钮跳出多个按钮--第三方开源--FloatingActionButton
    回调机制的实现。
    小记:使用SharedPreferences存储来设置程序第一次进入欢迎界面,以后不会再进入欢迎界面。
    小记:获取系统时间的long值,格式化成可读时间。
    写程序的欢迎界面(运用画图方法画圆球)。
    并发的HashMap为什么会引起死循环?
    zuul重试配置
    zuul超时问题
  • 原文地址:https://www.cnblogs.com/CrazySheldon1/p/10675062.html
Copyright © 2011-2022 走看看