Linux:綜合架構批量管理服務(ansible)--- 上


命令總結

ansible-playbook test.yaml --syntax-check  ## 執行腳本語法檢查
ansible-playbook test.yaml -C              ## 預執行腳本
ansible-playbook test.yaml                 ## 執行腳本
ansible-playbook test.yaml -v              ## 顯示執行腳本
ansible-playbook test.yaml -vv             ## 顯示執行腳本(更詳細,最多四個v,ansible-playbook test.yaml -vvvv)

00. 介紹部分

  1. ansible批量管理服務概念
  2. ansible批量管理服務特點
  3. ansible批量管理服務部署
  4. ansible批量管理服務應用---模塊應用
  5. ansible模塊命令語法
  6. ansible常用模塊

01. 知識回顧

  1. 遠程管理服務介紹
    ssh 數據加密 22
    telnet 數據明文 23

  2. SSH遠程管理服務工作原理
    私鑰 公鑰
    用途1: 對數據進行加密處理
    用途2: 對用戶訪問進行認證

  3. SSH遠程連接的方式
    a 基於口令的方式進行連接
    b 基於秘鑰的方式進行連接
    c 基於秘鑰連接的工作原理

         3.1 基於秘鑰的連接部署方式
        第一個歷程: 創建秘鑰對(管理端服務器)	
            ssh-keygen -t 秘鑰的類型(dsa|rsa)
        第二個歷程: 將公鑰進行分發(被管理端服務器)
            ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31
            如何批量分發公鑰:
            01. 需要輸入連接確認信息 yes/no
                ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 "-o StrictHostKeyChecking=no"
            02. 需要第一次連接輸入密碼
                yum install -y sshpass
                sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 "-o StrictHostKeyChecking=no"
            03. 遠程服務器SSH服務端口號改動了
                sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 -p 52113 "-o StrictHostKeyChecking=no" 
         3.2 基於秘鑰連接排錯思路:
            01. 利用命令進行連接測試
            02. 檢查公鑰在被管理主機上是否存在,並且與管理端公鑰信息是否相同
            03. 利用公鑰分發命令重新分發公鑰
            04. 檢查腳本的編寫
            05. 調試腳本功能   sh -x      
    
  4. SSH遠程服務防范入侵案例

  5. SSH服務的配置文件編寫
    監聽地址???

  6. SSH服務的相關命令總結

02. ansible批量管理服務介紹

ansible批量管理服務意義

  1. 提高工作的效率
  2. 提高工作准確度
  3. 減少維護的成本
  4. 減少重復性工作

ansible批量管理服務功能

  1. 可以實現批量系統操作配置
  2. 可以實現批量軟件服務部署
  3. 可以實現批量文件數據分發
  4. 可以實現批量系統信息收集

03. ansible批量管理服務部署

管理端服務器

第一個歷程: 安裝部署軟件

yum install -y ansible --- 需要依賴epel的yum源
/etc/ansible/ansible.cfg --- ansible服務配置文件
/etc/ansible/hosts --- 主機清單文件 定義可以管理的主機信息
/etc/ansible/roles --- 角色目錄???

第二個歷程: 需要編寫主機清單文件

vim /etc/ansible/hosts 

## 定義可以管理的主機信息,主機必須是已經完成秘鑰分發的,秘鑰分發腳本/server/scripts/fenfa_key_pub.sh
172.16.1.41
172.16.1.31
172.16.1.7

第三個歷程: 測試是否可以管理多個主機
腳本測試 hostname,注意需要先關閉selinux服務,負責會報錯

ansible all -a "hostname"
[root@m01 scripts]# ansible all -a "hostname"

顯示結果:

172.16.1.41 | CHANGED | rc=0 >>
backup

172.16.1.7 | CHANGED | rc=0 >>
web01

172.16.1.31 | CHANGED | rc=0 >>
nfs01

---參數-a ,-active或action,表示執行的動作

---參數all,表示所有管理的主機,可以替換為ansible 172.16.1.41,172.16.1.31 -a "hostname"

04. ansible服務架構信息

ansible基本架構圖示:

1) 主機清單配置 
2) 軟件模塊信息         OK  ---每個模塊只能完成一個功能
3) 基於秘鑰連接主機     OK		---使用ansible批量管理之前需要先完成ssh秘鑰分發認證
4) 主機需要關閉selinux  OK
5) 軟件劇本功能				---將多個模塊組合在一起即是劇本

