批量部署工具Ansibale筆記

自動化運維

批量部署工具Ansibale筆記

QQ截圖20180528203202

? Ansibale簡介

? ? ansible是新出現的自動化運維工具,基于Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
? ? ansible是基于模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:
? ? (1)、連接插件connection plugins:負責和被監控端實現通信;
? ? (2)、host inventory:指定操作的主機,是一個配置文件里面定義監控的主機;
? ? (3)、各種模塊核心模塊、command模塊、自定義模塊;
? ? (4)、借助于插件完成記錄日志郵件等功能;
? ? (5)、playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。

? Ansibale安裝

? ? ansibale安裝是基于EPEL源,需要聯網下載很多插件及依賴包,因此,需要配置好EPEL源之后再執行:yum install ansible 。? ? 確認安裝: ansible –version

 

? 相關文件了解

配置文件

/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性

/etc/ansible/hosts 主機清單

/etc/ansible/roles/ 存放角色的目錄

 

程序

/usr/bin/ansible 主程序,臨時命令執行工具

/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具

/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺

/usr/bin/ansible-playbook 定制自動化任務,編排劇本工具/usr/bin/ansible-pull 遠

程執行命令的工具

/usr/bin/ansible-vault 文件加密工具

/usr/bin/ansible-console 基于Console界面與用戶交互的執行工具

 

Inventory 主機清單

ansible的主要功用在于批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中將其分組命名

默認的inventory file為/etc/ansible/hosts

inventory file可以有多個,且也可以通過Dynamic Inventory來動態生成

inventory文件遵循INI文件風格,中括號中的字符為組名。可以將同一個主機同時歸并到多個不同的組中;此外,當如若目標主機使用了非默認 的SSH端口,還可以在主機名稱之后使用冒號加端口號來標明

ntp.magedu.com

[webservers]

www1.magedu.com:2222

www2.magedu.com

[dbservers]

db1.magedu.com

db2.magedu.com

db3.magedu.com

如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機

示例:

[websrvs]

www[01:100].example.com

[dbsrvs]

db-[a:f].example.com

 

Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默認)

[defaults]

#inventory = /etc/ansible/hosts # 主機列表配置文件

#library = /usr/share/my_modules/ # 庫文件存放目錄

#remote_tmp = $HOME/.ansible/tmp #臨時py命令文件存放在遠程主機目錄

#local_tmp = $HOME/.ansible/tmp # 本機的臨時命令執行目錄

#forks = 5 # 默認并發數

#sudo_user = root # 默認sudo 用戶

#ask_sudo_pass = True #每次執行ansible命令是否詢問ssh密碼

#ask_pass = True

#remote_port = 22

#host_key_checking = False # 檢查對應服務器的host_key,建議取消注釋

#log_path=/var/log/ansible.log #日志文件

? ansible參數

ansible通過ssh實現配置管理、應用部署、任務執行等功能,建議配置ansible端能基于密鑰認證的方式聯系各被管理節點

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

–version 顯示版本

-m module 指定模塊,默認為command

-v 詳細過程 –vv -vvv更詳細

–list-hosts 顯示主機列表,可簡寫-list

-k, –ask-pass 提示連接密碼,默認Key驗證

-K, –ask-become-pass 提示輸入sudo

-C, –check 檢查,并不執行

-T, –timeout=TIMEOUT 執行命令的超時時間,默認10s

-u, –user=REMOTE_USER 執行遠程執行的用戶

-b, –become 代替舊版的sudo 切換

? ansible的Host-pattern

匹配主機的列表

All :表示所有Inventory中的所有主機

ansible all –m ping

* :通配符

ansible “*” -m ping

ansible 192.168.1.* -m ping

ansible “*srvs” -m ping

或關系

ansible “websrvs:appsrvs” -m ping

ansible “192.168.1.10:192.168.1.20” -m ping

ansible的Host-pattern

邏輯與

ansible “websrvs:&dbsrvs” –m ping

在websrvs組并且在dbsrvs組中的主機

邏輯非

ansible ‘websrvs:!dbsrvs’ –m ping

在websrvs組,但不在dbsrvs組中的主機

綜合邏輯

ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping

正則表達式

ansible “websrvs:&dbsrvs” –m ping

ansible “~(web|db).*\.magedu\.com” –m ping

? ansible命令執行過程

ansible命令執行過程

1. 加載自己的配置文件 默認/etc/ansible/ansible.cfg

