Ansible的基础知识

为什么要学习ansible:

    ansible是自动化运维的一种工具,使用ansible可以一次性管理多台主机,为多台主机安装或这执行相同或者不同的操作,省去了一台台主机去重复执行相同的任务,可以使用corn选项结合本机的crontab设置本主机的任务性计划,比如,每天导出nginx的access.log和error.log到指定的主机,我们分析相应的日志,而达到监控整个网络架构的目的。

下图是ansible和所有软件,操作系统之间的关系:

    

blob.png

  

file://C:\Users\sjsir\AppData\Local\Temp\ct_tmp/1.png

1.ansible的框架:
    Ansible Core:ansible的主要核心
    Modules:模块
        Core Modules:内核模块
        Customed Modules:相关的模块
    Host Iventory
        Files
        CMDB
    PlayBooks
        Hosts <–> roles
    Connection Plugins
   

blob.png

 
2.特性:
    高度模块化:调用特定的模块,完成特定的任务;
    基于Python语言开发,由Paramiko,PyYAML和jinja2三个核心库实现;
    部署简单:agentless;
    支持自定义模块,使用任意编程语言;
    强大的playbook机制;
    幂等性;  
3.安装和使用:ansible(epel源)
    安装:yum -y install ansible
    程序环境:
        ansible
        ansible-playbook
        ansible-doc
    配置文件:
        /etc/ansible/ansible.cfg
    主机清单:
        /etc/ansible/hosts
    插件目录:
        /usr/share/ansible_plugins/

    安装和基本部署ansible服务:(包括远程主机的简单配置)

        配置epel源

        yum -y install ansible

        ssh-keygen -t rsa -P ''

        vim /etc/ansible/hosts

        [web_server]

        192.168.1.147

        [db_server]

        192.168.1.148

        ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.147

        ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.1.148

        简单测试:

            ansible all -a 'who'

4.基本使用入门:
    ansible命令:
        Usage: ansible <host-pattern> [options]
        常用选项:
            -m MOD_NAME  -a MOD_ARGS
    配置Host Inventory
        /etc/ansible/hosts
        [group_id]
        HOST_PATTERN1
        HOAT_PATTERN2
    模块:
        获取模块列表:ansible-doc -l
        获取指定模块的使用帮助:ansible-doc -s MOD_NAME
    常用模块:
        ping:探测目标主机是否存活;
        command:在远程主机执行命令;(不会理解管道操作)
            ansible all -m command -a "useradd centos"
        shell: 在远程主机上调用shell解释器运行命令,支持shell命令的各种功能,例如管道;
            注意:command和shell模块的核心参数直接作为命令本身;而其他模块的参数通常为"key=value"格式;
        copy:复制文件到远程主机;(mode,owner,group,…)
            用法:
            (1)复制文件:-a "src=  dest= "
                eg:ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=640"
            (2)给定内容生成文件:-a "content=  dest= "
                eg:ansible all -m copy -a "content='hello\nworld' dest=/tmp/test.ansible mode=640"
        file:设置文件属性;
            用法:
            (1)创建目录:-a "path= state=directory"
            (2)创建链接文件: -a "path= src= state=link"
            (3)删除文件:-a "path= state=absent"
                eg:
                ansible all -m file -a "path=/tmp/fstab.ansible owner=centos"
                ansible all -m file -a "path=/tmp/fstab.ansible state=absent"
                ansible all -m file -a "path=/tmp/fstab.ansible.link src=/tmp/test.ansible state=link" 为远程主机上的/tmp/fstab.ansible设置本地的软连接
        fetch:从远程主机上拉取文件到本地;(从远程一台主机上面获取)
        cron:管理日常计划任务
            -a "" (minute,hour,day,month,weekday,job,name,user,state={present|absent})
        hostname:设置主机名;name=
        yum:使用yum包管理器,完成包管理
            -a ""  name= state={present|latest} / name= state=absent
        service:服务管理;
            -a "" name enable runlevel state={started|stopped|restarted}
        group:组管理,添加或移除组;
            -a "" name state system gid
        user:用户管理,管理用户的事项;
            -a "" name group groups comment uid system shell expires home
        setup:从远程主机上面,收集关于远程主机的信息;
5.YAML:YAML是数据序列化格式设计的可读性与脚本语言与互动。
    数据结构:key:value
        – item1
        – item2
        – item3
        eg:{name:jerry,age:21}
6.PlayBook:
    核心元素:
        Tasks:任务,由模块定义的操作的列表;
        Variables:变量
        Templates:模板,即使用了模板语法的文本文件;
        Handlers:由特定条件出发的Tasks;
        Roles:角色;
    playbook的基础组件:
        Hosts:运行指定任务的目标主机;
        remote_user:在远程主机以哪个用于身份执行;
            sudo_user:非管理员需要用于sudo权限;
        tasks:任务列表
            模块,模块参数:
            格式:
                (1)action:module arguments
                (2)module:aeguments
