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


參考:

一、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 -i ~/.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
}

后面的放到②里面寫,嘻嘻🕵️‍♂️


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM