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

相关推荐

  • linux中的马里奥之重定向与管道详解

    你背单词时 阿拉斯加的鳕鱼正跃出水面 你算数学时 太平洋彼岸的海鸥振翅掠过城市上空 你晚自习时 极图中的夜空散漫了五彩斑斓 但是少年你别着急 在你为自己未来踏踏实实地努力时 那些你感觉从来不会看到的景色 那些你觉得终身不会遇到的人 正一步步向你走来。          ——网易云热评《Something Ju…

    2017-07-22
  • 马哥linux0728课程内容

    课堂学习内容   -ahistory list –.bash_histroy 保存历史列表到历史文件 -cclear history list 清空历史列表 -d deletehistory entru 清除历史列表某一条命令 -rread .bash_history 读历史文件中的命令到历史列表…

    Linux干货 2016-08-04
  • openssl关于CA证书的创建

    1、用openssl实现证书申请 先在/etc/pki/CA/目录下创建一个index.txt的文件,作为ca证书的数据库 在相同目录下创建一个serial的序列号文件,并写入01 生成ca的签名证书用到的私钥文件 注意:私钥的权限时600,文件名必须是cakey.pem 生成自签证书 这样私有CA建立完成 申请认证: 在申请的机器上生成私钥 生成申请文件 …

    Linux干货 2016-09-23
  • N28-第二周博客作业

    常用通配符
    *:表示任意长度的任意字符;

    ?:表示任意的单个字符;

    []:表示在指定范围内的单个字符:[a-z];

    [^]:脱字符,是取反的意思,即在指定范围以外的任意字符,如 [^0-9]表示除数字以外的一切字符。

    [:digit:] 表示所有的数字,相当于0-9

    [:lower:] 表示所有的小写字母

    [:upper:] 表示所有的大写字母

    [:alpha:] 表示所有的字母,

    [:alnum:] 相当于[0-9a-z]

    [:space:] 相当于空白字符

    [:punct:] 表示所有的标点符号

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。

    2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。

    3、请使用命令行展开功能来完成以下练习:

    (1)、创建/tmp目录下的:a_c, a_d, b_c, b_d

    (2)、创建/tmp/mylinux目录下的:
    mylinux/
    ├── bin
    ├── boot
    │?? └── grub
    ├── dev
    ├── etc
    │?? ├── rc.d
    │?? │?? └── init.d
    │?? └── sysconfig
    │?? └── network-scripts
    ├── lib
    │?? └── modules
    ├── lib64
    ├── proc
    ├── sbin
    ├── sys
    ├── tmp
    ├── usr
    │?? └── local
    │?? ├── bin
    │?? └── sbin
    └── var
    ├── lock
    ├── log
    └── run

    4、文件的元数据信息有哪些,分别表示什么含义,如何查看?如何修改文件的时间戳信息。

    5、如何定义一个命令的别名,如何在命令中引用另一个命令的执行结果?

    6、显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。

    7、显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。

    8、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。

    9、在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。

    10、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。

    11、复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。

    12、复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。

    Linux干货 2017-12-11
  • 初学Linux之文件查找和压缩

    使用locate命令 ,使用find命令 ,压缩和解压缩工具

    2018-01-13
  • bash 数组和变量

    数组可以把多个变量集合起来,不用再一个个的声明变量,也可以调多个单个的变量使用,极大方便了我们的使用,而且Linux bash中的数组还支持同一个数组中同时有数字和字符串。下面让我们来了解一下数组。 一,数组的简介 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合。 数组名和索引 索引:编号从0 开始,属于数值索引 注意…

    Linux干货 2016-08-24