zoukankan      html  css  js  c++  java
  • 末学者笔记--ansible 批量化自动部署工具

    ansible

    .概念

    1.模块:

    yaml      #用来编写yaml脚本的语言

    paramiko  #模拟ssh协议连接linux客户端

    jinja2   #模板语言

    2. 作用及原理

    作用:

    首先ansible是一个批量的自动化部署工具

    工作原理:

    ansible通过hosts文件和免秘钥(配置文件用户名密码端口号)来实现批量管理主机

     

    3.组成:

     

    AnsibleAnsible的核心程序

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

    PlaybooksYAML格式文件,多个任务定义在一个文件中,使用时可以统一调用,“剧本”用来定义那些主机需要调用那些模块来完成的功能.

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

    Custom Modules自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。

    Connection Plugins:连接插件,AnsibleHost通信使用

     

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

    二.基本操作:

    1.下载

    ——yum install epel-release (拓展源,可能需要这个才可安装)

    ——yum install ansible -y

    ——ansible --version   #查看版本信息

    ——rpm -qc ansible   #查看配置文件

        /etc/ansible/ansible.cfg

        /etc/ansible/hosts

    2.ansible配置客户端(无密码登录)

    第一种方法:

    1)server: ssh-keygen

    2)scp id_rsa.pub root@192.168.5.23:/root/.ssh/authorized_keys

     

    第二种方法(推荐使用)

    ——vim /etc/ansible/hosts

    #在末行添加#

    testhosts

    192.168.5.23 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=123

    192.168.5.25 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=123

     

    分别表示用户,端口,密码。

    3.hoc命令:

    ansible-doc -l #查看支持的模块

    ansible-doc -s MODEL_NAME #查看模块用法

     

    ansible <host-pattern> [options]

    可用选项

    -f forks:启动并发线程数(默认为5

    -m model_name:要使用的模块

    -a args:特有的参数

    -s:以sudo的方式运行操作

    -i:指定被管理节点的主机列表

     

    note】:线程是最小的调度单位,进程是最小的管理单元,一个进程里面至少1个线程,一个线程或者多个线程可以在一个进程里面

     

    4.关闭命令警告

    ——vim /etc/ansible/ansible.cfg

    #。。。。。#

    host_key_checks = False   #关闭主机密钥检查的警告

    command_warnings = False   #这个是调用“command”接一个参数为ansible已有的模块指令时会出现一个警告

    (如:ansible testhosts -m command -a “yum install tree”  会出现警告)

    deprecation_warnings = False   #这个是在“playbooks”中调用command模块(模块调用的参数为ansible模块[同上一个警告])时出现警告

    5.常用命令:

    ——ansible testhosts#定义的主机组或者指定一个ip,因为我只有一个组,所以可以用all代替 -m#调用模块) setup #查看客户端信息

    【copy】:

    ——ansible testhosts -m copy -a#调用参数) 'src#源文件路径=/root/git_test/code.txt dest#目标路径=/root/test/'   #copy文件到cient端

    查看是否已经真的传送过去了:——# ansible all -m shell -a "ls /root/test | grep code.txt"

     

    user】:

    ——ansible testhosts -m user -a "name=test state=present" #创建test用户

    ——ansible testhosts -m user -a "name=test state=absent" #删除test用户

     

    【yum】:

    ——ansible testhosts -m yum -a name=tree state=latestor pesent #yum安装

     

    service】:

    ——ansible testhosts -m service -a ‘name=httpd state=stopped enabled=no‘ #停止httpd服务并且关闭开机自启

     

    【script】:

    ——ansible testhosts -m script -a ‘/tmp/test.sh‘ #运行脚本

     

    【command】:

    ——ansible testhosts -m command -a 'date' #调用命令“command”参数日期查询

     

    【shell】:

    ——ansible testhosts -m shell -a head /etc/passwd | grep root   #调用shell模块,后接一个可支持正则的命令,与command很像,但shell支持正则

     

    cron模块:管理定时任务

     

    例:在远程节点每隔5分钟往、/tmp/ken.txt输入111

     

    ——# ansible all -m cron -a "minute=*/5  job='echo 111>/tmp/ken.txt'  state=present"

    192.168.5.23 | SUCCESS => {

        "changed": true,

        "envs": [],

        "jobs": [

            "None",

            "None"

        ]

    }

    192.168.5.25 | SUCCESS => {

        "changed": true,

        "envs": [],

        "jobs": [

            "None",

            "None"

        ]

    }

    查看是否设置成功——# ansible all  -a "crontab -l"

    可删除任务:# ansible all  -a "crontab -r"

     

    .playbooks:

    1. 选项:

    • tasks   #任务
    • variables   #变量
    • templates   #模板
    • handlers   #触发器
    • roles   #角色

     

    2.yaml介绍

    yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括:xmlc语言,pythonperl以及电子邮件格式RFC2822等,ClarkEvans2001年在首次发表了这种语言。

     

    【优点】:

      yaml的可读性好

      yaml和脚本语言的交互性好

      yaml使用实现语言的数据类型

      yaml有一个一致的信息模型

      yaml易于实现

      yaml可以基于流程来处理

      yaml表达能力强,扩展性好

    3.注意:

    1)缩进

      yaml 的缩进要求比较严格一定不能使用tab

     

          注意:编写yaml文件,就忘掉shelltab吧。

     

    2冒号“:”

      每个冒号后面一定要有一个空格

     

      注意:a 以冒号结尾不需要空格

         b表示文件路径的模版可以不需要空格

     

    3短横线  -

          想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分

     

    总之

      1严格控制空格编写剧本的时候

      2剧本编写不支持tab

    4.剧本常用命令:

      1 .对剧本语法检测:

      ansible-playbook --syntax-check  /root/ansible/httpd.yaml

     

     

     

      (2.-C模拟执行剧本:

      ansible-playbook  -C /root/ansible/httpd.yaml

     

     

     

      (3.执行剧本:

      ansible-playbook   /root/ansible/httpd.yaml

    5.编写playbooks:

      ——vim test.yaml文件名后缀最好是.yaml  or  .yml,可以不是

    1)(格式严格对照)

    - hosts: testhosts   #处理主机组,可以是all所有服务器,-(空格)hosts:(空格)all

      remote_user: root   #使用命令的身份,(空格)(空格)remote_user:(空格)root

      vars:   #定义变量,(空格)(空格)vars

      - p: httpd.conf   #指定变量,(空格)(空格)-(空格)“变量名”:(空格)变量

      tasks:   #剧本所要干的事情;  (空格)(空格)task:

      - name: yum many packages   #使用任务名字,随意写最好能见名知意。(空格)(空格)-(空格)name(空格)自定义任务名字

        yum: name={{ item }} state=present   #调用任务模块。与上行“name”并齐,即4(空格)yum(空格)name=软件名或“{{item}}”表迭代安装多个软件

        with_items:    #迭代,与上一级对齐

        - tree   #软件,对齐上级

        - vsftpd

      - name: copy httpd.conf

        template: src#=/etc/httpd/conf/{{ p }}#调用变量)  dest#目标)=/etc/httpd/conf/{{ p }}   #开头与上一级“name”对齐

        notify:   #触发器命令,对齐上级

        - service httpd restart   触发的任务名称,一定与触发器内的名称一样,对齐上级

      handlers:   #触发器,一定要写在末尾。(空格)(空格)handlers

      - name: service httpd restart   #内部任务名称,对齐上级

       service: name=httpd state=restarted

     

    【补】:其中,使用template模板时,可加入变量到源文件,如在httpd.conf中修改端口Listen  {{ port }},再修改/etc/ansible/hosts 文件,在每个服务主机后指定端口port=500 600”,实现不同主机分配不同的端口

    示例1:基础

     

     

    示例2:变量

     

     

    示例3:迭代

     

     

    示例4:触发器notify

     

    示例5:模板templates

     

    四.roles介绍

    1.什么情况下用到roles

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

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

    2. 操作:

    1)创建roles角色目录

    ——mkdir -pv playbooks/roles/{dbservers,webservers}/{files,handlers,tasks,templates,vars}

     

     

    2)编辑roles

    ——cd playbooks

    ——vim site.yml   #地址剧本或者记为地址脚本,固定名称,不可改变

    #site.yml

    - hosts: webservers

      remote_user: root

      roles:

      - webservers

      - dbservers


    3实现copy模块与触发器


    第一步:#将文件拷贝到files目录下
    cp /etc/httpd/conf/httpd.conf  /root/playbooks/roles/webservers/files/httpd.conf.bak

     

    第二步:#tasks/下建立main.yml(固定文件名)文件并在里面写入

    - name: copy httpd.conf

      copy: src=httpd.conf.bak(#这里不用写绝对路径了) dest=/etc/httpd/conf/httpd.conf

      notify:

      - restart httpd

     

    第三步:#handlers/建立main.yml文件并写入

    - name: restart httpd

      service: name=httpd state=restarted

     

    (4)模板temlate及一般指令和迭代

     

    第一步:#将模板文件拷入到templates目录下并写入变量

    ——cp /etc/httpd/conf/httpd.conf  /root/playbooks/roles/webservers/templates/httpd.conf.bak

    ——vim /root/playbooks/roles/webservers/templates/httpd.conf.bak

    #........#

    Listen  {{ port }}   #修改为变量

    ......

     

    第二步#修改主机组,在每个服务器后加不同的变量值,实现不同主机分配不同的端口

    ——vim /etc/ansible/hosts

    #........#

    192.168.5.23 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=123 port=500

    192.168.5.25 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=123 port=600

     

    第三步#修改tasks/main.yml:

     

    - name: yum install tree

      yum: name=tree state=latest

    - name: create manay user

      user: name={{ item }} state=absent

      with_items:

      - user1

      - user2

      - user3

    - name: copy httpd.conf

      template: src=httpd.conf.bak dest=/etc/httpd/conf/httpd.conf

      notify:

      - restart httpd

     

    3. 运行:

    ——ansible-playbook /root/playbooks/site.yml

    #------------------------------------------------------------------------------------------------分割线-------------------------------------------------------------

  • 相关阅读:
    vs快速添加引用解析的快捷键
    Linux内核调试技术——kprobe使用与实现
    Linux内核调试技术——kretprobe使用与实现
    Linux内核调试技术——jprobe使用与实现
    【HTTP协议】---HTTP协议详解
    雪崩效应
    Shell中IFS用法
    shell中for循环,读取一整行
    BCD码
    pam模块日志怎么输出
  • 原文地址:https://www.cnblogs.com/feige2L/p/10846301.html
Copyright © 2011-2022 走看看