精选文章 大型架构及配置技术ansible(一)之ansible基础,ad-hoc,批量配置管理,ansible七种武器,JSON简介,YAML简介

大型架构及配置技术ansible(一)之ansible基础,ad-hoc,批量配置管理,ansible七种武器,JSON简介,YAML简介

作者:SshikSsh 时间: 2020-08-05 05:16:42
SshikSsh 2020-08-05 05:16:42


一、ansible基础
6台虚拟机(2cpu,1.5G以上内存,10G以上硬盘,1块网卡)
    主机名      IP地址             角色
    ansible40   192.168.4.40/24    管理主机
    web41       192.168.4.41/24    托管主机
    web42       192.168.4.42/24    托管主机
    db43        192.168.4.43/24    托管主机
    db44        192.168.4.44/24    托管主机
    cache45     192.168.4.45/24    托管主机
1)ansible简介
1.什么是ansible
    ansible是2013年推出的一款IT自动化和DevOps软件,2015年被RedHat收购,是基于python研发,糅合很多老运维工具的优点,实现了批量操作系统配置,批量程序部署,批量运行命令等功能
    ansible可以实现:
        自动化部署APP
        自动化管理配置项
        自动化持续交付
        自动化(AWS)云服务管理

2.为什么选择ansible
        选择一款配置管理软件,无外乎从以下几点来权衡利弊
            活跃度(社区)
            学习成本
            使用成本
            编码语言
            性能
            使用是否广泛
        ansible优点:
            只需要SSH和Python即可使用
            无客户端
            ansible功能强大,模块丰富
            上手容易,门槛低
            基于Python开发,做二次开发更容易
            使用公司比较多,社区活跃

3.ansible特性
    模块化设计,调用特定的模块完成特定任务
    基于Python语言实现
        paramiko
        PyYAML(半结构化语言)
        Jinja2
    其模块支持JSON等标准输出格式,可以采用任何变成语言重写
    部署简单
    主从模式工作
    支持自定义模块
    支持playbook
    易于使用
    支持多层部署
    支持异构IT环境

4.工作流程
    
2)ansible安装
1.软件依赖关系
    对管理主机
        要求Python 2.6或2.7
    ansible使用以下模块,都需要安装
        paramiko 
        PyHAML
        Jinja2 
        httplib2
        six
    对于被托管主机
        ansible默认通过SSH协议管理机器
        被管理主机要开启ssh服务,允许ansible主机登录
        在托管节点上也需要安装Python2.5或以上的版本
        如果托管节点上开启了SELinux,需要安装libselinux-python
        
2.安装ansible
[root@ansible40 ~]# vim /etc/hosts
192.168.4.40 ansible40
192.168.4.41 web41
192.168.4.42 web42
192.168.4.43 db43
192.168.4.44 db44
192.168.4.45 cache45
    安装及验证
        在ansible托管主机上配置yum配置文件
        安装 yum install ansible 
        验证ansible --version
[root@ansible40 ~]# cd ansible/
[root@ansible40 ansible]# yum -y install *.rpm
[root@ansible40 ~]# ansible --version
        
二、ad-hoc
1.主机定义与分组
    安装ansible之后可以做一些简单的任务
    ansible配置文件查找顺序
        首先检测ANSIBLE_CONFIG变量定义的配置文件
        其次检查当前目录下的./ansible.cfg文件
        再次检查当前用户家目录下的~/ansible.cfg文件
        最后检查/etc/ansible/ansible.cfg文件
    /etc/ansible/ansible.cfg是ansible的默认配置文件路径
    ansible.cfg配置文件:
        inventory定义托管主机地址配置文件路径名
        inventory指定的配置文件,写入远程主机的地址
    格式:
        #表示注释
            [组名称]
            主机名称或ip地址,其他参数
    ansible.cfg配置文件:        
        ssh主机key验证配置参数
        host_key_checking = False
        如果为False,不需要输入yes
        如果为True,等待输入yes
    分组定义,范围定义样例
        [web]
        web1
        web2
        
        [db]
        db[1:2]
        
        [other]
        cache  
[root@ansible40 ~]# vim /etc/ansible/ansible.cfg    
 14 inventory      = /etc/ansible/hosts
 61 host_key_checking = False