05. ansible軟件模塊應用

ansible官方網站: https://docs.ansible.com/
模塊的應用語法格式:

ansible 主機名稱/主機組名稱/主機地址信息/all -m(指定應用的模塊信息) 模塊名稱 -a(指定動作信息) "執行什么動作"

命令類型模塊:


掌握第一個模塊: command (默認模塊)

command – Executes a command on a remote node
在一個遠程主機上執行一個命令
簡單用法:

[root@m01 scripts]# ansible 172.16.1.31 -m command -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01

擴展應用:

  1. chdir Change into this directory before running the command.
    在執行命令之前對目錄進行切換
ansible 172.16.1.31 -m command -a "chdir=/tmp touch oldboy.txt"
  1. creates If it already exists, this step won't be run.
    如果文件存在了,不執行命令操作;也就是判斷文件不存在時,執行后面的操作
ansible 172.16.1.31 -m command -a "creates=/tmp/hosts touch oldboy.txt"
  1. removes If it already exists, this step will be run.
    如果文件存在了, 這個步驟將執行
ansible 172.16.1.31 -m command -a "removes=/tmp/hosts chdir=/tmp touch oldboy.txt"
  1. free_form(required)
    The command module takes a free form command to run.
    There is no parameter actually named 'free form'. See the examples!
    使用command模塊的時候,-a參數后面必須寫上一個合法linux命令信息

注意事項:

有些符號信息無法識別: <", ">", "|", ";" and "&"

需要使用上述符號時,指定shell模塊,如

ansible 172.16.1.31  -m shell -a "cd /data; ls /data"

掌握第二個模塊: shell (萬能模塊)

在遠端運行,相當於在遠端的命令行
shell – Execute commands in nodes
在節點上執行操作

簡單用法:
[root@m01 scripts]# ansible 172.16.1.31 -m command -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01

擴展應用

  1. chdir Change into this directory before running the command.
    在執行命令之前對目錄進行切換
ansible 172.16.1.31 -m shell -a "chdir=/tmp touch oldboy.txt"
  1. creates If it already exists, this step won't be run.
    如果文件存在了,不執行命令操作
ansible 172.16.1.31 -m shell -a "creates=/tmp/hosts touch oldboy.txt" 
  1. removes If it already exists, this step will be run.
    如果文件存在了, 這個步驟將執行
ansible 172.16.1.31 -m shell -a "removes=/tmp/hosts chdir=/tmp touch oldboy.txt"
  1. free_form(required)
    The shell module takes a free form command to run.
    There is no parameter actually named 'free form'. See the examples!
    使用command模塊的時候,-a參數后面必須寫上一個合法linux命令信息

實踐應用: 利用shell執行腳本

第一個步驟: 編寫一個腳本

[root@m01 scripts]# cat yum.sh 
#!/bin/bash
yum install -y htop

第二個步驟: 將腳本發送到遠程主機

[root@m01 scripts]# scp -rp yum.sh 172.16.1.31:/server/scripts
yum.sh   
[root@m01 scripts]# ansible 172.16.1.31 -m command -a "ls /server/scripts/"
172.16.1.31 | CHANGED | rc=0 >>
backup.sh
yum.sh

第三個步驟: 將腳本權限進行修改(添加執行權限)

[root@m01 scripts]# ansible 172.16.1.31 -m shell -a "/server/scripts/yum.sh"
172.16.1.31 | FAILED | rc=126 >>
/bin/sh: /server/scripts/yum.sh: Permission deniednon-zero return code
[root@m01 scripts]# ansible 172.16.1.31 -m shell -a "chmod +x /server/scripts/yum.sh"

注意:[root@m01 scripts]# ansible 172.16.1.31 -m shell -a "sh /server/scripts/yum.sh"
不加權限也是可以可以執行的 

第四個步驟: 運行ansible命令執行腳本

[root@m01 scripts]# ansible 172.16.1.31 -m shell -a "sh /server/scripts/yum.sh"

掌握第三個模塊: script (萬能模塊)

在遠端節點上運行本地腳本,再將結果傳回本地

第一個步驟: 編寫一個腳本

[root@m01 scripts]# cat yum.sh 
#!/bin/bash
yum install -y htop

第二個步驟: 運行ansible命令執行腳本

