zoukankan      html  css  js  c++  java
  • Ansible--批量 linux/unix服务器管理工具

    理论部分:

    1. 常用的自动化运维工具:

    Puppet

    —基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱

    SaltStack

    —基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YMAL,使得配置脚本更简单

    Ansible

    —基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2 模板语言,更强的远程命令执行操作

    其他 DevOps 请参看:https://github.com/geekwolf/sa-scripts/blob/master/devops.md

    2.ansible简介:

    Ansible 是一个简单的自动化运维管理工具,可以用来自动化部署应用、配置、编排 task(持续交付、无宕机更新等),采用 paramiko 协议库(fabric 也使用这个),通过 SSH 或者 ZeroMQ 等连接主机,大概每 2 个月发布一个主版本

    简单的说:    让我们自动化部署APP;自动化管理配置项;自动化的持续交付;自动化的(AWS)云服务管理。 批量的在远程服务器上执行命令 。

    Ansible则是提供了一套简单的流程,你要按照它的流程来做,就能轻松完成任务.

    3.Ansible 工作机制:

    基于 paramiko 开发的。这是一个纯Python实现的ssh协议库,Ansible 在管理节点将 Ansible 模块通过 SSH 协议(或者 Kerberos、LDAP)推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排

    4.Ansible 的组成:

    由 5 个部分组成:

    Ansible:核心

    Modules:包括 Ansible 自带的核心模块及自定义模块

    Plugins:完成模块功能的补充,包括连接插件、邮件插件等

    Playbooks:网上很多翻译为剧本,个人觉得理解为编排更为合理;定义 Ansible 多任务配置文件,有 Ansible 自动执行

    Inventory:定义 Ansible 管理主机的清单

    5.ansible的优点: 
    1、轻量级,他不需要去客户端安装agent,更新时,只需要在操作机上进行一次更新即可.
    2、批量任务执行可以写成脚本,而且不用分发到远程就可以执行. 
    3、使用python编写的,维护更简单,ruby语法过于复杂 .
    4、支持sudo.

    实验部分:

    1.安装ansible

    实验环境 :

    角色

    Hostname

    SystemRelease

    IP address

    node1

    node1.server.com

    Rhel-6.5_x86_64

    192.168.1.63

    node2

    node2.server.com

    Rhel-6.5_x86_64

    192.168.1.64

    server

    ansible.server.com

    CentOS-6.5_x86_64

    192.168.1.20

    准备工作:

    关闭iptables:

    各个服务器节点的配置

    1、节点1的配置,修改主机名

    [root@xuegod63 ~]# service iptables stop

    [root@xuegod63 ~]# chkconfig iptables off

    [root@xuegod63 ~]# hostname node1.server.com

    [root@xuegod63 ~]# vim /etc/sysconfig/network

    NETWORKING=yes

    HOSTNAME=node1.server.com

    logout 注销 重新登录 或者是reboot 重启

    2、节点2的配置,修改主机名:

    [root@xuegod64 ~]# service iptables stop

    [root@xuegod64 ~]# chkconfig iptables off

    [root@xuegod64 ~]# hostname node2.server.com

    [root@xuegod64 ~]# vim /etc/sysconfig/network

    //添加如下内容:

    NETWORKING=yes

    HOSTNAME=node2.server.com

    logout 注销 重新登录 或者是reboot 重启

    在Ansible服务器配置:

    1. 防火墙和主机名配置

    [root@Master ~]# service iptables stop

    [root@Master ~]# chkconfig iptables off

    [root@Master ~]# hostname ansible.server.com

    [root@Master ~]# vim /etc/sysconfig/network

    添加:

    NETWORKING=yes

    HOSTNAME=ansible.server.com

    重启或者是logout

    1. 添加hosts解析

      [root@ansible ~]# vim /etc/hosts #编辑hosts文件

      [root@ansible ~]# tail -3 /etc/hosts

      192.168.1.63 node1.server.com #node1

      192.168.1.64 node2.server.com #node2

      192.168.1.20 ansible.server.com #ansible

    测试连通性

    [root@ansible ~]# ping node1.server.com

    [root@ansible ~]# ping node2.server.com

    1. 配置EPEL源

    [root@ansible ~]#

    rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

    [root@ansible ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

    [root@ansible ~]# yum install ansible -y #安装ansible

    2.ansible的配置文件及作用

    [root@ansible ~]# rpm -ql ansible | more

    /etc/ansible

    /etc/ansible/ansible.cfg #主配置文件

    /etc/ansible/hosts #节点主机列表

    /etc/ansible/roles

    /usr/bin/ansible

    /usr/bin/ansible-console

    /usr/bin/ansible-doc

    /usr/bin/ansible-galaxy

    /usr/bin/ansible-playbook

    /usr/bin/ansible-pull

    /usr/bin/ansible-vault

    3. 编辑/etc/ansible/hosts(节点配置文件):

    [root@ansible ~]# vim /etc/ansible/hosts

    [root@ansible ~]# tail -3 /etc/ansible/hosts

    [webserver]

    node1.server.com

    node2.server.com

    //其他内容可以全部注释掉

    1. 配置ansible端能基于密钥认证的方式联系各被管理节点。

    [root@ansible ~]# ssh-keygen #生成密钥对

    5、把密钥发往各个节点服务器上:

    [root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1.server.com

    [root@ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2.server.com

    Ansible简单测试

    ansible命令

    格式:ansible  节点名称   [ -m  模块]   -a  命令参数

    例:

      1、查看各个节点的时间

    [root@ansible ~]# ansible all -a date

    [root@ansible ~]# ansible all -m command -a date

    //以上两条命令结果是一样的,因为默认调用 command 模块,所以可以省略, all 表示所有节点, -a 后面是参数

    2、查看各个节点在线情况

    [root@ansible ~]# ansible all -m ping //内建的ping模块

    3、在各个节点输出指定信息

    [root@ansible ~]# ansible all -a "/bin/echo hello,world" #输出信息

    [root@ansible ~]# ansible all -a "/bin/df -h" #输出挂载信息

    [root@ansible ~]# ansible all -a "/sbin/ip addr show dev eth0 " #查看各节点的 eth0 网卡信息

    Ansible-playbook

    1、Playbook是通过yaml文件来配置实现的,先来介绍下yaml语法!

          YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。

    其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔。YAML文件扩展名通常为.yaml,如example.yaml

    2、Playbook可以用来管理复杂任务

         对于需反复执行的、较为复杂的任务,我们可以通过定义 Playbook 来搞定。Playbook 是 Ansible 真正强大的地方,它允许使用变量、条件、循环、以及模板,也能通过角色 及包含指令来重用既有内容。下面我们来看看一些具体的实例。

    1:批量安装mysql-server软件:

    [root@ansible ~]# vim mysql-server.yaml #建立mysql-server .yaml文件

    内容如下: (注意语法格式)

    选项解析:

    hosts:webserver         #指定要执行指定任务的主机,其可以是一个或多个由冒号分隔主机组

    remote_user:root         #用于指定远程主机上的执行任务的用户

    tasks:                       #  任务

    -name:mysql-server installing    # 给这个任务起的名字

    yum:name=php           #利用yum模块,安装软件的包名为mysql-server

    state=present                 #状态为安装  

    state=absent                  #状态为卸载

    检查node是否已经安装mysql-server

    [root@ansible ~]# ansible all -a "/bin/rpm -q mysql-server "

    [root@ansible ~]# ansible-playbook mysql-server.yaml

    看到结果,ok=2    changed=1 说明客户机上的mysql-server安装成功了!

    验证一下 mysql-server是否成功

    [root@ansible ~]# ansible all -a "/bin/rpm -q mysql-server "

    [root@ansible ~]# ansible all -a "/sbin/service mysqld start " #启动mysqld

    案例2 创建crontab计划

    1.建立cron.yaml,让每月10号来运行/root/backup.sh脚本

    [root@ansible ~]# vim crond.yaml

    内容如下:

    1. 执行

      [root@ansible ~]# ansible-playbook crond.yaml

    看到结果,ok=2    changed=1 说明客户机上的crontab计划创建成功了!

    1. [root@ansible ~]# ansible all -a 'crontab -l ' #查看各个节点crontab:

    注:

    "ansible-doc -l" 命令来查看它内置的有哪些模块。

    "ansible-doc  模块名"  命令来查看具体模块的详细用法。

    使用ansible批量的添加用户

    方法一:直接使用ansible命令

    [root@ansible ~]# openssl passwd -salt -l "abc123"

    -luVlrZexUGHM

    [root@ansible ~]# ansible all -m user -a "name=baigujing password=-luVlrZexUGHM shell=/bin/bash " -u root

    方法二:定义主机清单在使用ansible命令

    [root@ansible ~]# openssl passwd -salt -l "abc123"

    -luVlrZexUGHM

    [root@ansible ~]# vim hosts #添加主机地址

    [root@ansible ~]# ansible -i hosts webserver -m user -a "name=tester password=-luVlrZexUGHMshell=/bin/bash " -u root

    参数解释:

    -i #指定 inventory文件的位置;

    webserver #清单文件中的主机组名称

    -m #指定模块,不加此选项默认使用command模块

    user #添加用户的模块

    -a #编写模块内支持的指定

    -u #指定远程用户

    注意:密码不能是明文 注意是password 不是passwd

    .注意password必须是密文的,直接添加到/etc/shadow文件中

    创建用户组:

    ansible -i test puppet -m group -a "name=test state=present" -u root

    #建立用户组,使用的是新的模块 group

    删除用户:

    ansible -i hosts webserver -m user -a "name=tester remove=yes state=absent" -u root

    方法三:编写yaml文件

    1,生成密钥

    [root@ansible ~]# openssl passwd -salt -l "abc123"

    -luVlrZexUGHM #生成salt密钥

    2.编辑yaml文件

    [root@ansible ~]# vim useradd.yaml #编辑文件

    [root@ansible ~]# cat useradd.yaml #查看内容

    - hosts: webserver #定义主机组

    user: root #远程链接用户

    vars:

    user: jerry #添加的用户名

    tasks: #任务

    - name: add user #任务名称

    action: user name={{ user }} password=-luVlrZexUGHM shell=/bin/bash home=/home/{{ user }} #指定用户相关的信息 密码 必须是密文salt加密 登录shell 宿主目录

    3.执行yaml文件

    [root@ansible ~]# ansible-playbook useradd.yaml

    成功

      1. 客户端节点验证

        [root@ansible ~]# ansible all -a "/usr/bin/tail -1 /etc/shadow"

        用户名jerry 没错 密码就是通过第一步生成的 abc123

        切换用户验证

        输入明文abc123 即可

  • 相关阅读:
    第48天-shell(2013.09.25)
    嵌入式Linux gdb core dump快速定位程序crash问题
    va_arg va_start va_end 获取函数参数内容
    Ubunut apache2 服务器 搭建 文件下载
    CRC16 串口校验
    Linux 处理中文字符串 :/区分中文和英文的方法
    LINUX 工具移植:scp 快速拷贝文件到开发板
    打印内存变量定位 程序出现内存方面的问题
    Linux C 调用 ping命令 检测网络状态
    Ubuntu Gitlab 备份代码服务器
  • 原文地址:https://www.cnblogs.com/yeyou/p/5975900.html
Copyright © 2011-2022 走看看