[root@ansible40 ~]# vim /etc/ansible/hosts    
 44 [web]
 45 web41
 46 web42
 47 
 48 [db]
 49 db43
 50 db44
 51 
 52 [other]
 53 cache45

2.ansible命令基础
    ansible主机集合 -m 模块名称 -a 模块参数
        主机集合 主机名或分组名,多个使用逗号分隔
        -m 模块名称,默认command模块
        -a or --args 模块参数
        -i inventory文件路径,或可执行脚本
        -k 使用交互式登录密码
        -e 定义变量
        -v 显示详细信息
    列出要执行的主机
        ansible all --list-hosts
[root@ansible40 ~]# ansible all --list-hosts
  hosts (5):
    web41
    web42
    cache45
    db43
    db44

[root@ansible40 ~]# ansible web,db43 --list-hosts
  hosts (3):
    web41
    web42
    db43

    批量检测主机
        ansible all -m ping -k
[root@ansible40 ~]# ansible web -m ping -k
SSH password: 
        
3.部署证书文件
    ansible是通过SSH在远程执行命令的
    ssh远程执行命令必须通过认证才行
    密码写入配置文件安全性很差
    使用key认证
    给所有主机部署公钥
        没有密钥命令执行会出错
        ansible web -a 'uptime'
[root@ansible40 ~]# cd /root/.ssh/
[root@ansible40 .ssh]# ssh-keygen -t rsa -b 2048 -N '' -f key
[root@ansible40 .ssh]# ssh-copy-id -i key.pub cache45  ==>>拷贝给所有主机
[root@ansible40 .ssh]# ssh web41 -i key          ==>>指定私钥

4.inventory扩展参数
    ansible_ssh_port
    ssh端口:如果不是默认的端口号,通过此变量设置
    ansible_ssh_user
    默认的ssh用户名
    ansible_ssh_pass
    ssh密码(这种方式不安全,建议采用--ask-pass或SSH密钥)
    ansible_ssh_private_key_file
    ssh使用的私钥文件,适用于有多个密钥,

    vars变量定义,用于组名后面
        例如:[all:vars]
              ansible_ssh_private_key_file="/root/.ssh/key"
    children子组定义,用于引用其他组名称
        例如:[app:children]
              web
              db
[root@ansible40 ~]# cat -n /etc/ansible/hosts 
    44    [web]
    45    web41
    46    web42
    47    
    48    [db]
    49    db43
    50    db44 ansible_ssh_port=22            ==>>给单个主机定义变量
    51    
    52    [other]
    53    cache45
    54    
    55    [all:vars]
    56    ansible_ssh_private_key_file="/root/.ssh/key"   ==>>给所有主机定义变量
    57    
    58    [app:children]
    59    web
    60    db
    自定义配置文件
        创建文件夹myansible
        创建配置文件ansible.cfg 
[root@ansible40 ~]# mkdir /myansible
[root@ansible40 myansible]# touch ansible.cfg
[root@ansible40 myansible]# vim ansible.cfg 
  1 [defaults]
  2 inventory = myhosts
  3 host_key_checking = False
[root@ansible40 myansible]# vim myhosts
     1    [app1]
     2    web41
     3    db43
     4    
     5    [app2]
     6    web42
     7    db44
     8    cache45

5.动态主机
    无限可能
        ansible Inventory包含静态和动态的Inventory,静态Inventory指在文件/etc/ansible/hosts中指定的主机和组,动态Inventory指通过外部脚本获取主机列表,按照其要求格式返回给ansible命令
    Json
        JSON(JavaScript Object Notation,Javascript对象表示法),一种基于文本独立于语言的轻量级数据交换格式
        
三、批量配置管理
1.ansible-doc和ping模块
    ansible-doc
        模块的手册相当与shell的man,很重要
        ansible-doc -l   列出所有模块
        ansible-doc modulename  查看帮助
    ping模块
        测试网络连通性,ping模块没有参数
[root@ansible40 ~]# ansible-doc -l        
[root@ansible40 ~]# ansible-doc lineinfile
[root@ansible40 ~]# ansible all -m ping      ==>>测试ssh的连通性
        
2.command模块
    默认模块,远程执行命令
    用法;
    ansible host-pattern -m command -a '[args]'
