運維必會:基於 Ansible 的 Docker 自動化部署,小白也能看懂?

Linksla發表於2024-01-31

Ansible 是一個 Python 寫的自動化工具,這個工具可以實現叢集自動化管理,然後進行一些常用的運維操作。


現在的公司很多都是使用的叢集部署服務,少則幾臺虛擬機器,多則幾百上千臺虛擬機器,有的時候需要對一個叢集或者多個叢集集中進行運維操作,那麼這個時候,Ansible 就可以實現批次操作了。

我在公司主要負責的任務就是關於服務的自動化部署和運維,公司本身就屬於雲服務,而且非常多,所以部署的方式也有很多種版本,我接觸到的自動化平臺主要包括一下幾種:

  1. 以 Ansible 指令碼為主導而搭建的自動化部署升級平臺

  2. 以類似 Jenkins 流水線而搭建的自動化構建和部署平臺

  3. 以 SDK 包為基礎,以 Python 指令碼執行主導的運維平臺

  4. Docker 容器+編排


本文分享一下使用 ansible 自動化安裝 docker 和 docker-compose 的經驗。

1、安裝ansible

ansible 的管理機必須安裝 python2,但是有個非常重要的點,那就是 Windows 不可以當做管理機,主機系統可以是 Red Hat, Debian, CentOS, OS X, BSD 的各種版本。

使用pip安裝

由於 ansible 是一個 python 寫的包,所以可以直接當做一個普通的第三方庫來安裝,直接執行命令安裝即可:

sudo pip install ansible

使用yum或者apt-get安裝

ansible 也可以直接使用系統的包管理工具來安裝,比如 CentOS 的 yum 命令:

sudo yum install ansible

Ubuntu 系統的 apt-get 命令:

sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible

2、Ansible基本用法

使用 ansible-playbook

ansible-playbook 也稱之為劇本,是 ansible 把一系列自動化操作按照一定的執行順序和執行邏輯進行組合起來的模組,使用這個模組可以更加方便地管理 ansible 任務。

ansible-playbook 命令可以作為執行一個 ansible 任務的開始,具體如何使用,可以檢視幫助,下面這條是一般啟動命令:

ansible-playbook docker.yml -i hosts -u alex -k -K

這個命令可以指定一個操作的使用者,後續需要輸入使用者的密碼和sudo命令。

由於 ansible 有很多非常有用的模組和命令可以使用,但是沒有人能夠全部記住每個模組命令,但是 ansible 有一個非常有用的命令使用查詢文件,直接使用命令就可以檢視某個模組的用法,還有例子:

    
    # 列出所有模組
    
    ansible-doc -l
    
    
    
    # 列出yum模組的使用方式 ansible-doc yum

    ansible-playbook 目錄結構

    下面是一個 ansible-playbook 專案的基本目錄結構,具體的目錄和檔案作用已經註釋出來:

    ├── group_vars           
    <- 所有主機的公共變數存放位置
    │   └── all├── hosts                <- 需要管理的主機的列表資訊
    ├── roles              <- roles 存放模組, 當前有 etcd, initial, loop 三個模組
    │   ├── etcd│   
    │   ├── files                    <- 需要直接複製到 client 的檔案存放位置
    │   │   │   └── etcd-proxy.service            <--即每個主機配置一樣
    │   │   ├── handlers                     <- 用於服務管理用的控制檔案
    │   │   │   └── main.yml
    │   │   ├── tasks                        <- ansible 任務檔案
    │   │   │   ├── config.yml
    │   │   │   ├── main.yml
    │   │   │   ├── package.yml
    │   │   │   └── service.yml
    │   │   └── templates                <- 需要複製到 client 中的模板檔案, 會配合變數進行配置變換
    │   │       └── etcd-proxy.conf       <-- 即每個主機配置可能不一樣
    │   ├── initial
    │   │   ├── files
    │   │   │   ├── hosts
    │   │   │   ├── resolv.conf
    │   │   │   └── updatedb.conf
    │   │   ├── handlers
    │   │   ├── tasks
    │   │   │   ├── main.yml
    │   │   │   ├── mlocate.yml
    │   │   │   ├── package.yml
    │   │   │   ├── sysctl.yml
    │   │   │   └── yumrepo.yml
    │   │   └── templates
    │   │       ├── centos7.repo
    │   │       └── docker.repo
    │   └── loop
    │       ├── files
    │       ├── handlers
    │       ├── tasks
    │       │   ├── main.yml
    │       │   └── t1.yml
    │       └── templates└── site.yml                           <- 主控制入口檔案

    ansible 安裝 docker

    我寫了一個使用 ansible 自動化安裝 docker 的劇本

    專案地址:

    適合於在 CentOS 系統上面執行 docker 的安裝。這個劇本做的事情包括判斷 docker 是否可以用,然後包括安裝 docker,新增使用者到 docker 組,安裝pip 和 docker-compose 等。劇本目錄如下:

    儘量使用內建模組

    所謂儘量使用內建模組的意思是當可以使用 shell 模組執行命令也可以使用內建的模組執行命令的時候應該儘量使用內建模組,比如下面這種,前面一種是使用命令列來安裝包,後面一種是直接使用 yum 模組:

      
      # 使用shell 命令列安裝
      
      - name: install yum-utils
      
        shell: yum install yum-utils
      
      
      
      # 使用yum 模組安裝 - name: install yum-utils yum: name: yum-utils state: present

      還有下面這種直接使用pip模組的:

        - name: install docker-compose  pip:    
        name: docker-compose    
        extra_args: "-i {{ pip.index_url }} 
        --trusted-host {{ pip.trusted_host }}"

        register+when的使用

        register 可以用來把一個步驟的執行結果賦值到一個變數中,而 when 就可以用來判斷一個變數的結果,所以通常可以把這兩個模組結合起來使用。比如下面這段,第一個步驟是使用 docker -v 命令查詢 docker 版本,然後第二個步驟判斷當 docker 不可用的時候就執行 docker 安裝。

          
          - name: check docker
          
            shell: docker -v
          
            register: result
          
            ignore_errors: True
          
          
          
          - name: include tasks yaml if not docker include_tasks: install.yml when: result is failed

          執行結果

          來源:https://cloud.tencent.com/developer/article/2123531


          來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70013542/viewspace-3005864/,如需轉載,請註明出處,否則將追究法律責任。

          相關文章