任務中心之Ansible基礎篇

Kubernetes技術棧發表於2021-10-22
  • 基礎篇與進階篇主要是為了基於AnsibleAPI二次開發 任務中心 做墊鋪,並非官方使用文件,可能會有所遺漏,如有不足之處,歡迎拍磚指正,謝謝。
  • 基於AnsibleAPI二次開發任務中心已經開發完成,並且已經投入生產使用,後續會把詳細的設計思路與具體架構分享給大家,敬請期待。
  • 為了方便大部分同學更好的瞭解Ansible的高階功能與特性,僅以此篇文章指引大家循序漸進的系統學習Ansible,將Ansible的高階功能以及特性發揮到淋漓盡致。

ansible 簡介:

Anasible 是基於Python2-Paramiko 模組開發的自動化維護工具,實現了批量系統配置、部署、執行等功能。Ansible是基於模組工作的,本身不具備批量部署的功能,如果想要實現批量自動化部署,是Ansible自身的各種模組的集合。

可以與 Ansible 同臺競技的運維工具( pupet、cfengine、chef、func、fabric、saltstack )

  • Ansible 發展史

    • ansible 作者: Michael DeHaan 同時他也是 Cobbler 與 Func 作者。
    • 2012-03-09 釋出 0.0.1 版本。
    • 2015-10-17 被 Red Hat 收購。
    • GitHub
  • ansible 特性

    • Python 開發
    • 模組化: 呼叫特定的模組(如: Paramiko、PyYAML、jinja2 等), 完成特定的任務。
    • 自定義模組
    • 簡單部署
    • 支援編排任務(PlayBook)
    • 冥等性: 任務重複執行等於只執行一次, 不會重複執行多次相同命令。
    • 支援多語言編寫模組
    • YAML 格式編排任務,支援豐富的資料結構.

Ansible 架構與執行流程

ansible-arch

ansible-flow

ansible 主要組成部分:

  • Users: 管理 Ansible Playbook 和 Ansible 引擎。
  • Ansible playbook: Ansible 引擎和CMDB做互動。
  • Public or Private cloud: 便於所有模組 和 API 以及雲的互動。
  • Inventory: Ansible 執行主機的列表清單,預設讀取配置為/etc/ansible/hosts。
  • API: 提供端到端互動的API介面。
  • Modules: Ansible 執行命令的功能模組, 一般為 Ansible 內建模組, 也可以自定義第三方模組。
  • Plugins: 用於補充模組的功能,可以自行編寫外掛。

Ansible 安裝

# Centos
yum -y install ansible

# Ubuntu
apt install -y ansible

# 原始碼安裝
git clone https://github.com/ansible/ansible 

# 使用 pip 命令安裝
pip install ansible

Ansible 配置說明:

/etc/ansible/ansible.cfg 主配置檔案, 配置ansible的工作特性.

/etc/ansible/hosts 主機列表清單.

/etc/ansible/roles/ 存放(roles)角色的目錄.

/usr/local/bin/ansible 二進位制執行檔案, ansible 主程式.

/usr/local/bin/ansilbe-doc 配置文件, 模組功能檢視工具.

/usr/local/bin/ansible-galaxy 用於上傳/下載 roles 模組到官方平臺的工具.

/usr/local/bin/ansible-playbook 自動化任務、編排劇本工具/usr/bin/ansible-pull 遠端執行命令的工具.

/usr/local/bin/ansible-vault 檔案(如: playbook 檔案) 加密工具.

/usr/local/bin/ansible-console 基於 介面的使用者互動執行工具.

/etc/ansible/hosts

建立SSH祕鑰

ssh-keygen -t rsa -C "deniss.wang"

拷貝公鑰到其他被伺服器

ssh-copy-id -i ubuntu@ubuntu20-bj01

hosts

[codo-cluster]
demo.opendevops.cn ansible_ssh_user=root
www.opendevops.cn ansible_ssh_user=root
[k3s-cluster]
ubuntu20-bj01 ansible_user=ubuntu
ubuntu20-bj02 ansible_user=ubuntu
ubuntu20-bj03 ansible_user=ubuntu
ubuntu20-sh04 ansible_user=ubuntu

-m 指定模組執行。 如:ping、yum、copy、file等,此處使用模組ping測試。

-k 使用密碼方式,預設是使用SSH-KEY登入。

基本示例:

# ansible 通過 單主機進行操作 ( -k 為使用者密碼方式, 預設為 ssh-key )
ansible 10.0.8.2 -m ping -k

# ansible 通過 ':' 組合進行操作
ansible "10.0.8.2:10.0.8.3" -m ping -k

# ansible 通過 萬用字元加主機 進行操作
ansible 10.0.8.* -m ping -k