2. 加載自己對應的模塊文件,如command

3. 通過ansible將模塊或命令生成對應的臨時py文件,并將該 文件傳輸至遠程服務器的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件

4. 給文件+x執行

5. 執行并返回結果

6. 刪除臨時py文件,sleep 0退出

執行狀態:

綠色:執行成功并且不需要做改變的操作

黃色:執行成功并且對目標主機做變更

紅色:執行失敗

ansible使用示例

示例:

以wang用戶執行ping存活檢測

ansible all -m ping -u wang -k

以wang sudo至root執行ping存活檢測

ansible all -m ping -u wang –b -k

以wang sudo至mage用戶執行ping存活檢測

ansible all -m ping -u wang –b -k –become-user mage

以wang sudo至root用戶執行ls

ansible all -m command -u wang –become-user=root -a ‘ls /root’ -b –k

? ansible常用13個模塊示例

Command:在遠程主機執行命令,默認模塊,可忽略-m選項

ansible srvs -m command -a ‘service vsftpd start’

ansible srvs -m command -a ‘echo magedu |passwd –stdin wang’ 不成功

此命令不支持 $VARNAME < > | ; & 等,用shell模塊實現

Shell:和command相似,用shell執行命令

ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’

調用bash執行命令 類似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &>/tmp/example.txt 這些復雜命令,即使使用shell也可能會失敗, 解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器

Script:運行腳本

-a “/PATH/TO/SCRIPT_FILE“

snsible websrvs -m script -a f1.sh

Copy:從服務器復制文件到客戶端,

ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600backup=yes”

如目標存在,默認覆蓋,此處指定先備份

ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt” 利用內容,直接生成目標文件

Cron:計劃任務

支持時間:minute,hour,day,month,weekday

ansible srv -m cron -a “minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’name=Synctime” 創建任務

ansible srv -m cron -a ‘state=absent name=Synctime’ 刪除任務

ansible srv -m cron -a ‘disabled=true ?job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime’禁用任務

Fetch:從客戶端取文件至服務器端,copy相反,目錄可先tar

ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’

File:設置文件屬性

ansible srv -m file -a “path=/root/a.sh owner=wang mode=755“

ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’

Hostname:管理主機名

ansible node1 -m hostname -a “name=websrv”

Yum:管理包

ansible srv -m yum -a ‘name=httpd state=latest’ 安裝

ansible srv -m yum -a ‘name=httpd state=absent’ 刪除

Service:管理服務

ansible srv -m service -a ‘name=httpd state=stopped’

ansible srv -m service -a ‘name=httpd state=started’

ansible srv –m service –a ‘name=httpd state=reloaded’

ansible srv -m service -a ‘name=httpd state=restarted’

User:管理用戶

ansible srv -m user -a ‘name=user1 comment=“test user” uid=2048 home=/app/user1 group=root‘

ansible srv -m user -a ‘name=sysuser1 system=yes home=/app/sysuser1 ’

ansible srv -m user -a ‘name=user1 state=absent remove=yes‘

刪除用戶及家目錄等數據

Group:管理組

ansible srv -m group -a “name=testgroup system=yes“

ansible srv -m group -a “name=testgroup state=absent”

? ansible系列命令

ansible-galaxy

連接 https://galaxy.ansible.com 下載相應的roles

列出所有已安裝的galaxy

ansible-galaxy list

安裝galaxy

ansible-galaxy install geerlingguy.redis

刪除galaxy

ansible-galaxy remove geerlingguy.redis

ansible-pull

推送命令至遠程,效率無限提升,對運維要求較高

Ansible-playbook

ansible-playbook hello.yml ??//執行劇本

cat hello.yml

#hello world yml file

– ?hosts: websrvs

remote_user: root

tasks:

– ?name: hello world

command: /usr/bin/wall hello world

? Ansible-vault

功能:管理加密解密yml文件

ansible-vault [create|decrypt|edit|encrypt|rekey|view]

ansible-vault encrypt hello.yml 加密

ansible-vault decrypt hello.yml 解密

ansible-vault view hello.yml 查看

ansible-vault edit hello.yml 編輯加密文件

ansible-vault rekey hello.yml 修改口令

ansible-vault create new.yml 創建新文件

Ansible-console:2.0+新增,可交互執行命令,支持tab

root@test (2)[f:10] $

執行用戶@當前操作的主機組 (當前組的主機數量)[f:并發數]$

設置并發數: forks n 例如: forks 10

