互联网技术的发展,机房里面机器的数量随之增加,运维的难度和复杂度也在增加,需要投入的运维人员和成本也在增加,从而催生了一系列的自动化运维工具(Ansible、SaltStack、Puppet)的产生来减少运维的成本。
Ansible、SaltStack、Puppet 都是目前比较受用户欢迎的自动化化运维工具,其中 Ansible 和 SaltStack 使用 Python 编写,具有良好的可移植性。Puppet 的使用脚本语法复杂,且可移植性比较差,目前的使用者慢慢变少。
Ansible 和 SaltStack 都是的目前最流行的自动化运维工具,能满足企业 IT 系统的自动化运维管理。
这两个工具都是用 Python 开发的,可以部署到不同的系统环境中和具有良好的二次开发特性。

  • 在执行的命令的时候,Ansible 和 SaltStack 都支持 Ad-hoc 操作模式,也可以支持将命令写入 YAML 文件中再批量执行。
  • 在处理返回结果方面,Ansible 和 SaltStack 的返回结果格式都是 JSON 格式,比较易懂和方便解析。
    https://getansible.com/begin/an_zhuang_ansile

    安装

    管理端

    安裝 Ansible
    1
    2
    3
    #Redhat/CentOS Linux 上,Ansible 目前放在的 epel 源中,Fedora 默认源包含 Ansible
    sudo yum install epel-release
    sudo yum install ansible -y
    配置 Ansible 管理节点和主机的连接,就是配置从管理节点到远程主机之间基于 Key 的 SSH 连接(免密登录):
    1
    2
    3
    4
    5
    6
    #生成 ssh key
    ssh-keygen
    #拷贝 ssh key 到远程主机,ssh 的时候就不需要输入密码了
    ssh-copy-id user@ip
    #ssh 的时候不会提示是否保存 key
    ssh-keyscan ip >> ~/.ssh/known_hosts
    运行 ssh 命令,既不需要输入密码,也不会提醒存储 key,就表示配置成功
    1
    ssh user@ip

    被控端

    不需要安装特殊的包,只需要 Python > 2.4,RedHat 系列 Linux 一般安装方式都是默认安装的。

    配置

    主机

    Host Inventory 是配置文件,用来告诉 Ansible 需要管理哪些主机,并且把这些主机进行分类
    默认的文件是: /etc/ansible/hosts
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #最简单的 hosts 文件:
    192.168.1.50
    aserver.example.org
    bserver.example.org

    #带分类的 hosts 文件:
    mail.example.com
    [webservers]
    foo.example.com
    bar.example.com

    [dbservers]
    one.example.com
    two.example.com
    three.example.com

    命令

    Ansible 提供了一个命令行工具,在官方文档中起给命令行起了一个名字叫 Ad-Hoc Commands。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    ansible <host-pattern> [options]

    #检查环境
    #检查所有的远程主机,是否以 app 用户创建了 ansible 主机可以访问的环境
    ansible all -m ping -u app

    #执行命令
    #在所有的远程主机上,以当前 bash 的同名用户,在远程主机执行“echo bash”
    ansible all -a "/bin/echo hello"

    #拷贝文件
    #拷贝文件 /etc/host 到远程主机(组)web,位置为 /tmp/hosts
    ansible web -m copy -a "src=/etc/hosts dest=/tmp/hosts"

    #安装包
    #远程主机(组)web 安装 yum 包 acme
    ansible web -m yum -a "name=acme state=present"

    #添加用户
    ansible all -m user -a "name=foo password=<crypted password here>"

    #下载 git 包
    ansible web -m git -a "repo=git://foo.example.org/repo.git dest=/srv/myapp version=HEAD"

    #启动服务
    ansible web -m service -a "name=httpd state=started"

    #并行执行
    启动 10 个并行进行执行重起
    ansible lb -a "/sbin/reboot" -f 10

    #查看远程主机的全部系统信息
    ansible all -m setup

    脚本

    为了避免重复输入命令,Ansible 提供脚本功能;Ansible 脚本的名字叫 Playbook,使用的是 YAML 格式(与 JSON 类似,是一种表示数据的格式),文件后缀 .yml。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ansible-playbook deploy.yml

    ---
    #安装 apache 的 play
    - hosts: Web
    remote_user: root
    tasks:
    - name: nginx
    yum: pkg=nginx state=latest

    # 安装 mysql server 的 play
    - hosts: db
    remote_user: root
    tasks:
    - name: mysqld
    yum: pkg=mariadb state=latest

    模块