# ansible 通過 hosts 組名稱 進行操作
ansible codo -m ping -k

# ansible 通過 ':' 組合組進行操作
ansible 'codo-cluster:k3s-cluster' -m ping -k

# ansible 通過 萬用字元 進行操作
ansible '*-cluster' -m ping -k

# ansible 通過 ':&' 邏輯與 (兩個組中都包含的主機)
ansible 'codo-cluster:&k3s-cluster' -m ping -k

# ansible 通過 ':!' 邏輯非 (codo-cluster 但不在 k3s-cluster的主機)
ansible 'codo-cluster:!k3s-cluster' -m ping -k

# ansible 也支援多邏輯的組合
ansible 'webservers:dbserver:&appserver:!ftpservers' -m ping -k

# ansible 也支援正規表示式
ansible '~(codo|k3s)-cluster' -m ping -k

# ansible 通過 all 對 hosts 清單下所有主機進行操作
ansible all -m ping -k

# ansible 通過 萬用字元 對 hosts 清單下所有主機進行操作
ansible '*' -m ping -k

執行結果:

# ansible k3s -m 'ping'                                                                                     
ubuntu20-bj03 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
ubuntu20-bj02 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
ubuntu20-bj01 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
ubuntu20-sh04 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

/etc/ansible/ansible.cfg

# defaults 為預設配置
[defaults]

# 主機清單的路徑, 預設為如下
# inventory = /etc/ansible/hosts

# 模組存放的路徑 
# library = /usr/share/my_modules/

# utils 模組存放路徑
# module_utils = /usr/share/my_module_utils/

# 遠端主機指令碼臨時存放目錄
# remote_tmp = ~/.ansible/tmp

# 管理節點指令碼臨時存放目錄 
# local_tmp = ~/.ansible/tmp

# 外掛的配置檔案路徑
# plugin_filters_cfg = /etc/ansible/plugin_filters.yml

# 執行併發數
# forks = 5

# 非同步任務查詢間隔 單位秒
# poll_interval  = 15

# sudo 指定使用者
# sudo_user = root

# 執行 ansible 是否提示輸入sudo密碼
# ask_sudo_pass = True

# 執行 ansible 是否提示輸入密碼 同 -k
# ask_pass = True

# 遠端傳輸模式
# transport = smart

# SSH 預設埠
# remote_port = 22

# 模組執行預設語言環境
# module_lang = C

# roles 存放路徑
# roles_path = /etc/ansible/roles

# 不檢查 /root/.ssh/known_hosts 檔案 建議取消
# host_key_checking = False

# ansible 操作日誌路徑 建議開啟
# log_path = /var/log/ansible.log

ansible執行過程

  1. load配置檔案 /etc/ansible/ansible.cfg
  2. Load 模組配置檔案
  3. 通過 Ansible 將呼叫的模組或PlayBook生成對應的臨時 py檔案, 並將該臨時檔案傳輸至遠端伺服器的對的執行使用者目錄下 $HOME/.ansible/tmp/ansible-tmp-2123/xxxxxxx.py >檔案.
  4. 對生成的檔案新增可執行許可權.
  5. 執行生成檔案,並返回對應的結果.
  6. 刪除生成檔案,退出.

    執行返回狀態:

    • 綠色:執行成功,無更改操作。如 ping模組
    • 黃色:執行成功,更新過主機的操作。如執行shell模組執行ifconfig命令。
    • 紅色:執行失敗返回結果。 如FAILED、UNREACHABLE狀態。

Ansible-Doc

顯示幫助資訊

使用引數:

-l --list 顯示可用模組

-s --snippet 顯示指定模組的 playbook 階段

Demo

# Demo
ansible-doc -l
# ...略過
ansible-doc ping
# 模組ping顯示文件
ansible-doc -s ping

Ansible

