运维工具

当前常见的运维工具(Configuration)有以下一种
puppret(ruby)
saltstack(python)
chef
cfengine
....

Command and Control;

fabricfunc

程序发布:

手动发布
脚本发布
发布程序(运维程序)

程序发布要求:1、不能影响用户体验;2、系统不能停机;3、不能导致系统故障或造成系统完全不可用;

灰度发布模型(考虑以下两种维度):1、主机;2、用户;

发布思路:
/webapps/tuangou
/webapps/tuangou-1.1/webapps/tuangou-1.2将程序解压缩,解压缩后进行文件链接,近期版本不删除,
一边后期能够出问题能够进行回滚;

在调度器上先下线一批主机(标记为维护模式)-->关闭服务-->部署新版本-->启动服务-->在调度器上启用这一批主机;

运维工具的分类

agent:puppet,func,...agentless(ssh):ansible,fabric

Ansible

轻量化运维工具
能够提供Configuration和Command and Control的功能

Ansible的特性:
    模块化:调用特定的模块,完成特定的任务;
    基于Python语言实现,由paramiko,PyYAML和jinja2三个关键模块;
    部署简单:agentless;
    支持自定义模块;
    支持playbook;   
    幂等性:一个命令执行一边和多边的效果是一样的。

Ansible的安装及应用:

yum的epel源,
配置文件:/etc/ansible/ansible.cfg
主机清单:/etc/ansible/hosts
主程序:
    ansible
    ansible-playbook
    ansible-doc
ansible的简单使用格式:
    ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS
    ansible-doc -s MOD_name
ansible的常用模块:
    获取模块列表:
        ansible-doc -l
        command模块:在远程主机运行命令,不支持“|”
            ansible websrvs -m command -a "useradd user1"
        shell模块:远程主机在shell进程中中运行
            ansible websrvs -m shell - a "echo magedu | password --stdin user1"
        copy模块:复制文件至远程主机;
            用法:(1)src= dest=
                        ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab"
                  (2)content= dest=   //直接把内容作为数据流传输至文件;
                        ansible all -m copy -a "content='hello world\n' dest=/tmp/testfile"
                  owner,group,mode
        cron模块:manage cron.d and crontab entries
            minute=
            hour=
            day=
            weekday=
            job=
            *name=    //必须有此参数            state=
                present //默认为添加
                absent  //删除crontab
            ansible all -m cron -a "minute=*/5 job='/sbin/ntpdate 172.16.0.1 &> /dev/null' name=Synctime"
        fetch模块:从远程主机拉去文件至当前机器;
        file模块:修改文件属性;
            *path=     //必须有此参数
            用法:(1)创建连接文件
                        ansible all -m file -a "src=/tmp/fstab path=/tmp/fstab.link state=link"
                  (2)修改属性:path= owner= mode= group=
                  (3)创建目录:path= state=directory
                        ansible all -m file -a "path=/tmp/tmpdir state=directory"
        hostname模块:manage hostname
            name=
        ping模块:
        pip模块:用来管理Python的依赖模块;
        yum模块:用yum来管理程序包
            *name=:指明程序包名称,可以带版本号      //必须有此参数            state=
                present,latest(安装),absent(卸载);
                ansible all -m yum -a "name=httpd state=latest"  
        service模块:管理服务
            *name=      //必须有此参数            state=
                started,stopped,restarted;
            enabled= 1|0    //开机自启动;
            runlevel= 
                ansible all -m service -a "name=httpd state=started"
        uri模块:uri的访问管理        user模块:管理用户账户;
            *name 
            system= yes|no    //yes是系统账户
            uid=
            shell=            group=
            groups=
            comment=
            home=
            move_home=
            remove=   //当state=agent是删除家目录
                ansible all -m user -a "name=user3 system=yes state=present uid=306"
        setup模块:用于获取facts;        group模块:添加或删除组
            *name=  //必须给的参数            state
            system
            gid=
        scipt模块:把本地脚本传递到远程主机后进行执行;
            ansible -m script -a "/path/to/script_file"

YAML:

YAML简介:

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,
包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Evans在2001年首次发表了这种语言,
另外Ingy dot Net 与 Ben-kiki也是这种语言的共同设计者;YAML Ain`t Markup Language,即YAML不是XML。
不过,在开发的这种语言时,YAML的意思是:“Yet Another Markup Language”(仍是一种标记语言)。
其特性:
    YAML的可读性较好;
    YAML和脚本语言的交互性很好;
    YAML有一个一致的信息模型;
    YAML易于实现;
    YAML可以基于流来处理;
    YAML表达能力强,扩展性好;

YAML语法:

YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。
其结构(structure)通过空格来展示,序列(Sequence)里的项用“-”来代表,Map里的键值对用“:”分隔。

Playbook:
Playbook的核心元素:
    Hosts:主机
    Tasks:任务
    variables:
    Templates:包含了模板的文本文件;
    Handlers:由特定条件出发任务;
    Roles:
    
    playbook的基础组件
        Hosts:运行指定任务的目标主机;
        remoute_user:在远程主机上执行任务的用户;
            sudu_user:
        tasks:任务列表
            模块,模块参数;
            格式:
                (1)action:module arguments
                (2)module:arguments
        handlers:
            任务,在特定条件下触发;
            接收到其他任务的通知时被触发;  
        variables:
            (1)facts:可直接调用;
            (2)ansible-playbook命令行中的自定义变量;
                -e VARS,--extra-vars=VARS            
            (3)通过role传递变量;
            (4)Host Inventory
                (1)向不同的主机传递不同的变量;
                    ip/hostname varaiable=value var2=value2
                (2)向组中主机传递相同的变量
                    [groupname:vars]
                    variable=value
            invertory参数:
                用于定义ansible远程连接目标主机时的参数,而非传递给playbook的变量;
                    ansible_ssh_host
                    ansible_ssh_port
                    ansible_ssh_user
                    ansible_ssh_pass
                    ansible_sudo_pass
                ....
        **注意:shell和command模块后直接跟命令即可**
        **某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;**
        **任务可以通过“tags”打标签,而后可在ansible-playbook命令上使用-t指定进行调用;**
    playbook的使用方法:
        ansible-playbook在执行命令时,第一个任务执行完成后执行第二个任务,第二个执行完成后,执行第三个任务;
        ansible-playbook 
            --list-host      //显示执行的主机列表;            
            --check          //在目标主机进行检测可能会发生改变,但并不执行;            
            -t tags          //指明任务                
            ansible-palybook -t instconf web.yml  //进行标签为instconf的项目;
        playbook示例1:编写sample.yaml
            - hosts:            remote_user:root
            tasks:
                - name: create a user user3                  
                  user: name=user3 system=true uid=307
                - name: creare a user user4                  
                  user: name=user4 system=true uid=308
        playbook示例2:编写web.yml  
            - hosts: websrvs              remote_user: root
              tasks:
              - name: install httpd package                yum: name=httpd state=present
              - name: install configure file 
                copy: src=files/httpd.conf dest=/etc/httpd/conf/    //src为相对路径
                tags: instconf
                notify: restart httpd
              - name: start httpd.service 
                serivce: name=httpd state=started
              -name: execute ss command                
                shell: ss -tnl | grep 8080
            - handlers:              
              - name: restart httpd                
                service: name=httpd state=restarted