zoukankan      html  css  js  c++  java
  • ansible

    一、ansible简介

    ansible是一个自动化批量部署工具,底层是用python写的(paramiko,jinjia2(模板语言),yaml)

    核心组件:

        Ansible:ansible的核心程序

        Playbooks:yaml格式文件,多个任务定义在一个文件中,使用时可以统一调用,‘剧本’用来调用哪些主机需要调用哪些模块来完成的功能。

        Host Inventory:管理主机,记录了由每一个ansible管理的主机信息,包括ssh端口号,root用户密码,ip地址等,可以通过file加载,也可以通过CMDB加载。

        Core Modules:核心模块,把常用命令模块化,Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。

        Custom Modules:支持任意语言,自定义模块,完成Core Modules无法完成的功能。

        Connection Plagins:连接作用,连接插件,Ansible和Host通信使用。

    工作原理:

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

    优点:

      ansible不需要安装客户端或agent(代理)

      支持API和自定义模块

      通过playbooks定制强大的配置,状态管理

       配置简单,功能强大

      提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台

      幂等性:一次操作重复多次结果相同

    ansible配置客户端(两种方法):

      第一种:ssh免密登录

      第二种:vim /etc/ansible/hosts在最低端写入要管理的主机

        如:192.168.42.12 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=root

    二、ansible常用模块

    ①ping模块

    [root@localhost ~]# ansible testhost -m ping
    192.168.42.10 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    192.168.42.9 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    192.168.42.8 | SUCCESS => {
        "changed": false, 
        "ping": "pong"
    }
    测试主机连通性

    ②command模块

    这个模块可以直接在远程主机上执行命令,并将结果返回本主机。

    ansible testhost -m command -a 'ls -ltr'

    ③shell模块

    shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。

    ansible testhost -m shell -a 'rpm -qa | grep "http"'

    ④copy模块

    这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等。(src是源文件,dest是目标文件,可以改名)

    ansible testhost -m copy -a 'src=/root/1 dest=/tmp'
    #给定内容生成文件,并制定权限
    ansible web -m copy -a 'content="I am keer " dest=/data/name mode=666' #connect可以直接指定文件的值(替换src)
    #查看上条命令的执行结果
    ansible testhost -m shell -a 'ls -l /tmp/'
    #覆盖,原文件备份
    ansible testhost -m copy -a 'content="I am keerya " backup=yes dest=/tmp/name mode=666'

    ⑤file模块

    该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等。

    ⑥yum模块

    name=要安装的包名   state有三种模式(present下载   latest下载最新版本   absent卸载)

    ansible testhost -m yum -a 'name=httpd state=present'

    ⑦service模块

    该模块用于服务程序的管理。

    name=服务名称  state有started,stopped,restarted,reloaded四种模式,enabled开机自启。

    ansible testhost -m service -a 'name=ntpd state=started enabled=true'

    ⑧user模块

    该模块主要是用来管理用户账号。

    #创建一个uid为11111的keer用户
    ansible testhost -m user -a 'name=keer uid=11111'
    #删除用户
    ansible testhost -m user -a 'name=keer state=absent'

    ⑨scrip模块

    该模块用于将本机的脚本在被管理端的机器上运行。直接指定脚本的路径即可

    在服务端写一个脚本/tmp/test.sh

    ansible testhost -m script -a '/tmp/test.sh'

    ⑩setup

    查看用户信息

      facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。
      facts就是变量,内建变量 。每个主机的各种信息,cpu颗数、内存大小等。会存在facts中的某个变量中。调用后返回很多对应主机的信息,在后面的操作中可以根据不同的信息来做不同的操作。如redhat系列用yum安装,而debian系列用apt来安装软件。

    ansible testhost -m setup
    ansible testhost -m setup -a 'filter="*mem*"'

    三、playbooks

    一个任务叫做一个play,多个play组成的组合叫playbooks

    ①基础

    - hosts: testhost
      remote_user: root
      tasks:
      - name: cteate user name
        user: name=jam1

    ②变量

    - hosts: testhost        #冒号后面必须有空格
      remote_user: root
      vars:
      - packages: jam2       #等价于packages=jam2
      tasks:                        #tasks的s不能少
      - name: cteate user name     #名字随便起,最好是任务的注释
        user: name={{ packages }}    #与变量呼应
      - name: delete
        user: name=jam1 state=absent

    ③迭代

    什么情况下可以用到迭代?

    安装软件包;创建用户,组;删除用户,软件包等

    - hosts: testhost   #-和:后面必须都有空格
      remote_user: root    #用root用户执行
      vars:
      - packages: jam2
      tasks:
      - name: cteate user name
        user: name={{ packages }}
      - name: delete
        user: name=jam1 state=absent
      - name: yum install many
        user: name={{ item }} state=present     #迭代固定格式
        with_items:   #固定
        - jam0
        - jam1
        - jam2
        - jam3

    ④触发器

    只要执行文件就重启ntpd,类似于只要修改配置文件就重启服务

    - hosts: testhost
      remote_user: root
      vars:
      - packages: jam2
      tasks:
      - name: cteate user name
        user: name={{ packages }}
      - name: delete
        user: name=jam1 state=absent
      - name: yum install many
        user: name={{ item }} state=present
        with_items:
        - jam0
        - jam1
        - jam2
        - jam3
        notify:      #触发器,固定
        - restart ntp    #随便起
      handlers:       #要与tasks对齐
      - name:  restart ntp      #名字要与触发器名字一样
        service: name=ntpd state=restarted

    ⑤模板

    第一步:在root下创建templates目录

    第二步:将目标文件复制到templates目录下并改名为以j2为后缀的文件

    第三步:在yaml或yml文件里调用templates模块

    第四步:把要拷贝的文件里的参数变为变量

    第五步:在/etc/ansible/hosts文件里添加变量

    四、roles

    什么情况下用到roles

      假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务器。我们如何来定义playbook?

    第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建php,第三个play用到第三个主机上,用来构建MySQL。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调。比如说后来又加进来一个主机,这个第4个主机既是httpd服务器,又是php服务器,我们只能写第4个play,上面写上安装httpd和php。这样playbook中的代码就重复了。(类似与函数,一次定义多次调用)

      把每一个play封装到角色里面,调用时只需要添加角色就好了,提高复用率。

    [root@localhost ~]# mkdir playbooks/roles/{webserver,dbserver}/{tasks,templates,vars,handlers,files} -pv

      [root@localhost ~]# tree playbooks

    playbooks
    └── roles
    ├── dbserver
    │   ├── files
    │   ├── handlers
    │   ├── tasks
    │   ├── templates
    │   └── vars
    └── webserver
    ├── files
    ├── handlers
    ├── tasks
    ├── templates
    └── vars

     

    tasks

    1.切换目录到/root/playbooks/roles/webserver/tasks

    2编辑文件.vim main.yaml(文件名是固定的

    3.切换到/root/playbooks,与roles同级编辑文件vim site.yaml(文件名也是固定的

    4.执行ansible-playbook site.yaml

    修改files


    [root@localhost webserver]# cp /etc/httpd/conf/httpd.conf files/ #在webserver下复制etc/httpd/conf/httpd.conf到files目录下
    [root@localhost tasks]# cd roles/webserver/tasks #修改后再写任务时就不用写绝对路径了,直接写文件名

    [root@localhost tasks]# vim main.yaml #将你要执行的任务写入文件中
    [root@localhost playbooks]# ansible-playbook site.yaml

    vars,handlers

    1.编辑vars(注意packages前面没有-

    2.编辑handlers

    3.编辑tasks

    4.ansible-playbook执行

    templates

    [root@localhost webserver]# cp files/httpd.conf templates/
    [root@localhost webserver]# vim templates/httpd.conf   #修改变量{{ port }}

    编辑完成后在/etc/ansible/hosts添加变量

  • 相关阅读:
    sqlalchemy presto 时间比较
    python 读取consul配置
    移动平台自动化测试:appium(二)
    移动平台自动化测试:appium(一)
    web自动化测试:watir+minitest(五)
    web自动化测试:watir+minitest(四)
    从智能垃圾桶模型引发的思考?
    AD技巧之敷铜
    AD技巧之如何修改过孔的默认尺寸
    硬件工程师之路之电阻知识
  • 原文地址:https://www.cnblogs.com/daisyyang/p/10806203.html
Copyright © 2011-2022 走看看