7.运行playbook,使用ansible-playbook命令:
    (1)检测语法:
        ansible-playbook –syntax-check /path/to/playbook.yaml
    (2)测试运行
        ansible-playbook -C /path/to/playbook.yaml
            –list-hosts:指明测试运行的主机
            –list-tasks:指明要测试运行的任务
            –list-tags:指明要测试运行的标签
    (3)运行:
        ansible-playbook /path/to/playbook.yaml
            -t TAGS,–tags=TAGS:指明运行指定标签的任务
            –skip-tags=SKIP_TAGS:指明运行忽略指定标签的任务
            –start-at-task=START_AT
8.Playbook核心元素详解:
    (1)handlers:由特定条件触发的Tasks;
        调用以及定义方式:
            tasks:
            – name:TASK_NAME
              module:arguments
             notify:HANDLER_NAME
            handlers:
            – name:HANDLER_NAME
             module:arguments
    (2)tags:给指定的任务定义一个调用标识;
            – name:NAME
             module:arguments
             tags:TAG_ID
    (3)Variables:变量
        类型:
            内建变量:facts
            自定义变量:
                a.命令行传递:
                    -e VAR=VALUE
                b.在hosts Inventory中为每个主机定义专用变量值:
                    ①向不同的主机传递不同的变量;
                        IP/HOSTNAME variable_name=value
                    ②向组内的所有主机传递相同的变量;
                        [groupname:vars]
                        variable_name=value
                c.在playbook中定义:
                    vars:
                        – var_name:value
                        – var_name:value
                d.Inventory还可以使用参数:
                    用于定义ansible远程连接目标主机时使用的属性,而非传递给playbook变量:
                        ansible_ssh_host
                        ansible_ssh_port
                        ansible_ssh_user
                        ansible_ssh_pass
                        ansible_sudo_pass
                        …
                e.在角色调用时传递:
                    roles:
                        – { roles: ROLE_NAME,var: value,….}
        变量的调用:
            {{ var_name }}
    (4)Templates:模板:文本文件,内部嵌套有模板语言脚本(使用模板语言编写)      
        Jinja2 is a template engine written in pure Python.  It provides a  Django inspired non-XML syntax but supports inline expressions and an optional sandboxed environment.
        jinja2是模板引擎用纯Python。它提供了一个Django启发非XML语法但支持内联表达式和一个可选的沙箱环境。
        语法:
            字面量:
                字符串:使用单引号或双引号;
                数字:整数、浮点数;
                列表:[item1, item2, …]
                元组:(item1, item2, …)
                字典:{key1:value1, key2:value2, …}
                布尔型:true/false
            运算类:
                算术运算:+, -, *, /, //, %, **
                比较操作:==, !=, >, <, >=, <=
                逻辑运算:and, or, not
    执行模板文件中的脚本,并生成结果数据流,需要使用template模块;
        template:
            -a "" (src dest mode owner group)
        注意:此模板不能在命令行使用,而只能用于playbook;
        条件测试:
            when语句:在tasks中使用,Jinja2的语法格式;
            循环:迭代,需要重复执行的任务;
            对迭代项的引用,固定变量名为"item”,使用with_item属性给定要迭代的元素;
                元素:列表(字符串 字典)
            基于字符串列表给出元素示例:
                – hosts: websrvs
                 remote_user: root
                 tasks:
                 – name: install packages
                  yum: name={{ item }} state=latest
                   with_items:
                       – httpd
                      – php
                       – php-mysql
                       – php-mbstring
                       – php-gd
            基于字典列表给元素示例:
                – hosts: all
                  remote_user: root
                  tasks:
                  – name: create groups
                    group: name={{ item }} state=present
                    with_items:
                   – groupx1
                   – groupx2
                   – groupx3
                   – name: create users
                   user: name={{ item.name }} group={{ item.group }} state=present
                   with_items:
                       – {name: 'userx1', group: 'groupx1'}
                       – {name: 'userx2', group: 'groupx2'}
                       – {name: 'userx3', group: 'groupx3'}
    (5)roles:角色
        以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;
            role_name/
                files/:存储由copy或script等模块调用的文件;
                tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;
                handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;
                vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;
                templates/:存储由template模块调用的模板文本;
                meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;
                default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
        在playbook中调用角色的方法:
            – hosts: HOSTS
             remote_user: USERNAME
             roles:
                 – ROLE1
                 – ROLE2
                  – { role: ROLE3, VARIABLE: VALUE, …}
                 – { role: ROLE4, when: CONDITION }       

原创文章,作者:sjsir,如若转载,请注明出处:http://www.178linux.com/57130