[Linux]Ansible自動化運維① - 入門知識

SkyBiuBiu發表於2021-07-06

參考:

一、Ansible 概述

1.1 Ansible 是什麼

Ansible是一款由Python開發(由ParamikoPyYAML兩個關鍵模組構建)的自動化運維軟體,集合了“前輩”們的優點,實現了批量系統配置、批量程式部署、批量執行命令等功能。

1.2 Ansible 優勢

  • 安裝部署簡單,易學習
  • 輕量級控制端,支援多主機並行管理
  • 無需裝agent,基於SSH管理
  • 非root賬戶也可用

1.3 Ansible 特性

冪等性:同樣的條件,一次請求和重複的多次請求對系統資源的影響是一致的。

二、Ansible 入門

2.1 Ansible 架構

image-20210706165704875

元件 功能
Ansible 核心程式。
Host Inventory Ansible管理的主機資訊,包括IP地址、SSH埠號、賬號、密碼等。
Playbooks 劇本,格式為YAML格式,模組化定義一系列任務,供外部統一呼叫。
Plugins 外掛。
Custom modules 自定義模組,完成核心模組無法完成的功能。
Core modules 核心模組,Ansible自帶的。
Connection Plugins 連線外掛,建立Ansible與其他元件間的通訊(支援多種連線方式,不侷限於SSH)。
Ansible Galaxy 共享ansible role的平臺。

2.2 Ansible 安裝

先配置epel源(可以理解為更高階的yum源)

yum install -y epel-release

然後在控制端安裝ansible

yum install ansible

至此,ansible就安裝完成了。

2.3 Ansible 命令集

ansible:定義並執行簡單任務。

ansible-config:檢視、編輯、管理 Ansible 配置。

ansible-doc:文件檢視工具。

ansible-galaxy:分享Roles模組的官網平臺,需要網路。

ansible-playbook:執行playbook劇本。

ansible-pull:從倉庫拉取playbook。

ansible-vault:檔案加解密工具。

ansible-console:REPL控制檯執行 Ansible 任務。

2.4 Ansible 配置檔案

2.4.1 ansible.cfg 主配置檔案

預設放在/etc/ansible/ansible.cfg路徑下,常見引數:

#這個參數列示主機清單inventory檔案的位置
inventory = /etc/ansible/hosts
#放ansible模組的目錄,支援多個目錄,用冒號隔開
library = /usr/share/ansible
#併發連線數,預設為5
forks = 5
#預設執行命令的使用者,不建議用root
sudo_user = root
#連線埠,SSH預設為22,建議修改
remote_port = 22
#設定是否檢查SSH主機的金鑰
host_key_checking = False
#SSH連線超時的時間
timeout = 60
#放ansible日誌的路徑
log_path = /var/log/ansible.log

優先順序由上往下依次遞減:

  • ANSIBLE_CONFIG:環境變數指向的配置檔案

  • ./ansible.cfg:當前目錄下的配置檔案

  • ~/.ansible.cfg:當前使用者目錄下ansible配置檔案

  • /etc/ansible/ansible.cfg:包管理方式安裝生成的配置檔案

2.4.2 Inventory 主機清單

Inventory主機清單放在這:/etc/ansible/hosts

注意:寫主機名的時候,在 /etc/hosts 裡需要有記錄。

有三種寫法:

  1. 直接指名主機IP地址或主機名(全域性)。

    sky1.example.com
    sky2.example.com
    
  2. 定義組名,把主機IP地址或主機名加進去。

    [group1]
    sky1.example.com
    192.168.122.200
    [group2]
    sky2.example.com
    192.168.122.100
    
  3. 子組定義,關鍵字一定得是[xxx:children]。

    [sky:children]
    sky1.example.com
    sky2.example.com
    

2.5 Ansible 免密登陸被控端(SSH)

說明:控制端生成金鑰對並把公鑰傳送到被控端的機器上,在登陸時即可實現免密。

具體實現如下:

  • 控制端
#生成金鑰對,型別為rsa
ssh-keygen -t rsa
#傳送到被控端,可通過-p引數指定埠(生產環境中有可能預設SSH埠不是22)
ssh-copy-id ~/.ssh/id_rsa.pub 192.168.122.200

三、Ansible 任務執行模式

3.1 ad-hoc 命令列

ad-hoc:使用單個模組,支援批量執行單條命令。

ansible <主機或主機組> -m <模組名> -a '引數'
  • -m:選項指定模組名
  • -a:選項指定傳送的引數

3.2 playbook 劇本

Playbook:通過YAML語法定義多個task集合來完成管理。

3.3 程式執行流程