ansible <host-pattern> [-m module_name] [-a args]

  • host-pattern: 主機ip、主機名、主機組。
  • module_name: 模組的名稱。預設為 -m command
  • args: 模組的引數, 需要加上 -a 進行指定模組的引數。如: `ansible all -a ‘hostname’
  • -v、-vv、-vvv: 顯示詳細的命令輸出日誌, v 越多越詳細。如: ansible all -m ping -vvv
  • --list: 顯示主機的列表。 如: ansible all --list
  • -k / --ask-pass: 提示輸入ssh連線密碼, 預設為 ssh-key 認證。如: ansible all -m ping -k
  • -K / --ask-become-pass: 提示輸入 sudo 的密碼。
  • -C / --check: 檢查命令操作, 並不會執行。如: ansible all -m ping -C
  • -T / --timeout: 執行命令的超時時間, 預設為 10s。如: ansible all -m ping -T=2
  • -u / --user: 執行遠端操作的使用者. 如: ansible all -m ping -u=root
  • -b / --become: 代替舊版的 sudo 切換。

ansible 常用模組

截止 2021-10-12 ansible 模組為 6006 個. 不可謂不強大!人生苦短,我用Python!

command 模組

在遠端主機上執行命令, 支援條件判斷. ansible 預設模組, 可忽略 -m 引數直接操作.

注意: command 模組 不支援 $VARNAME < > | ; & 等符號.

Demo

# 停止docker服務

ansible k3s-cluster -m command -a 'systemctl stop docker'

# 檢視所有docker映象

ansible k3s-cluster -a 'docker ps -a'

# 如果 /opt/ansible 不存在 就不執行 df -h 操作, 如果 /opt/ansible 存在, 就執行 df -h 操作.

ansible k3s-cluster -a 'removes=/mnt/ansible df -h'


# 如果 /opt/ansible 不存在 就執行 df -h 操作, 如果存在 /opt/ansible 就不執行 df -h 操作.

ansible k3s-cluster -a 'creates=/mnt/ansible df -h'

# 切換目錄, 等同於 cd /mtn && ls -lt 操作

ansible k3s-cluster -a 'chdir=/mnt ls -lt'

shell 模組

shell 模組: shell 模組支援 command 所有的操作, 而且支援 $VARNAME < > | ; & 等符號操作.

Demo:

# 檢視docker程式
ansible k3s-cluster -m shell -a 'ps -ef|grep docker'

scripts 模組

script 模組: 執行指令碼. 只需要呼叫 ansible 的宿主機存放的指令碼檔案就可以在選擇主機上面執行指令碼.

Demo

# shell
cat /tmp/deniss.sh                                                                                                                               
#!/bin/bash
echo "測試 shell"
ansible k3s-cluster -m script -a '/tmp/deniss.sh'

# python
cat /tmp/deniss.py
#!/usr/bin/python
import sys

print ('Deniss_Wang' )
print (sys.version)
ansible k3s-cluster -m script -a '/tmp/deniss.py'

# 其他指令碼也是可以的,只需要配置好環境語言解釋即可。 

copy 模組

copy 模組: 複製ansible宿主機檔案到目標主機.

Demo

# src="" 宿主機路徑 dest="" 目標主機路徑 backup=yes 如果目標主機檔案存在, 會備份, 再覆蓋.
ansible k3s-cluster -m copy -a ‘src=/tmp/deniss.py dest=/tmp/deniss.py backup=yes

# mode="" 修改許可權, owner="" 修改使用者, group="" 修改使用者組
ansible k3s-cluster -m copy -a 'src=/root/deniss.py dest=/root/deniss.py mode=0644 owner=deniss group=deniss'

# content="" 將內容寫入到目標檔案中
ansible k3s-cluster -m copy -a 'content="hello\nworld\n" dest=/tmp/deniss.txt'

Fetch 模組

fetch 模組: 將目標遠端主機的檔案, 下載到本地, 下載成功會存放在以 IP/NAME的目錄中, 包含原檔案的整體路徑.

注意:只能下載單個檔案, 不支援目錄, 想下載完整路徑,可以壓縮後在下載。

Demo

# src="" 目標遠端主機的檔案路徑 dest="" 本地目錄
ansible k3s-cluster -m fetch -a 'src=/var/log/syslog dest=/tmp/'

file 模組

file 模組: 操作遠端目標主機的檔案. 如: touchabsent 等.

Demo

# mode="" 修改許可權 owner="" 修改使用者 group="" 修改使用者組 recurse=yes 遞迴授權
ansible k3s-cluster -m file -a 'name=/tmp/deniss.txt owner=ubuntu group=ubuntu mode=0755 recurse=yes'

# dest、name、path: 指定遠端主機的檔案路徑,state: 檔案操作型別,預設為 absent,touch: 建立空檔案. 
ansible k3s-cluster -m file -a 'name=/tmp/deniss.txt state=touch'

# directory: 建立資料夾, absent: 遞迴刪除資料夾/檔案,link: 建立軟連線.
ansible k3s-cluster -m file -a 'src=/tmp/deniss.txt dest=/tmp/deniss.link state=link'

Cron 模組

cron 模組: 為遠端主機新增定時任務

  • day: 表示 天. 支援 ( 1-31, , /2 ) 寫法
  • hour: 表示 小時. 支援 ( 0-23, , /2 ) 寫法
  • minute: 表示 分鐘. 支援 ( 0-59, , /2 ) 寫法
  • month: 表示 月. 支援 ( 1-12, , /2 ) 寫法
  • weekday: 表示 星期. 支援 ( 0-6, Sunday-Saturday, * )寫法
  • job: 表示 計劃任務的內容.
  • name: 表示 計劃任務名稱. 相同的計劃任務名稱會覆蓋.

Demo

# day: 表示 天. 支援 ( 1-31, *, */2 ) 寫法
# hour: 表示 小時. 支援 ( 0-23, *, */2 ) 寫法
# minute: 表示 分鐘. 支援 ( 0-59, *, */2 ) 寫法
# month: 表示 月. 支援 ( 1-12, *, */2 ) 寫法
# weekday: 表示 星期. 支援 ( 0-6, Sunday-Saturday, * )寫法
# job: 表示 計劃任務的內容.
# name: 表示 計劃任務名稱. 相同的計劃任務名稱會覆蓋.
ansible k3s-cluster -m cron -a 'weekday=1-5 job="echodate>> /tmp/1.txt" name=echocron'

# disabled= (true/false、yes/no)註釋掉計劃任務 關閉、啟動計劃任務 必須指定job和name.
ansible k3s-cluster -m cron -a 'disabled=true job="echodate>> /root/1.txt" name=echocron'

# state=absent 刪除計劃任務。
ansible k3s-cluster -m cron -a 'name=echocron state=absent'

Yum 模組

yum 模組: 利用 yum 操作軟體包, 如 安裝、查詢、解除安裝等.

Demo

# name: 軟體包的名稱, 或者rpm包, 遠端伺服器必須存在 rpm 包. 安裝多個軟體使用 , 號隔開. 如 name=nginx,php,mysql

# state="present/installed/absent/removed"
# present、installed: 安裝軟體.
# absent、removed: 解除安裝/刪除軟體.
# update_cache=yes: 更新 yum 快取後 在安裝軟體 disable_gpg_check=yes: 禁用 gpg 檢查.
ansible k3s-cluster -m yum -a 'name=mysql state=present'
ansible k3s-cluster -m yum -a 'name=/tmp/nginx-xx.x.x-x.x.x86_64.rpm'
ansible k3s-cluster -m yum -a 'name=nginx update_cache=yes disable_gpg_check=yes'

# list="updates/installed/available/repos" 指定獲取狀態
# 狀態釋義: installed: 已安裝的軟體 updates: 可以升級的軟體 available: 可以安裝的軟體 repos: yum 源
ansible k3s-cluster -m yum -a 'list=installed'

Service 模組

service: 軟體服務管理模組. 啟動、關閉、重啟 等操作.

# name="",安裝名字 
# state="started/stopped/restarted/reloaded" 啟動、停止、重啟、過載
# enable="yes/no、true/false" 設定是否開機自啟
ansible k3s-cluster -m service -a 'name=nginx state=started enabled=yes'

User 模組

user: 管理系統使用者的模組

Demo

# name"" 使用者名稱
# shell="" 指定使用者的shell型別
# system="yes/no" 指定是否為 系統使用者
# home="" 指定使用者額外的home目錄, 預設/home/user .
# groups="" 使用者額外的 groups 組.
# uid="" 指定使用者的UID.
# comment="" 使用者描述
ansible k3s-cluster -m user -a 'name=deniss shell=/sbin/nologin system=yes home=/tmp/deniss groups=root uid=777 comment="deniss user"'
# state="present/absent" 
# present: 建立使用者 (預設為present) absent: 刪除使用者
ansible k3s-cluster -m user -a 'name=deniss state=absent remove=yes'
ansible k3s-cluster -m user -a 'name=nginx state=absent remove=yes'

Group 模組

group: 管理系統使用者組的模組.

Demo

# name"" 使用者名稱
# system="yes/no" 指定是否為 系統使用者
# home="" 指定使用者額外的home目錄, 預設/home/user .
# gid="" 指定GID.
# state="present/absent" 
# present: 建立使用者組 (預設為present) absent: 刪除使用者組
# 建立
ansible all -m group -a 'name=deniss system=yes gid=777'
# 刪除
ansible all -m group -a 'name=deniss state=absent'

ansible-galaxy

官網 https://galaxy.ansible.com/

ansible-galaxy 工具用於下載對應的roles

# list 檢視本地的 roles 角色。
ansible-galaxy list geerlingguy.nginx

# install 下載 roles 角色存放到$HOME/.ansible/roles/目錄下。
ansible-galaxy install geerlingguy.nginx

# remove 刪除已下載的 roles 角色,也可以在存放目錄總刪除。
ansible-galaxy remove geerlingguy.nginx

附上幾張已經開發完成的任務中心截圖,歡迎拍磚!

task

task

task

task

在基於DevOps思想對自動化運維改革的大道上,一直砥礪前行,從未停歇。

道阻且長,行則將至,行而不輟,未來可期。

歡迎搜尋 k8stech 關注公眾號,定時更新運維開發、SRE、雲原生等文章。

相關文章