美文网首页
Linux之Ansible

Linux之Ansible

作者: 魏镇坪 | 来源:发表于2016-03-07 13:56 被阅读1231次

    Ansible简介

    Ansible是2013年推出的一款IT自动化和DevOps软件,目前由Redhat已签署Ansible收购协议。其是基于Python研发,糅合了人多老运维工具的优点实现了批量操作系统配置,批量程序的部署,批量运行命令等功能。

    Ansible的特性:

    • 模块化设计
      • 调用特定的模块来完成特定任务
    • 基于pythone语言实现
      • 由paramiko,PyYAML(半结构化语言)和jinja2三个关键模块实现
    • 部署简单
      • 是agent less类型
    • 主从模式工作
    • 支持自定义模块
    • 支持playbook
    • 易于使用
    • 支持多层部署
    • 支持异构IT环境

    Ansible的组件

    imgimg
    • ansible core
      • 核心模块
    • host inventory
      • 主机库,能够管控的主机列表,没有放进这个列表的,都不能进行管控
    • connection plugins
      • 连接插件,一般默认基于ssh协议连接
    • modules
      • core modules(自带模块)
      • custom modules(自定义模块)
    • plugins
      • 为ansible扩展功能
    • playbook
      • 剧本,按照所设定编排的顺序执行完成安排的任务

    ansible的配置文件

    • 主配置文件
      • /etc/ansible/ansible.cfg
    • host inventory定义管控主机
      • /etc/ansible/hosts (遵循INI风格,中括号中的字符是组名,一个主机 可以属于多个组)
      [webservers]
      node1.zhenping.me
      node2.zhenping.me
      172.16.36.70
      172.16.36.71
      

    ansible安装

    • yum install ansible

    ansible命令

    • 使用格式
      • ansible <host-pattern> [-f forks] [-m module_name] [-a args]
        • -a :指定模块的参数
        • -f # :一次要管理几个主机,默认为5个
        • -m MOUDULE : 指定模块
        • <host-pattern> : 事先需要定义的hosts文件中的主机列表
        • -i PATH : 指明使用的host inventory文件路径

    ansible-doc命令

    获取模块列表,及模块使用格式

    • 使用格式
      • ansible-doc [-l] [-m MODULE]
        • -l : 列出支持的核心模块
        • -s MODULE : 查看模块的用法

    ansible常用模块

    一、command模块

    • 功能
      • 能在远程节点运行一个命令,但不能运行有管理的命令,command模块的参数非为kv格式,而是直接给出要执行的命令
    • 使用示例
      • ansible all -a 'ntpdate 172.16.0.1' (其是默认模块,可省略模块名称)
    [root@Centos7 ~]# ansible all -a 'ntpdate 172.16.0.1'
    172.16.36.61 | success | rc=0 >>
    29 Feb 19:36:07 ntpdate[2360]: step time server 172.16.0.1 offset 135.642843 sec
    
    172.16.36.60 | success | rc=0 >>
    29 Feb 19:36:07 ntpdate[2402]: step time server 172.16.0.1 offset 135.687205 sec
    
    172.16.36.71 | success | rc=0 >>
    29 Feb 19:36:13 ntpdate[2345]: step time server 172.16.0.1 offset -28665.158303 sec
    
    172.16.36.70 | success | rc=0 >>
    29 Feb 19:36:13 ntpdate[32087]: step time server 172.16.0.1 offset -28664.450998 sec
    

    二、user模块

    • 功能

    管理用户

    • 使用格式
      • ansible all -m user -a "name= state={present | absent} force= system= uid= shell= home= "
        • name= : 创建的用户名
        • state= : present新增,absent删除
        • force= : 删除用户的时候删除家目录
        • system= : 创建系统用户
        • uid= : 指定UID
        • shell= : 指定shell
        • home= : 指定用户家目录
    • 使用示例
      • ansible webserver -m user -a "name=zhenping state=present system=true"
      • ansible webserver -m user -a "name=zhenping state=absent"

    三、group模块

    • 功能

    组管理

    • 使用格式
      • -a "name= state={present|absent} gid= system="
    • 使用示例
      • ansible webserver -m group -a "name=user1 state=present system=true"

    四、cron模块

    • 功能

    定义cron任务

    • 使用格式
      • -a "name= state= minute= hour= day= month= weekday= job= state={present|absent"
    • 使用示例
      • ansible all -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &> /dev/null' name='sync time' state=present"

    五、ping模块

    • 功能

    测试网络连通性, ping模块没有参数

    • 使用格式
      • ansible all -m ping
    • 使用示例
    [root@Centos7 ~]# ansible all -m ping
    172.16.36.61 | success >> {
        "changed": false,
        "ping": "pong"
    }
    
    172.16.36.60 | success >> {
        "changed": false,
        "ping": "pong"
    }
    
    172.16.36.70 | success >> {
        "changed": false,
        "ping": "pong"
    }
    
    172.16.36.71 | success >> {
    

    六、file模块

    功能

    文件创建和删除

    使用格式
    • -a "path= mode= owner= group= state={directory|link|hard|touch|file|absent} src= "
      • path= : 目标
      • src= : 原文件
      • state= : 文件类型
    使用示例
    • ansible webserver -m file -a "path=/root/fstab src=/etc/fstab state=link"
    • ~]# ansible webserver -m file -a "path=/root/testfile state=directory"

    七、copy模块

    功能

    文件复制,把管理端的文件复制到远程主机各一份

    使用格式
    • -a "src= dest= mode= owner= "
    使用示例
    • ansible webserver -m copy -a "src=/root/testfile.txt dest=/root/testfile.ansible"

    八、yum模块

    功能

    实现程序包安装及管理

    使用格式
    • -a "name= conf_file= state={present|latest|absent} enablerepo= disablerepo= "
      • state=latest : 安装最新版本
      • conf_file= : 使用指定repo的配置文件
    使用示例
    • ansible webserver -m yum -a 'name=nginx state=absent'

    九、service模块

    功能

    实现服务管理

    使用格式
    • -a "name= state={started|stoped|restarted} enabled= runlevel= "
    使用示例
    • ansible webserver -m service -a "name=nginx state=started enabled=true

    十、shell模块

    功能

    运行shell命令,其是启动一个子shell进程来运行命令,它可以支持管道传送

    使用格式
    • -a 'command'
    使用示例
    • ansible webserver -m shell -a "echo "zhenping.me" | passwd --stdin user1"

    十一、script模块

    功能

    指定本地的脚本文件,到远程主机运行一次

    使用格式
    • -a "/path/to/script"
    使用示例

    *ansible webserver -m script -a '/root/test.sh'

    十二、setup模块

    功能

    收集远程指定主机的facts信息,其将收集的信息保存在各变量中,变量引用方法为:直接引用名称

    使用示例
    • ansible 172.16.36.71 -m setup
    [root@Centos7 ~]# ansible 172.16.36.71 -m setup
    172.16.36.71 | success >> {
        "ansible_facts": {
            "ansible_all_ipv4_addresses": [
                "172.16.36.71"
            ],
            "ansible_all_ipv6_addresses": [
                "fe80::20c:29ff:fed1:dcb5"
            ],
            "ansible_architecture": "x86_64",
            "ansible_bios_date": "05/20/2014",
            "ansible_bios_version": "6.00",
            "ansible_cmdline": {
                "BOOT_IMAGE": "/vmlinuz-3.10.0-229.el7.x86_64",
                "LANG": "zh_CN.UTF-8",
                "crashkernel": "auto",
                "quiet": true,
                "rhgb": true,
                "ro": true,
                "root": "UUID=cdd3548e-caf3-46cb-b81c-03f443325edc"
            },
            "ansible_date_time": {
                "date": "2016-02-29",
                "day": "29",
                "epoch": "1456751201",
                "hour": "21",
                "iso8601": "2016-02-29T13:06:41Z",
                "iso8601_micro": "2016-02-29T13:06:41.194636Z",
                "minute": "06",
                "month": "02",
                "second": "41",
                "time": "21:06:41",
                "tz": "CST",
                "tz_offset": "+0800",
                "weekday": "Monday",
                "year": "2016"
            },
            "ansible_default_ipv4": {
                "address": "172.16.36.71",
                "alias": "eno16777736",
                "gateway": "172.16.0.1",
                "interface": "eno16777736",
                "macaddress": "00:0c:29:d1:dc:b5",
                "mtu": 1500,
                "netmask": "255.255.0.0",
                "network": "172.16.0.0",
                "type": "ether"
            },
            
            .........
    

    playbooks剧本

    简介

    playbooks是ansible更为强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行。其是使用YAML(Yet Another Markup Language),类似于半结构化语言,声明式配置,可读性较高。易于与脚本语言交互

    核心组件

    • Tasks :任务
    • Variables : 变量
      • inventory参数:(用于hosts定义的主机后面,多个使用空格分隔)

        • ansible_ssh_port : 指定ssh端口
        • ansible_ssh_user : 指定ssh用户
        • ansible_ssh_pass : 指定ssh用户登录认证密码,明文密码
        • ansible_sudo_pass : 指明sudo时候的密码
        [webserver]
        172.16.36.70 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=zhenping.me
        
    • template : 模板
    • Handles : 处理器
    • Roles : 角色,用于调度不同的playbooks

    YAML语法格格式

    • 任何数据结构都用缩进进来标识,可以嵌套

    • 每一行是一个键值数据key:value,使用冒号分隔,若想在一行标识需要使用{}和,将多个kv分隔开

    • 列表使用-标识

    • 示例:

    - hosts: webserver
      remote_user: root
      tasks:
        -  name: install nginx
           yum: name=nginx state=present
        -  name: start nginx
           service: name=nginx state=started enabled=true
        -  name: install php-fpm
           yum: name=php-fpm state=present
        -  name: start php-fpm
           service: name=php-fpm state=started enabled=true
       vars
       handlers
    -  hosts: dbserver
       remote_user: root
       tasks:
         -  name: install mysql
            yum: name=mysql state=present
    

    playbook的变量

    变量命名方式

    字母、数字和下划线组成,仅能以字母开头

    变量的各类
    • facts

      • 由远程主机发回的主机特有的属性信息,这些信息被保存在ansible变量中,无须声明,可直接调用
    • 自定义变量

      • 通过命令行传递
        • ~]# ansible-playbook test.yml -extra-vars "hosts=www user=zhenping"
      • 通过roles传递
    • 主机变量

      • 定义在inventory中的主机之后的变量,直接传递给单个主机的变量
      [webserver]
      172.16.36.70 username=zhenping pass=zhenping
      172.16.36.71
      
    • 主机组变量

      • 定义在inventory中的组上的变量
      [webserver]
      172.16.36.70
      172.16.36.60
      [webserver:vars]
      var1=value
      var2=value
      
    playbook调用变量的示例
    -  hosts: webserver
       remote_user: root
       vars:
         user: user2
         pass: 123321
       tasks:
           - name: add user
             user: name={{ user }} state=present
           - name: set password
             shell: /bin/echo {{ pass }} | passwd --stdin {{ user }}
    
    手动运行playbook脚本时,传递变量(手动传递时,优先级要高于脚本中的变量)
    • ansible-playbook script.yml --extra-vars "username=ubunt"
    • ansible-playbook script.yml -e VARS

    playbook的条件测试

    在某task后面添加when子句,即可实现条件测试功能,when语句支持jinja2语法

    ####当主机的操作系统为redhat系列操作系统时,才执行yum安装
    - hosts : webserver
      remote_user : root
      tasks :
         - name: yum install keepalived
           yum: name=keepalived state=present
           when: ansible_os_family == "ReaHat"
         - name: say hello
           shell: /bin/echo "hello world"
    

    playbook的迭代

    在task中调用内置的Item变量,在某task后面使用with_items语句来定义元素列表

    - hosts: webserver
      remote_user: root
      tasks:
        - name: user add
          user: name={{ item }} state=present
          with_items:
             - testuser1
             - testuser2
             - testuser3
             - testuser4
    
    - hosts: webserver
      remote_user: root
      tasks:
      - name: user add
        user: name={{ item.name }} state=present group={{ item.groups }}
        with_items:
        - { name: 'tom2', groups: 'tom' }
        - { name: 'tom2', groups: 'tom2' }
    

    playbook--handlers: 处理器、触发器

    只有在其关注的条件满足时,才会被触发执行的任务

    示例:只有原配置文件被修改了,才会重新加载服务
    - hosts: webserver
      remote_user: root
      tasks:
      - name: yum install nginx
        yum: name=nginx state=present
      - name: start nginx
        service: name=nginx state=started enabled=true
      - name: copy configuration file
        copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf
        notify: restart nginx
      handlers:
      - name: restart nginx
        service: name=nginx state=reloaded
    

    Roles: 角色

    roles用于实现“代码复用”,让playboo中的各元素组织起来,roles以特定的层次型格式组织起来的playbook元素(vars,tasks,template,handlers),可被playbook以roles的名字直接调用

    roles目录结构
    • webserver/ : 主机组文件夹
      • files/ : 存放文件,此角色中用到的所有文件均放置于此目录中
      • templates/ : jinja2模板文件存放位置
      • tasks/ : 任务列表文件,可以有多个,但至少有一个叫做main.yml的文件,其它文件要被main.yml包含
      • handlers/ : 处理器列表文件,可以有多个,至少有一个叫做main.yml的文件,其它文件要被main.yml包含
      • vars/ : 变量字典文件,可以有多个, 但至少有一个叫做main.yml的文件,其它文件要被main.yml包含
      • meta/ : 元数据,用于定义此角色的特殊设定及依赖关系等
    示例:
    
    ~]# cd /etc/ansible/soles   
    ~]# mkdir -pv webserver/{files,vars,tasks,handlers,meta,templates}
    ~]# cd webserver/
    ~]# vim vars/main.yml
    user: daemon
    group: daemon
    ~]# vim tasks/main.yml
    - name: remove nginx
      yum: name=nginx state=absent
    - name: install apache
      yum: name=httpd state=present
    - name: start & enable httpd
      service: name=httpd state=started enabled=true
    - name: install configuration file
      template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify: restart httpd servic
    ~]# vim handlers/main.yml
    - name: restart httpd service
      service: name=httpd state=restarted
    ~]# cp /etc/httpd/conf/httpd.conf /root/webserver/template/httpd.conf.j2  #准备示例文档
    ~]# vim templates/http.conf.j2
    ....
    User {{ user }}
    Group {{ group }} 
    ....
    ~]# cd ../.. #与roles同级的目录
    ~]# vim webserver.yml
    - hosts: webserver
      remote_user: root
      roles:
      - webserver
      
    ~]# ansible-playbook webserver.yml
    PLAY [webserver] **************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [172.16.36.70]
    ok: [172.16.36.71]
    
    TASK: [webserver | remove nginx] **********************************************
    ok: [172.16.36.70]
    ok: [172.16.36.71]
    
    TASK: [webserver | install apache] ********************************************
    ok: [172.16.36.70]
    ok: [172.16.36.71]
    
    TASK: [webserver | start & enable httpd] **************************************
    ok: [172.16.36.71]
    ok: [172.16.36.70]
    
    TASK: [webserver | install configuration file] ********************************
    ok: [172.16.36.70]
    ok: [172.16.36.71]
    
    PLAY RECAP ********************************************************************
    172.16.36.70               : ok=5    changed=0    unreachable=0    failed=0
    172.16.36.71               : ok=5    changed=0    unreachable=0    failed=0
    
    
    #####可以为roles传递变量
    ~]# vim dbserver.yml
    - hosts: 172.16.36.60
      remote_user: root
      roles:
      - { role: webserver, user=nobody }
      - { role: dbserver, user=mysql }  #可以调用多个role
      
     
    ######使用tags参数,只调用某个tasks(以下示例只触发了install config的任务)
    ~]# vim roles/webserver/tasks/main.yml
    - name: remove nginx
      yum: name=nginx state=absent
    - name: install apache
      yum: name=httpd state=present
    - name: start & enable httpd
      service: name=httpd state=started enabled=true
    - name: install configuration file
      template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
      notify: restart httpd service
      tags: conf
    
    [root@Centos7 ~]# ansible-playbook -t conf webserver.yml
    
    PLAY [webserver] **************************************************************
    
    GATHERING FACTS ***************************************************************
    ok: [172.16.36.71]
    ok: [172.16.36.70]
    
    TASK: [webserver | install configuration file] ********************************
    ok: [172.16.36.70]
    ok: [172.16.36.71]
    
    PLAY RECAP ********************************************************************
    172.16.36.70               : ok=2    changed=0    unreachable=0    failed=0
    172.16.36.71               : ok=2    changed=0    unreachable=0    failed=0
    
    

    相关文章

      网友评论

          本文标题:Linux之Ansible

          本文链接:https://www.haomeiwen.com/subject/jjnakttx.html