zoukankan      html  css  js  c++  java
  • Ansible批量部署工具

    Ansible:自动化运维工具

     

      你需要在一台机器上yum install 一个包,这时候有一个需求,比如现在有5台机同时需要装apache这个包,那么100台呢,ssh上去就太慢了,这时候就借助到了ansible批量部署工具。

    通过host inventory这个文件去管理需要批量部署的主机,它实现的就是ssh协议。

    把公钥拷给需批量部署的主机。

    Core Modules模块:核心模块,比如说cp、yum这些命令在ansuble里模块化了。

    Custom Modules模块:自定义模块,但是得需要有编程语言技术。

    Connection Plugins:连接插件。

    playbooks:一个任务或条命令代表一个play,多个任务写在一个文件里。

    工作原理

    ansible加载hosts文件,通过免秘钥或配置文件参数来批量管理主机。

    ansible优点:

    上手简单,无需安装客户端

    ansible无需客户端

    配置简单、扩展性强

    支持API自定义模块,可通过python扩展

    幂等性:一种操作重复多次结果相同82分19

    ansible安装

    yum install epel-release
    
    yum install ansible

    如遇ansible下载不成功,是yum仓库的问题,把自己的移除,而后把C开头的文件都移除来,而后yum clean all ,再去下载即可。

    ansible配置客户端

    首先生成密钥

    ssh-keygen

    而后进入.shh这个文件,里面的id_rsa.pub文件就是公钥,id_rsa就是私钥。

    利用scp发送给客户端

    也可以 

    ssh-copy-id -i id_rsa.pub 客户端ip
    vim /etc/ansible/hosts

    这个就是host inventory文件

    在这个文件里需要定义组:格式如下:

    [组名自定义]

    客户端ip ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=密码(这是通过配置文件免密登录)
    
    ansible 组名 -m ping 这一步是ping组里所有机器,看是否ok(调用模块命令)

     

    显示的changed:false是没有做出改变的意思

    如果ping失败,请打开配置文件

    修改#host_key_checking=False

    把注释打开即可。

    ansible常用命令

    列出当前的核心模块

    ansible-doc -l 

    查看此模块用法

    ansible-doc -s 模块名 

    启动并发线程数,减少压力

    ansible 组名 -f 

    测试通信

    ansible all -m ping

    在组里的机器去创建用户

    ansible 组名 –m user –a 'name=名字'

    给组里的所有机器安装这个软件

    ansible 组名 –m yum –a 'name=安装包名字 state=present'

    卸载组里所有机器的这个安装包

    ansible 组名 –m yum –a 'name=安装包名字 state=absent'

    重启组里所有机器的这个安装包

    ansible 组名 –m service –a 'name=服务名字 state=restarted'

    拷贝当前文件到组里的机器

    ansible 组名 –m copy –a 'src=/root/psu.py dest=/tmp'

    拷贝当前文件到组里的机器的任意一台

    ansible 组里机器的ip –m copy –a 'src=/root/psu.py dest=/tmp'

    直接执行命令

    ansible 组名 –m command  -a 'ls -ltr'

    检测剧本是否有语法错误

    ansible-playbook --syntax-check 文件名.yml  

    模拟执行剧本

    ansible-playbook  -C  文件名.yml   

    palybooks核心部分

    书写格式

    vim 名字.yml
    
    -[空格]hosts:[空格]组名
    
    remote_user:[空格]用户名
    
    tasks:
    
    -[空格]name:[空格]yum install tree
    
    yum:[空格] name=tree state=present
    
    -[空格]name:[空格]changed service status
    
    service:[空格] name=httpd state=started
    
    ansible-playbook 名字.yml  :调用yml文件

    还可以赋予变量

    vim 名字.yml
    
    -[空格]hosts:[空格]组名
    
    remote_user:[空格]用户名
    
    vars:
    
    -[空格]packages:[空格]tree   把tree这个包名赋予给packages这个变量。就是tree=packages
    
    tasks:
    
    -[空格]name:[空格]yum install tree
    
    service:[空格] name={{ packages }} state=absent
    
    ansible-playbook 名字.yml  :调用yml文件

    还可以迭代:比如创建多个用户

    -[空格]hosts:[空格]组名
    
    remote_user:[空格]用户名
    
    vars:
    
    -[空格]packages:[空格]tree   把tree这个包名赋予给packages这个变量。就是tree=packages
    
    tasks:
    
    -[空格]name:[空格]yum install tree
    
    service:[空格] name={{ packages }} state=absent
    
            -[空格]name:[空格]create many users
    
                       user[空格]:[空格]name={{ item }} item是内置变量,可以直接使用
    
                    with_items:
    
                      -[空格]用户名
    
                      -[空格]应户名
    
    ansible-playbook 名字.yml  :调用yml文件

    还可以触发器:

    -[空格]hosts:[空格]组名
    
    remote_user:[空格]用户名
    
    vars:
    
    -[空格]packages:[空格]tree   把tree这个包名赋予给packages这个变量。就是tree=packages
    
    tasks:
    
    -[空格]name:[空格]yum install tree
    
    service:[空格] name={{ packages }} state=absent
    
            -[空格]name:[空格]copy
    
                       copy:[空格]src= 本机文件路径    dest=目标文件路径
    
                       notify:
    
                       -[空格]service httpd restart(给触发器起个名字) 
    
                handlers:
    
                -[空格]name:这的名字一定要跟触发器起的名字一样
    
                          service:[空格]name=httpd state=restarted
    
    ansible-playbook 名字.yml  :调用yml文件
    
    多个触发只需要在任务下紧跟notify:而后在handlers里同一添加要触发的任务即可。

    template模块

    比如我批量部署apache,我的需求是同时安装apache,但他俩的配置文件不能一样,比如里面的端口号不一样。

    vim 命名.yml文件

    - hosts: testhost
    
     remote_user: root
    
     tasks:
    
     - name: copy differernt httpd.conf
    
      template: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf

    而后 改写httpd的配置文件,把端口号设置成一个变量

    Listen {{ port }}
    
    vim /etc/ansible/hosts

    把我们刚设置变量传进去,添加至每台机器后

    port=需求端口号

    port=需求端口号

    roles用法

    把每一个play封装到角色里,就是把目录模块化了。

    第一层目录可以自定义名字,第二层目录必须交roles,而后roles里又包含两个目录,这两个目录也可以自定义名字,而后再在这两个目录里去定义目录。

     

    调用task目录,适用于yum模块,service模块。

    而后进入tasks目录(第四级目录)创建main.yml文件,必须叫这个。

    而后进去直接写任务即可。而后在roles同级目录下,创建site.yml这个文件,而后写入:

    - hosts: 组名
    
     remote_user: root
    
     roles:
    
     - 刚才编写的第三级目录名,就是你编写那个第三级目录,直接把目录名写到这即可。

    调用files目录,适用于copy模块。

    先把你要批量拷贝的文件放到files这个目录里。而后编辑taks目录的main.yml文件:

     

    handlers跟vars目录必须定义main.yml这个文件。

    vars里的main.yml只需定义变量即可。

    变量名 = 名字

    handlers里的main.yml只需定义名字跟任务即可。notify要写到tasks里的main.yml。

    调用的时候调用site.yml这个文件即可。

  • 相关阅读:
    怎么样通过API函数获取tooltip的内容(请高手帮忙)
    Ajax控件之Accordion控件学习
    C#中结构与类的区别
    C# ref and out 区别
    java 将PDF文件的首页提取为图片
    围住浮动元素(消除浮动)的三种方法
    myeclipse unable to install breakpoint
    C#调用C++编写的COM DLL
    高手教你玩53kf在线客服的指定客服功能
    让IIS支持Flv的详细设置方法
  • 原文地址:https://www.cnblogs.com/shuaiyin/p/10956331.html
Copyright © 2011-2022 走看看