3.4 命令執行流程

  1. 載入配置檔案,預設/etc/ansible/ansible.cfg
  2. 通過Inventory清單,找到需要執行的主機或主機組。
  3. 載入要用到的模組。
  4. 通過ansible將模組或者命令生成對應的python指令碼,傳輸到遠端伺服器。
  5. 對應執行使用者家目錄的.ansible/tmp/xxx.py檔案
  6. 提權使用者執行該py檔案,並返回結果。
  7. 刪除py檔案,退出。

四、Ansible 常用模組

4.1 模組幫助

4.1.1 測試拓撲

image-20210706202242347

4.1.2 測試的Inventory

[root@vm1 ~]# cat /etc/ansible/hosts
[test]
192.168.122.200

4.1.3 常用模組幫助命令

ansible-doc -l:檢視所有內建模組

ansible-doc <模組名>:檢視模組名

ansible-doc -s <模組名>:檢視模組引數列表

4.1.4 命令前提(重要)

[root@vm1 ~]# ansible test -m ping 

192.168.122.200 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": false,
    "ping": "pong"
}

在這裡對test主機組進行ping測試,返回pong則是成功,這樣就可以開始執行下面的任務了。

4.2 命令列模組(command、shell)

4.2.1 command 模組

說明:在不通過-m引數指定模組的情況下,ad-hoc預設就是使用的command模組,這個模組不支援shell變數和管道等,如果想要使用,請使用-m引數指定shell模組。

  • 預設下,使用的是command模組,傳送命令。
[root@vm1 ~]# ansible test -m command -a "ping www.baidu.com -c 5"

192.168.122.200 | CHANGED | rc=0 >>
PING www.a.shifen.com (183.232.231.172) 56(84) bytes of data.
64 bytes from 183.232.231.172 (183.232.231.172): icmp_seq=1 ttl=127 time=12.8 ms
64 bytes from 183.232.231.172 (183.232.231.172): icmp_seq=2 ttl=127 time=12.7 ms
64 bytes from 183.232.231.172 (183.232.231.172): icmp_seq=3 ttl=127 time=11.10 ms
64 bytes from 183.232.231.172 (183.232.231.172): icmp_seq=4 ttl=127 time=14.9 ms
64 bytes from 183.232.231.172 (183.232.231.172): icmp_seq=5 ttl=127 time=12.3 ms

--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 12ms
rtt min/avg/max/mdev = 11.956/12.916/14.869/1.026 ms

4.2.2 shell 模組

說明:shell模組,支援管道和shell變數。

[root@vm1 ~]# ansible test -m shell -a "echo ${HOSTNAME}"

192.168.122.200 | CHANGED | rc=0 >>
vm1

4.2 檔案操作模組

4.2.1 file 模組

說明:file模組,可以進行對檔案的管理。

  • 建立資料夾:

    [root@vm1 /]# ansible test -m file -a "path=/tmp/file_test/ state=directory"
    
    192.168.122.200 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": true,
        "gid": 0,
        "group": "root",
        "mode": "0755",
        "owner": "root",
        "path": "/tmp/file_test/",
        "secontext": "unconfined_u:object_r:user_tmp_t:s0",
        "size": 6,
        "state": "directory",
        "uid": 0
    }
    
  • 建立檔案:

    [root@vm1 /]# ansible test -m file -a "path=/tmp/file_test/file1 state=touch"
    
    192.168.122.200 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": true,
        "dest": "/tmp/file_test/file1",
        "gid": 0,
        "group": "root",
        "mode": "0644",
        "owner": "root",
        "secontext": "unconfined_u:object_r:user_tmp_t:s0",
        "size": 0,
        "state": "file",
        "uid": 0
    }
    
  • 刪除檔案:

    [root@vm1 /]# ansible test -m file -a "path=/tmp/file_test/file1 state=absent"
    
    192.168.122.200 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": true,
        "path": "/tmp/file_test/file1",
        "state": "absent"
    }
    
  • 刪除資料夾:

    [root@vm1 /]# ansible test -m file -a "path=/tmp/file_test state=absent"
    
    192.168.122.200 | CHANGED => {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/libexec/platform-python"
        },
        "changed": true,
        "path": "/tmp/file_test",
        "state": "absent"
    }
    

4.2.2 copy 模組

說明:copy模組,指定src和dest可完成檔案複製

  • 複製/etc/hosts到/tmp/hosts
[root@vm1 ~]# ansible test -m copy -a "src=/etc/hosts dest=/tmp/hosts"

192.168.122.200 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    },
    "changed": true,
    "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
    "dest": "/tmp/hosts",
    "gid": 0,
    "group": "root",
    "md5sum": "54fb6627dbaa37721048e4549db3224d",
    "mode": "0644",
    "owner": "root",
    "secontext": "unconfined_u:object_r:admin_home_t:s0",
    "size": 158,
    "src": "/root/.ansible/tmp/ansible-tmp-1625579580.7383313-3373-17711169432251/source",
    "state": "file",
    "uid": 0
}

後面的放到②裡面寫,嘻嘻?️‍♂️

相關文章