ansible 快速上手(Debian 9)

ansible 是个运维利器,用于自动化运维。如果你在工作中需要管理多个机器,或者做PaaS/IaaS相关的快速原型开发,那么ansible是个非常有用的工具,可以帮助你快速完成目标。

我在最近工作中使用了 ansible,这篇文章做个简单记录备忘。

1. 背景和基本概念

ansible 集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

特点:

  1. 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
  2. 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;

概念:

  1. inventory ,即主机列表文件hosts,我们可通过它对定义每个节点的代号、连接信息和分组。

  2. ansible.cfg, ansible的配置文件,默认位于 /etc/ansible。

  3. ad-hoc, ansible 提供的一种命令方式,用于解决简单任务。

  4. playbooks,ansible 提供的另一种命令方式,适合于复杂应用的部署。下面是一个例子:

    ---
    - hosts: webservers
      vars:
        http_port: 80
        max_clients: 200
      remote_user: root
      tasks:
      - name: ensure apache is at the latest version
        yum: pkg=httpd state=latest
      - name: write the apache config file
        template: src=/srv/httpd.j2 dest=/etc/httpd.conf
        notify:
        - restart apache
      - name: ensure apache is running
        service: name=httpd state=started
      handlers:
        - name: restart apache
          service: name=httpd state=restarted
    
  5. Tasks, playbook的核心,定义顺序执行的动作。

    每一个 play 包含了一个 task 列表(任务列表)。一个 task 在其所对应的所有主机上(通过 host pattern 匹配的所有主机)执行完毕之后,下一个 task 才会执行。

    每一个task必须有一个名称name,这样在运行playbook 时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。

  6. action。每个 action 调用一个 ansbile module。 语法:

    module: module_parameter=module_value
    
  7. Modules,也被称为 “task plugins” 或 “library plugins”,也可以仅仅通过 ansible 命令来运行它们。下面是几个例子,-m后面接调用module的名字,-a后面接调用module的参数:

    ansible webservers -m service -a "name=httpd state=started"
    ansible webservers -m ping
    ansible webservers -m command -a "/sbin/reboot -t now"
    

    bash 无论在命令行上执行,还是bash脚本中,都需要调用cd、ls、copy、yum等命令;module就是Ansible的“命令”。

  8. roles

2. 安装

我使用的是 Debian 9,基于python-pip进行安装。CentOS系和ubuntu的安装差别不是很大。

apt-get install -y python-pip
pip install ansible

安装完成后简单测试如下:

ansible localhost -m command -a 'echo Hello World.'

localhost | SUCCESS | rc=0 >>
Hello World.

单节点使用完成了,下面是我多节点的配置。在/etc/ansible目录下创建两个文件如下:

  1. 配置文件ansible.cfg
  2. 节点文件hosts

我使用了vagrant 在本地运行了4个虚机,已经默认做好了免密登陆。正常节点之间也需要做好密钥免密登陆的配置。上述两个文件内容如下:

image-20210116220825137

ansible.cfg 配置文件设置了host文件、默认的远程登录用户和不检查host key 的设置。

hosts文件设置了节点的别名和相关连接信息,并做了两个分组,local和k8s1。

运行一个测试命令,完成。

ansible all -m command -a 'echo Hello World.'

image-20210116221721538

参考资料


vagrant 快速上手(基于Debian9)

vagrant 是一款管理虚拟机的软件,我使用它作为分布式开发的环境配置。

Vagrant是 hashicorp 公司的产品,这家公司也非常有名气,主要做数据中心 PaaS 和虚拟化,大名鼎鼎的 Consul 就是他们家的。

这篇文章介绍我在 Debian 9下的的安装过程和一些常用命令,作个备忘。

1. 环境准备

vagrant默认是与virtubox组合使用,在使用之前,要先将两者都安装好:

2. 概念理解

安装完成后就可以正式开始使用了。在使用前,我们要先理解一些 vagrant 的基本概念。

  • Vagrant命令:提前定义一个Vagrantfile文件,便可以通过这个命令行工具启动一个虚拟机

  • Vagrantfile:是用来定义vagrant project的,使用ruby语法,但实际使用我们并不需要了解ruby。

  • Boxes:就是vagrant封装的虚拟机系统,我们也可以基于这些box做自己的系统。

    boxes vagrant拉起虚机的时候会自动下载,如果自动下载速度太慢,也可以手动下载:boxex的下载地址,下载后使用命令 vagrant box add xxx.box 即可。

vagrant up命令会搜索当前文件夹下的Vagrantfile并启动虚机。在虚拟机中会有一个/vagrant目录,这跟Vagrantfile是同一级目录,和宿主机上的目录文件是同步的。

vagrant 还有非常多的概念,这里就不展开了,可以直接看官方文档

  • push
  • plugins
  • providers

我是从 kuma 这个应用过来的,他们有一个完善的vagrant,可以参考学习:

 git clone https://github.com/kumahq/kuma-demo.git
 cd kuma-demo/vagrant
 vagrant up

3. Vagrantfile常用配置

  • 本机与虚拟机同步的目录

    config.vm.synced_folder "d:/workspace", "/workspace"
    
  • 端口转发

    config.vm.network :forwarded_port, guest: 80, host: 8080
    
  • 私网IP设置

    config.vm.network :forwarded_port, guest: 80, host: 8080
    
  • 公网IP设置

    config.vm.network :public_network, ip: “192.168.10.10”
    

4. Vagrant 常用命令

  • vagrant box add NAME URL #添加一个 box
  • vagrant box list #查看本地已添加的 box
  • vagrant box remove NAME virtualbox #删除本地已添加的 box
  • vagrant init NAME 初始化,实质应是创建 Vagrantfile 文件
  • vagrant up 启动虚拟机
  • vagrant destroy 销毁虚拟机
  • vagrant halt 关闭虚拟化开发环境
  • vagrant reload 修改配置文件后,重启虚拟化开发环境
  • vagrant box list 查看当前可用的虚拟化开发环境
  • vagrant box add box-name box-file 添加指定的box环境
  • vagrant box remove box-name 删除指定的box环境
  • vagrant package 当前正在运行的VirtualBox虚拟环境打包成一个可重复使用的box
  • vagrant ssh manage 登陆ssh虚机

5. 我的demo

这是我的 Vagrantfile:

image-20210116142225841

# -*- mode: ruby -*-
# vi: set ft=ruby :

TEST_IP      = "10.180.77.10"
K8S1_CIDR   = "10.181.0.0/16"
K8S2_CIDR   = "10.182.0.0/16"
K8S1_MASTER_IP     = "10.180.0.130"
K8S1_NODE_1_IP     = "10.180.0.131"
K8S1_NODE_2_IP     = "10.180.0.132"

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"
  config.vm.provider "virtualbox" do |v|
    v.memory = 2048
    v.cpus = 2
  end

  config.vm.define "test" do |node|
#    node.vm.box = "ubuntu/bionic64"
    node.vm.provider "virtualbox" do |v|
      v.memory = 512
      v.cpus = 1
    end
    node.vm.hostname = "test"
    node.vm.network :private_network, ip: TEST_IP
  end

  config.vm.define "k1m" do |node|
    node.vm.hostname = "k1m"
    node.vm.network :private_network, ip: K8S1_MASTER_IP
  end

  config.vm.define "k1n1" do |node|
    node.vm.hostname = "k1n1"
    node.vm.network :private_network, ip: K8S1_NODE_1_IP
  end

  config.vm.define "k1n2" do |node|
    node.vm.hostname = "k1n2"
    node.vm.network :private_network, ip: K8S1_NODE_2_IP
  end
end

我正准备拿来创建一个k8s集群。

启动后查看 vagrant 的密钥配置:

vagrant ssh-config

6. 插件功能

vagrant支持插件功能。这里介绍http代理的插件,毕竟研发k8s,代理也是必须的。

  1. 安装

    vagrant plugin install vagrant-proxyconf
    
  2. 配置

    配置这一块我用了宿主机的IP,使用127.0.0.1的话好像有问题。

      # プロキシ設定
      if Vagrant.has_plugin?("vagrant-proxyconf")
        config.proxy.http     = "http://192.168.1.103:8118"
        config.proxy.https    = "http://192.168.1.103:8118"
        config.proxy.no_proxy = "localhost,127.0.0.1,10.0.0.0/8"
      end
    

常见错误

  1. The executable ‘bsdtar’ Vagrant is trying to run was not found in the PATH variable.

    github上有 相关issue. 解决办法如下:

    apt install libarchive-tools
    
  2. dpkg: virtualbox-6.1: dependency problems, but configuring anyway as you requested

    由于依赖不满足,不让安装。强制安装再修复依赖即可。

    dpkg --force-depends -i virtualbox-6.1_6.1.18-142142_Debian_stretch_amd64.deb
    apt --fix-broken install -y
    

参考资料