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

赞 (1)
sjsirsjsir
上一篇 2016-11-02 23:27
下一篇 2016-11-03 00:20

相关推荐

  • Samba服务

    一 服务端配置 1 安装所需软件 [root@centos7 ~]# yum install samba samba-common -y samba主要提供SMB服务所需的各项服务程序、相关的文件及其他和Samba相关的设置等 samba-common提供服务端和客户端都会用的的数据,包括主配置文件、语法检查等 2 添加Samba用户 添加smb1、smb2…

    Linux干货 2017-06-13
  • Shell脚本编程

    shell脚本编程 Bash为用户提供了编程环境 相对于计算机而言,只能识别二进制文件,因此其所运行的其实是二进制指令,而这些二进制指令我们称之为机器语言,属于低级语言;程序员编程所使用的语言为高级语言,是人们比较容易理解的语言;因此,程序的执行过程:先把源码程序翻译成机器语言(生成可执行的文件),然后解释执行。程序( 程序=指令+数据 )的编程风格有两种:…

    2017-04-14
  • LVS基本原理

    LVS基本原理 简介 负载调度器、真实服务器群节点一起被称为LVS。LVS负载调度器(有时也称为负载平衡器),接收所服务的所有接入服务集群的请求,并决定集群中的哪个节点应该回复其请求。 1)负载调度器(Director):作为整个集群的前端,主要将用户请求分发至真实服务器中进行处理。 2)真实服务器池:由多个功能相同的真实服务器组成,为用户提供真正的网络服务…

    Linux干货 2016-12-27
  • 自制linux系统

    本文主要通过裁剪现有Linux系统,打造一个属于自己的Linux小系统,让其能够装载网卡驱动,并配置IP地址,实现网络功能。 自制linux系统 步骤概述: 1、新建一个硬盘2、在该新硬盘上新建两个分区,一个当boot分区,一个当/分区3、格式化并且挂载两个分区4、安装grub至目标磁盘5、为grub提供配置文件6、复制内核文件和initrd文件7、创建目标…

    Linux干货 2016-09-13
  • 什么叫Linux

    什么叫linux:     Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。 谁编写的linux: Linux的出现,最早…

    Linux干货 2017-03-27
  • 高级文件系统管理之磁盘配额及RAID的运用

    本章内容 设定文件系统配额 设定和管理软RAID设备 一,概述 配置配额系统: 综述 在内核中执行 以文件系统为单位启用 磁盘配额最小单位是以文件系统为单位启用,就是一个挂载点,而不能以目录为单位 对不同组或者用户的策略不同 根据块或者节点进行限制 执行软限制(soft limit) 硬限制(hard limit) 初始化 分区挂载选项:usrquota、g…

    Linux干货 2016-09-07