[root@m01 scripts]# ansible 172.16.1.31 -m script -a "/server/scripts/yum.sh"
172.16.1.31 | CHANGED => {
 "changed": true, 
 "rc": 0, 
 "stderr": "Shared connection to 172.16.1.31 closed.\r\n", 
 "stderr_lines": [
     "Shared connection to 172.16.1.31 closed."
 ], ...
注意:使用腳本模塊時需要直接執行腳本,不能用以下命令
[root@m01 scripts]# ansible 172.16.1.31 -m script -a "sh /server/scripts/yum.sh"
172.16.1.31 | FAILED! => {
 "changed": false, 
 "msg": "Could not find or access 'sh'\nSearched in:\n\t/server/scripts/files/sh\n\t/server/scripts/sh\n\t./files/sh\n\t./sh on the Ansible Controller.\nIf you are using a module and expect the file to exist on the remote, see the remote_src option"
}

PS: scripts模塊參數功能和command模塊類似

文件類型模塊:


copy模塊

copy – Copies files to remote locations
將數據信息進行批量分發給遠程的多台主機

基本用法:

[root@m01 scripts]# ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/etc"
172.16.1.31 | CHANGED => {       --- 對哪台主機進行操作
"changed": true,             --- 是否對主機信息進行改變
"checksum": "6ed7f68a1d6b4b36c1418338b2001e421eeba270",---生成一個文件校驗碼=MD5數值
"dest": "/etc/hosts",        --- 顯示目標路徑信息  
"gid": 0,                    --- 顯示復制后文件gid信息
"group": "root",             --- 顯示復制后文件屬組信息
"md5sum": "7afd7b74854f0aaab646b3e932f427c0",           ---生成一個文件校驗碼=MD5數值
"mode": "0644",              --- 顯示復制后文件權限信息
"owner": "root",             --- 顯示復制后文件屬主信息
"size": 401,                 --- 顯示文件的大小信息
"src": "/root/.ansible/tmp/ansible-tmp-1557804498.23-26487341925325/source", 
"state": "file",             --- 顯示文件的類型信息
"uid": 0                     --- 顯示復制后文件uid信息
}

補充說明: ansible軟件輸出顏色說明:

1. 綠色信息:  查看主機信息/對主機未做改動
2. 黃色信息:  對主機數據信息做了修改
3. 紅色信息:  命令執行出錯了
4. 粉色信息:  忠告信息
5. 藍色信息:  顯示ansible命令執行的過程???

擴展用法:

  1. 在傳輸文件時修改文件的屬主和屬組信息
    [root@m01 rsync]# ansible 172.16.1.31 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ owner=oldboy group=oldboy"
    
  2. 在傳輸文件時修改文件的權限信息
    [root@m01 rsync]# ansible 172.16.1.31 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ mode=1777"
    
  3. 在傳輸數據文件信息時對遠程主機源文件進行備份
    [root@m01 rsync]# ansible 172.16.1.31 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ backup=yes"
    
  4. 創建一個文件並直接編輯文件的信息,不需要在管理端主機創建出文件
    [root@m01 rsync]# ansible 172.16.1.31 -m copy -a "content='oldboy123' dest=/etc/rsync.password"
    

PS:參數: remote_src directory_mode local_follow
參數: remote_src

1、If no, it will search for src at originating/master machine.
src參數指定文件信息,會在本地管理端服務進行查找,默認remote_src=no

[root@m01 rsync]# ansible 172.16.1.31 -m copy -a "src=/etc/rsync.password dest=/data  remote_src=yes"

2、If yes it will go to the remote/target machine for the src. Default is no.
src參數指定文件信息,會從遠程主機上進行查找

[root@m01 rsync]# ansible 172.16.1.31 -m copy -a "src=/etc/rsync.password dest=/data  remote_src=yes"
172.16.1.31 | CHANGED => {
...輸出信息省略...
}

PS: ansible軟件copy模塊復制目錄信息

ansible 172.16.1.31 -m copy -a "src=/oldboy dest=/oldboy"
src后面目錄沒有/: 將目錄本身以及目錄下面的內容都進行遠程傳輸復制

[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/oldboy dest=/oldboy"
172.16.1.31 | CHANGED => {
 "changed": true, 
 "dest": "/oldboy/", 
 "src": "/oldboy"
}
[root@nfs01 ~]# tree /oldboy/
/oldboy/
└── oldboy
 └── oldboy01
     ├── 01.txt
     ├── 02.txt
     ├── 03.txt
     └── oldboy02

3 directories, 3 files

ansible 172.16.1.31 -m copy -a "src=/oldboy/ dest=/oldboy"
src后面目錄有/: 只將目錄下面的內容都進行遠程傳輸復制

[root@m01 ~]# ansible 172.16.1.31 -m copy -a "src=/oldboy/ dest=/oldboy"
172.16.1.31 | CHANGED => {
 "changed": true, 
 "dest": "/oldboy/", 
 "src": "/oldboy/"
}
[root@nfs01 ~]# tree /oldboy/
/oldboy/
└── oldboy01
 ├── 01.txt
 ├── 02.txt
 ├── 03.txt
 └── oldboy02

2 directories, 3 files

file 模塊

– Sets attributes of files
設置文件屬性信息

基本用法:
ansible 172.16.1.31 -m file -a "dest=/etc/hosts owner=oldboy group=oldboy mode=666"

執行命令前:
[root@nfs01 ~]# ll /etc/hosts   
-rw-r--r-- 1 root root 397 Mar  4 09:20 /etc/hosts
執行命令:
[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/etc/hosts owner=oldboy group=oldboy mode=644"
172.16.1.31 | CHANGED => {
...輸出信息省略...
}
執行命令后:
[root@nfs01 ~]# ll /etc/hosts
-rw-r--r-- 1 oldboy oldboy 397 Mar  4 09:20 /etc/hosts
[root@nfs01 ~]# 

擴展用法:

  1. 可以利用模塊創建數據信息 (文件 目錄 鏈接文件)
    state 參數

=absent --- 缺席/刪除數據信息
=directory --- 創建一個目錄信息
=file --- 檢查創建的數據信息是否存在 綠色存在 紅色不存在
=hard --- 創建一個硬鏈接文件
=link --- 創建一個軟鏈接文件
=touch --- 創建一個文件信息
創建目錄信息:
ansible 172.16.1.31 -m file -a "dest=/oldboy/ state=directory"
ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy01/oldboy02/ state=directory"

[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy01/oldboy02 state=directory"
172.16.1.31 | CHANGED => {
...輸出信息省略...
}
[root@nfs01 ~]# tree /oldboy/
/oldboy/
└── oldboy01
    └── oldboy02

2 directories, 0 files

創建文件信息:

ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy.txt state=touch"

[root@m01 ~]# ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy01/ansible.txt state=touch"
172.16.1.31 | CHANGED => {
...輸出信息省略...
}
[root@nfs01 ~]# tree /oldboy/
/oldboy/
└── oldboy01
    ├── ansible.txt
    └── oldboy02

2 directories, 1 file

創建鏈接文件信息:

ansible 172.16.1.31 -m file -a "src=/oldboy/oldboy.txt dest=/oldboy/oldboy_hard.txt state=hard"
ansible 172.16.1.31 -m file -a "src=/oldboy/oldboy.txt dest=/oldboy/oldboy_link.txt state=link"

[root@m01 ~]# ansible 172.16.1.31 -m file -a "src=/oldboy/oldboy01/ansible.txt dest=/oldboy/ansible_hard.txt state=hard"
[root@m01 ~]# ansible 172.16.1.31 -m file -a "src=/oldboy/oldboy01/ansible.txt dest=/oldboy/ansible_soft.txt state=link"
172.16.1.31 | CHANGED => {
...輸出信息省略...
}
---hard---看iNode是否一致
[root@nfs01 oldboy]# find . -name "*txt" |xargs ls -li
101838199 -rw-r--r-- 2 root root 0 Mar  4 15:11 ./ansible_hard.txt
101838199 -rw-r--r-- 2 root root 0 Mar  4 15:11 ./oldboy01/ansible.txt
---soft---直接就能看出
[root@nfs01 oldboy]# ll
lrwxrwxrwx 1 root root 28 Mar  4 15:25 ansible_soft.txt -> /oldboy/oldboy01/ansible.txt
  1. 可以利用模塊刪除數據信息

ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy.txt state=absent"
ansible 172.16.1.31 -m file -a "dest=/oldboy/ state=absent"

自行研究: recurse --- 相當於參數-R,遞歸,如遞歸修改文件目錄及目錄下所有文件的權限

默認resurse=no

預習:

  1. 預習幾個新的模塊:
    yum service cron mount user group unarchive archive

  2. 預習劇本的編寫格式


免責聲明!

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



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