[root@ansible40 ~]# ansible all -m command -a 'uptime'       ==>>查看所有机器负载
[root@ansible40 ~]# ansible all -m command -a 'date +%F_%T'  ==>>查看日期和时间
    注意事项:
        该模块通过-a跟上要执行的命令可以直接执行,若命令里有如下字符则执行不成功,<,>,|,&。
        command模块不能解析系统变量
        该模块不启动shell直接在ssh进程中执行,所有使用到shell的命令执行都会失败

3.shell模块
    shell模块用法基本和command一样,区别是shell模块是通过/bin/sh进行执行命令,可以执行任意命令
    不能执行交互式的命令,如vim,top
[root@ansible40 ~]# ansible all -m shell -a 'uptime'   ==>>查看所有机器负载
    变量解析
        ansible执行命令是二次解析
        第一次在本机解析,第二次在执行机器解析
        需要二次解析的变量要转义(\)
    文件在哪里
        文件在用户家目录
        ansible是使用ssh多次连接执行
        连接退出之后之前的状态就全部失效了
        解决办法:使用chdir代替cd命令
[root@ansible40 ~]# ansible cache45 -m shell -a 'chdir=/tmp touch testfile'
[root@ansible40 ~]# ansible cache45 -m shell -a 'touch /tmp/testfile1'
[root@ansible40 ~]# ansible web41,db44 -m shell -a 'useradd nb'
[root@ansible40 ~]# ansible web41,db44 -m shell -a 'echo 123456 |passwd --stdin nb'

4.scripts模块
    在本地写脚本,然后使用scprit模块批量执行
    注意:该脚本包含但不限于shell脚本,只要指定Sha-bang解释器的脚本都可运行
[root@ansible40 ~]# vim userwk.sh
#!/bin/bash
id nb
if [ $? != 0 ];then
  useradd wk
  echo 123456 | passwd --stdin wk
fi
[root@ansible40 ~]# ansible web -m script -a 'userwk.sh'
    
5.yum模块
    使用yum包管理器来管理软件包
    name:要进行操作的软件包名字
    state:动作(installed,removed)
    install === installed
    remove === removed
[root@ansible40 ~]# ansible db -m yum -a 'name="mariadb-server" state=installed'  ==>>给所有db主机安装mariadb
[root@ansible40 ~]# ansible cache45 -m yum -a 'name="lrzsz" state=removed'   ==>>cache45主机删除lrzsz
    
6.service模块
    name:必选项,服务名称
    enabled:是否开机启动 yes|no
    sleep:执行restarted ,会在stop和start之间沉睡几秒钟
    state:对当前服务执行启动,停止,重启,重新加载等操作(started,stopped,restarted,reloaded)
[root@ansible40 ~]# ansible cache45 -m service -a 'name="sshd" enabled="yes" state="started"'

7.copy模块
    复制文件到远程主机
    src:复制本地文件到远程主机,绝对路径和相对路径都可以,路径为目录时会递归复制。若路径以“/”解为,只复制目录里的内容,若不以“/”结尾,则复制包含目录在内的整个内容,类似rsync
    dest:必选项,远程主机的绝对路径,如果源文件是一个目录,那该路径必须是目录
    backup:覆盖前先备份原文件,备份文件包含时间信息。有两个选项:yes|no
    force::若目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,设为no,则只有当目标主机的目标位置不存在该文件时财富值,默认为yes
[root@ansible40 ~]# ansible all -m copy -a 'src=/etc/resolv.conf dest=/etc/resolv.conf'  ==>>复制文件
[root@ansible40 ~]# ansible all -m copy -a 'src=/root/ dest=/root/'

8.lineinfile模块
    类似sed的一种行编辑替换模块
    path  目标文件
    regexp 正则表达式,要修改的行
    line 最终修改的结果
[root@ansible40 ~]# ansible db -m lineinfile -a 'path="/etc/my.cnf" regexp="^binlog-format" line="binlog-format = row"'
    
9.replace模块
    类似sed的一种行编辑替换模块
    path  目标文件
    regexp 正则表达式
    replace 最终修改的结果
[root@ansible40 ~]# ansible db -m replace -a 'path="/etc/my.cnf" regexp="row" replace="mixed"'

10.setup模块
    主要用于获取主机信息,playbooks里经常会用的另一个参数gather_facts与该模块相关,setup模块常用filter参数
    filter过滤所需信息
[root@ansible40 ~]# ansible cache45 -m setup -a 'filter=ansible_distribution'

四、ansible七种武器
1.第一种武器
    ansible命令,用于执行临时性的工作,必须掌握

2.第二种武器
    ansible-doc是ansible模块的文档说明,针对每个模块都有详细的说明及应用案例介绍,功能和Linux系统man命令类似,必须掌握 
    
3.第三种武器
    ansible-console是ansible为用户提供的交互式工具,用户可以在ansible-console虚拟出来的终端上像shell一样使用ansible内置的各种命令,这位习惯使用shell交互方式的用户提供了良好的使用体验
    
4.第四种武器
    ansible-galaxy从github上下载管理Roles的一款工具,与python的pip类似
    
5.第五种武器
    ansible-playbook是日常应用中使用频率最高的命令,工作机制:通过读取先编写好的playbook文件实现批量管理,可以理解为按一定条件组成的ansible任务及,必须掌握 
    
6.第六种武器
    ansible-vault主要用于配置文件加密,如编写好的playbook文件中包含敏感信息,不想他人随意查看,可用它加密/解密这个文件
    
7.第七种武器
    ansible-pull
    ansible有两种工作模式pull/push,默认使用push模式工作,pull和push工作模式机制正好相反
    适用场景:有大批量机器需要配置,即便使用高并发线程依旧要花费很多时间
    通常在配置大批量机器的场景下使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求

五、JSON简介
1.JSON是什么
    JSON是JavaScript对象表示法,它是一种基于文本独立于语言的轻量级数据交换格式
    JSON中的分割符号限于,单引号',小括号(),中括号[],大括号{},冒号:,逗号,。
    
2.JSON特性
    JSON是纯文本
    JSON具有“自我描述性”(人类可读)
    JSON具有层级结构(值中存在值)
    JSON可通过JavaScript进行解析
    
    
3.JSON语法规则
    数据在名称/值对中
    数据由逗号分隔
    大括号保存对象
    中括号保存数组

4.JSON数据的书写格式是:名称/值对 
    名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值,例如:"诗仙":"李白"
    
5.JSON语法规则之数组
    {"诗人":
        ["李白","杜甫","白居易","李贺"]
    }
    复合复杂类型
    {"诗人":
      [{"李白":"诗仙","年代":"唐"},
       {"杜甫":"诗圣","年代":"唐"},
       {"李贺":"诗鬼","年代":"唐"}
      ]
    }
六、YAML简介
1.YAML是什么
    是一个可读性高,用来表达数据序列的格式
    YAML(YAML Ain't Markup Language)
    YAML参考了多种语言,如:C语言,Python,Perl等,并从XML,电子邮件的数据格式中获得灵感,Clark Evans在2001年首次发表了这种语言,目前已有数种编程语言或脚本语言支持这种语言

2.YAML语法简介
    YAML的结构通过空格来展示
    数组使用-表示
    键值对使用:表示 
    YAML使用一个固定的缩进风格表示数据层级结构关系
    一般每个缩进级别由两个以上空格组成
    #表示注释
    注意事项:
    不要使用tab,缩进是初学者容易出错的地方之一
    同一层级缩进必须对齐
    
3.YAML的键值表示方法
    采用冒号分隔
    :后面必须有一个空格
    例如:
        "诗仙": "李白"
        或 
        "李白":
          "诗仙"
    复杂YAML的键值对嵌套
    例如:
        "诗人":
          "李白": "诗仙"
        或 
        "诗人":
          "李白":
            "诗仙"
            
4.YAML数组表示方法
    使用一个端横杠加一个空格
    例如:
    - "李白"
    - "杜甫"
    - "李贺"
    哈希数组复合表达式
    "诗人":
      - "李白"
      - "杜甫"
      - "李贺"

5.高级复合表达式
    例如:
    "诗人":
      - 
        "李白": "诗仙"
        "年代": "唐"
      - 
        "杜甫": "诗圣"
        "年代": "唐"
      - 
        "李贺": "诗鬼"
        "年代": "唐"

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:小程序性能与体验优化(一)

下一篇:Caffe源码精读 - 8 - Caffe Layers之yolov3_layer(yolov3 loss计算层)

您可能感兴趣

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。