zoukankan      html  css  js  c++  java
  • Linux九阴真经之九阴白骨爪残卷4(自动化运维之ansible用法一)

    ansible是什么?

     

    ansible是什么?

    它是一个配置管理工具,也是一个自动化运维工具。

    ansible能做什么?

    ansible 可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。

    比如:同时在200台服务器上安装dhcp服务,并启动。

    比如:将某个文件一次性拷贝到200台服务器上

    比如:每当有新服务器加入工作环境时,你都啊哟为新服务器部署redis服务,也就是说你需要经常重复的完成相同的工作。

    特性

    1、模块化:调用特定的模块,完成特定任务


    2、有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块


    3、支持自定义模块


    4、基于Python语言实现


    5、部署简单,基于python和SSH(默认已安装),agentless


    6、安全,基于OpenSSH


    7、’支持playbook编排任务


    8、幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况


    9、无需代理不依赖PKI(无需ssl)


    10、可使用任何编程语言写模块


    11、YAML格式,编排任务,支持丰富的数据结构

    ansible 配置文件

    ansible 配置文件                                       /etc/ansible/ansible.cfg (一般保持默认)

    主机列表配置文件                                     /etc/ansible/hosts

    库文件存放目录                                         /usr/share/my_modules

    检查对应服务器的host_key,建议启用,取消注释

    日志文件                                                    /var/log/ansible.log

    临时py命令文件存放在远程主机目录        $HOME/.ansible/tmp

    本机的临时命令执行目录                           $HOME/.ansible/tmp

    默认并发数                                                 forks = 5

    默认sudo 用户                                            sudo_user = root

    每次执行ansible命令是否询问ssh密码       ask_sudo_pass = True

    ask_sudo_pass = True

    remote_port = 22

    基础配置

    实验环境:一台centos7.4的主控机和2台centos6.9的受控机。

    这三台IP地址依次分别如下

    192.168.95.2

    192.168.95.3

    192.168.95.129

    连接一台受控主机,以K的方式验证,如不使用 -k 功能,则不能连接

    同时连接两台受控机,在IP地址后面再添加一条即可,用逗号隔开

    我们发现,无论是连接一台或者多台,都要输入受控机的密码,这样做是不是很麻烦呢? 到这里就有人想到用openssl 做一个 基于key 的免密认证 ,下次登录的时候就不用再输入密码了,真的是很聪明呢!

    [root@centos7 ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.95.3
    
    [root@centos7 ~]#ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.95.129

    若感觉SSH连接太慢,则更改/etc/ssh/sshd_conf 文件 

     ansible系列命令

    ansible-doc: 显示模块帮助,相当于man

    -a 显示所有模块的文档


    -l, --list 列出可用模块


    -s, --snippet 显示指定模块的playbook片段

    示例:
    ansible-doc –l 列出所有模块


    ansible-doc ping 查看指定模块帮助用法


    ansible-doc –s ping 查看指定模块帮助用法

    ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点

    ansible <host-pattern> [-m module_name] [-a args]
    --version 显示版本
    -m module 指定模块,默认为command
    -v 详细过程 –vv -vvv更详细
    --list-hosts 显示主机列表,可简写—list
    -k, --ask-pass 提示连接密码,默认Key验证
    -K, --ask-become-pass 提示输入sudo
    -C, --check 检查,并不执行
    -T, --timeout=TIMEOUT 执行命令的超时时间,默认10s
    -u, --user=REMOTE_USER 执行远程执行的用户
    -b, --become 代替旧版的sudo 切换

    ansible的Host-pattern

    匹配主机的列表
    All :表示所有Inventory中的所有主机
    ansible all –m ping


    * :通配符

    ansible “*” -m ping
    ansible 192.168.1.* -m ping
    ansible “*srvs” -m ping


    或关系
    ansible “websrvs:appsrvs” -m ping
    ansible “192.168.1.10:192.168.1.20” -m ping

    逻辑与
    ansible “websrvs:&dbsrvs” –m ping 
    在websrvs组并且在dbsrvs组中的主机


    逻辑非
    ansible ‘websrvs:!dbsrvs’ –m ping
    在websrvs组,但不在dbsrvs组中的主机


    综合逻辑
    ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
    正则表达式


    ansible “websrvs:&dbsrvs” –m ping
    ansible “~(web|db).*.magedu.com” –m ping

     ansible 执行过程

    ansible命令执行过程


    1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
    2. 加载自己对应的模块文件,如command
    3. 通过ansible将模块或命令生成对应的临时py文件,并将该 文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
    4. 给文件+x执行
    5. 执行并返回结果
    6. 删除临时py文件,sleep 0退出


    执行状态:

    绿色:执行成功并且不需要做改变的操作
    黄色:执行成功并且对目标主机做变更
    红色:执行失败

    示例
    以wang用户执行ping存活检测
    ansible all -m ping -u wang -k


    以wang sudo至root执行ping存活检测
    ansible all -m ping -u wang –b -k


    以wang sudo至mage用户执行ping存活检测
    ansible all -m ping -u wang –b -k --become-user mage


    以wang sudo至root用户执行ls
    ansible all -m command -u wang --become-user=root -a 'ls /root' -b –k -K

     ansible常用模块

     command :在远程主机执行命令,默认模块,可忽略-m 选项

    例:ansible  all  -a  'df  -h'   查看所有主机的分区利用率

           ansible all -a 'removes=/etc/fstab cat /etc/fstab'    查看所有主机的/etc/fstab ,如果存在,则执行,不存在则跳过不执行

             ansible all -a 'removes=/etc/fstab cat /etc/fstab'    与removes相反,如果存在则不执行,不存在则执行

           ansible all -a  'chdir=/boot  ls'                                切换到boot文件夹  用 ls 查看

      shell 模块  : 用shell 执行命令

     例:ansible all -m  shell  -a  'echo $HOSTNAME'

              ansible  all  -m  shell  -a 

              ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’

        调用bash执行命令 类似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &>                     /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,   copy到远程,执行,再把需要的结果拉回执行命令的机器

      

     script:运行脚本

    -a "/PATH/TO/SCRITP_FILE"

    ansible  all/websrvs(主机清单分组)  -m script  -a   f1.sh

     例:写一个脚本 ,让 主机清单里的 所有主机都运行

    copy模块

    从服务器复制文件到客户端

    ansible srv -m copy -a "src=/root/f1.sh  dest=/tmp/f2.sh  owner=wang mode=600 backup=yes"

    如目标存在,默认覆盖,此处指定先备份
    ansible srv -m copy -a “content=‘test content ’ dest=/tmp/f1.txt” 利用内容,直接生成目标文件

    例:将本机文件复制到远程主机 , 如果想删除要用   shell 模块  (-m   shell)

     

     复制文件 修改权限 和 所有者

     fetch模块

    从客户端取文件至服务器端,copy相反,目录可以先tar

    ansible  all -m   etch  -a  'src=/root/a.sh  dest=/date/scripts'

     示例: 打包/var/log 下所有日志 文件并远程抓取

    ansible all  -m  shell  -a 'tar Jcf  log.tar.xz  /var/log/*.log'

    ansible all  -m  fetch  -a  'src=/root/log.tar.xz  dest=/date'

    file 模块

    设置文件属性

    ansible  all  -m  file  -a 'name=/date/f3  state=touch'     创建文件

    ansible  all  -m  file  -a  'name=/date/f3 state=absent'    删除文件

    ansible  all  -m  file  -a  'name=/date/dir1 state=directory'   创建目录

    ansible  all  -m  file  -a  'name=/date/dir1 state=absent'       删除目录

    ansielb  all  -m  file  -a 'src=/etc/fstab  dest  /data/fstab.link  state=link'    创建软链接

    ansible  all  -m file  -a  'dest /data/fstab.link  state=absent'     删除软链接

    ansible  all  -m  file  -a "path =/root/a.sh  owner=wang  mode = 755"

    ansible  web  -m  file -a 'src=/app/testfile  dest=/app/testfile-link state=link'

    hostname:模块

    管理主机名,生效同时更改文件永久生效

    更改一个主机的主机名

    ansible  node1  -m  hostname  -a "name=websrv"

     注意:

    (1)host 模块不会修改/etc/hosts 文件中的主机名解析, 注意修改

    (2)批量修改主机名是最好加变量,放置素有主机名一致

    cron 模块

    计划任务

    支持时间: minute . hour , day, mouth, weekday

    ansible all  -m   cron  -a "minute=*/5  job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' 

    name=synctime" 创建任务

    ansible  all  -m  cron  -a 'state=absent anme=synctime'  删除任务

    示例:

    创建计划任务:每周1、3、5 每分钟打印 ,任务名称:warningcron

    ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall  warning " name=warningcron'

     

    注释cronname=waringcron 的计划任务

    ansible  all  -m  cron  -a  'disabled=true  job="/usr/bin/wall warning" name=warningcron'

    给cronname=waringcron的计划任务去掉注释:

    ansible all  -m cron  -a 'disabled=true  job="/usr/bin/wall warning" name=warning '

    创建计划任务:每5分钟同步一次服务器时间, 任务名称:sync

    ansible  all  -m  cron  -a  "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null'

    name=sync"

    删除计划任务

    ansible  all  -m  cron  -a 'state=obsent name=sync'

    yum模块

    管理包

    示例:

    yum安装vsftpd包:(默认 state=install)

    ansible all -m  yum  -a 'name=vsftpd'

    安装多个包用逗号隔开

    ansible all -m  yum  -a 'name=vsftpd,httpd'

    显示所有已安装的包

    ansible  all  -m  yum  -a 'name=vsftpd  list=install'

    卸载vsftpd包

    ansible  all  -m  yum  -a 'name=vsftpd  state=removed'

    安装从互联网下载的包

    ansible  srv(主机清单分组)  -m copy  -a  'src=/root/package.rpm dest=/data/package'

    ansible  srv  -m  yum  -a 'name=/data/package.rpm'

    更新缓存

    ansible  all  -m  yum  -a  'update_cache=yes'

    更新缓存同时安装dsta包

    ansible  all  -m  yum  -a 'name=dstat  update_cache=yes'

    ansible  all  -m  yum -a 'name=httpd  state=latest'  安装

    ansible  all  -m  yum  -a  'name=httpd  state=absent'  删除

     

    service模块

    管理服务

    ansible  all  -m  service  -a  'name=httpd state=stopped'  停止服务

    ansbile  all  -m  service  -a  'name=httpd state=started'    开启服务(reloaded:重载  restarted:重启)

     

    user 模块

    管理用户

    添加用户、指定uid、家目录、主组及注释

    ansible  all -m  service   -a 'name=user1  comment="test  user" uid=2048 home=/app/user1 group=root'

    ansible  all -m  user  -a  'name=sysuser1 system=yes home=/app/sysuser1'

    ansible  all -m user   -a  'name=user1  state=absent  remove=yes'  删除用户及家目录等数据

     

    添加一个nginx用户:

    ansible srv -m user -a ‘name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment=”nginx service”

    删除nginx用户同时删除家目录:

    ansible srv -m user -a ‘name=nginx state=absent remove=yes’

    group模块

              管理组

    创建一个系统组

    ansible  all  -m group  -a  "name=testgroup  system=yes"

    删除一个组

    ansible  all  -m  group -a "name=group11  state=absent"

    创建nginx组

    ansible  all  -m  group  -a  'name-nginx  system=yes  gid=80'

    删除nginx组

    ansible  all  -m  group  -a  'name=nginx  state=absent'

    ansible系列命令

    ansible系列命令包括

    ansible

    ansible-doc

    ansible-playbook

    ansible-vault

    ansible-console

    ansible-galaxy

    ansible-pull

    ansible-doc

    功能 显示模块帮助,相当于man

    格式:ansible-doc [options]  [module...]

    -a        显示所有模块文档

    -l         列出可用模块

    -s        显示制动模块的 简洁用法

    示例:

    ansible-doc  ping        查看ping模块帮助

    ansible-co  -s ping      查看ping模块的简单说明

    ansible-vault

    功能:管理加密解密yml文件

    格式:ansible-vault [create|decrypt|edit|encrypt|rekey|view]

    ansible-vault encrypt hello.yml   加密yml文件

    ansible-vault decrypt hello.yml   解密yum文件

    ansible-vault  view  hello.yml      查看yml加密文件

    ansible-vault edit hello.yml         编辑加密文件

    ansible-vault rekey  hello.yml     重新修改加密口令

    ansible-vault  create  new.yml    创建新文件

    ansible-console

    功能:ansible控制台,可交互执行命令,支持tab

    root@test(2)[f:10] $

    执行用户@当前操作的主机组(当前组的主机数量)[f:并发数] $

    设置并发数:forks  n     例:    forks  10

    切换组:cd主机组         例:    cd  web

    列出当前组朱姐列表:list

    列出所有的内置命令:?或 help

     示例

     列出主机列表中所有主机

    root@all (2)[f:5]$ list

    切换至appsrvs组

    root@all (2)[f:5]$ cd appsrvs

    列出appsrvs组下所有主机

    root@appsrvs (2)[f:5]$ list

     例:

     安装httpd服务

    root@appsrvs (2)[f:5]$ yum name=httpd   state=present

    开启httpd服务:

    root@appsrvs (2)[f:5]$  service name=httpd state=stated

     ansible-galaxy

     功能:连接 https://galaxy.ansible.com下载相应的roles

    列出所有已安装的galaxy:

    ansible-galaxy list

    安装galaxy:

    ansible-galaxy install geerlingguy.redis

    删除galaxy:

    ansible-galaxy remove geerlingguy.redis

     ansbile-pull

    功能:推送命令至远程,效率无限提升,对运维技术要求较高

    当前应用还较少

    在本节内容中,我们主要介绍了ansible的使用及一些常用模块,在下节内容中,我们将为您解读

    ansible中playbook以及roles的使用

      

  • 相关阅读:
    12-2 mysql 查询
    12-1 mysql的增删改减
    12-1 上午mysql 基本语句
    [题解] [FJOI2016] 建筑师
    [题解] [CF932E] TeamWork
    [题解] [Codechef] CNTDSETS
    [题解] [清华集训 2017] 榕树之心
    [题解] [AGC013D] Piling Up
    [题解] [CQOI2011] 放棋子
    [题解] [ZJOI2017] 仙人掌
  • 原文地址:https://www.cnblogs.com/huxiaojun/p/9108218.html
Copyright © 2011-2022 走看看