切換組: cd 主機組 例如: cd web

列出當前組主機列表: list

列出所有的內置命令: ?或help

示例:

root@all (2)[f:5]$ list

root@all (2)[f:5]$ cd appsrvs

root@appsrvs (2)[f:5]$ list

root@appsrvs (2)[f:5]$ yum name=httpd state=present

root@appsrvs (2)[f:5]$ service name=httpd state=started

? 注意事項

執行ansible的主機一般稱為主控端,中控,master或堡壘機

主控端Python版本需要2.6或以上

被控端Python版本小于2.4需要安裝python-simplejson

被控端如開啟SELinux需要安裝libselinux-python

windows不能做為主控端

理論知識再多,不如我們動手實踐。下面我帶自己飛一圈兒,來繼續感受ansible的強大?。。。?!

? 實踐準備

由于ansible是一種強大的批量部署軟件,所以當我們在實踐中需要管理幾十臺上百臺的主機的時候,往往不能因為每臺被控設備的用戶密碼而嚴重影響了管理的效率,所以,在此建議大家用一臺主控機將眼前的幾十臺上百臺主機實現基于key的驗證,這樣我們就可以通過主控機hosts來實現對被控集群安全又高效的管理

基于key驗證方法:在主控機上創建一個存有所有被控機的ip的文件ip.txt,然后執行ssh-keygen命令一直回車,這時主控機的密鑰對已經生成,接下來我們執行下面的腳本將公鑰發往所有的被控機:

#!/bin/bash

rpm ?-q ?expect ?&> /dev/null ?|| ?yum ?install ?expect ?-y

password=admin123

while ?read ?ipaddr ; do

expect ?<<-EOF

set ?timeout ?10

spawn ?ssh-copy-id ?$ipaddr

expect ?{

“yes/no” { ?send “yes\n”;exp_continue ?}

“password” { ?send “$password\n” ?}

}

expect ?eof

EOF

done < ip.txt

注意:腳本中的password變量定義為所有被控主機的密碼,密碼不是這個的修改為真正的密碼。因此,我們要把所有的被控主機的密碼設置成一樣的。這個就不多說了,簡單腳本就可以實現。

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99669

(1)
JllbcJllbc
上一篇 2018-05-28
下一篇 2018-05-28

相關推薦

  • 進程和計劃任務

    進程和計劃任務 進程概念 內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等 Process: 運行中的程序的一個副本,是被載入內存的一個指令集合 進程ID(Process ID,PID)號碼被用來標記各個進程 UID、GID、和SELinux語境決定對文件系統的存取和訪問權限,通常從執行進程的用戶來繼承 存在生命周期 task str…

    2018-05-03
  • 初涉sed命令

    零散知識點散記和sed基礎接觸

    Linux筆記 2018-04-15
  • 第七周作業

    1、簡述linux操作系統啟動流程 inux系統啟動流程大致是這樣的: BIOS(Boot Sequence) –> MBR(GRUB) –> Kernel(ramdisk) –> rootfs –> /sbin/init(/etc/inittab) BIOS 主板在接通電源后,BIOS…

    2018-06-29
  • Linux學習筆記 —— RPM軟件包管理(1)

    ◆ 軟件包(RPM)包的管理RPM是RedHat公司開發的軟件包管理系統?,F在廣泛用于CentOS、Fedora等發行版。RPM包的命名規則通常如圖所示。    RPM包、可使用RPM命令進行安裝、卸載、與更新。  ◆ 格式 : rpm [ 選項 ] 軟件包名 【 RPM 安裝/更新時 】 【 RPM包查詢時 】 ◇ 軟件包的安裝與卸載在安裝軟件包…

    2018-04-22
  • MongoDB Replica Set & Sharding

    ?????????????????????????????記得風吹起的零散記憶 ,堆砌著巧克力般的幸福甜蜜,那時一起走過的青草綠地 ,留下了錦瑟音里的萬千思緒

    2018-04-10
  • 進程管理、計劃任務

    進程相關概念 進程內存: Page Frame: 頁框,用存儲頁面數據,存儲Page 4k LRU:Least Recently Used 近期最少使用算法,釋放內存 物理地址空間和線性地址空間 MMU:Memory Management Unit負責轉換線性和物理地址 TLB:Translation Lookaside Buffer 翻譯后備緩沖器,用于?!?/p>

    Linux筆記 2018-05-07
欧美性久久久久