在運維中常見自動化操作
1、如何大規模安裝操作系統:
在bare metal(裸機)上安裝操作系統等,可以使用如下技術:pxe、cobbler
在虛擬機上安裝操作系統等
2、自動化部署和配置:
puppet(基於ruby)
saltstack(基於Python)
ansible(基於Python,輕量級)
3、自動化完成管理和操作(需要批量執行某些命令)
fabric(基於Python)
func
ansible
4、自動化完成程序發佈
ansible特性
模塊化:使用ansible時,調用特定模塊,完成特定任務
基於Python實現:主要調用 Paraniko、PyYAML和jinja2 這三個模塊實現
由於是agentlsss,部署非常簡單
支持自定義模塊
支持playbook
ansible任務執行流程
ansible用三種顏色來表示命令的執行結果
如果返回 紅色:表示執行結果異常,通常會終止剩餘所有任務
如果返回 黃色:表示執行結果正常,且在命令執行結束後目標有狀態上的變化
如果返回 綠色:表示執行結果正常,且在命令執行結束後目標沒有狀態上的變化
ansible在使用時,通常先將管理機的公鑰發送到遠程主機上去,如果遠程主機數量過多,手動添加過去麻煩,推薦使用腳本完成
方法一:將所有IP地址寫入一個文件中(比如這裏的/etc/ansible/shell/ip.txt) #! /bin/bash read -p "請輸入用戶名: " user read -p "請輸入密碼: " password #產生密鑰對 ssh-keygen -t rsa -P '' #檢查sshpass是否按照 rpm -q sshpass &> /dev/null if [ $? -eq 0 ];then echo "command sshpass installed" else yum -y install sshpass &> /dev/null fi #開始批量向遠程主機發送公鑰 while read Line do sshpass -p $password ssh-copy-id $user@$Line done < /etc/ansible/shell/ip.txt ########################################################### #2017年7月19日在公司使用ansible主機向遠程主機推送公鑰時報錯如下: #Host key verification failed. #解決方案:vi /etc/ssh/ssh_config,將StrictHostKeyChecking ask改爲StrictHostKeyChecking no #之後重啓ssh服務 #原理:ssh會把你每個你訪問過計算機的公鑰(public key)都記錄在~/.ssh/known_hosts。當下次訪問相同計算機時,OpenSSH會覈對公鑰。如果公鑰不同,OpenSSH會發出警告,避免你受到DNS Hijack之類的***。
方法二:用通過shell腳本和expect方式 先定義一個腳本 將所有IP地址寫入一個文件中(比如這裏的/etc/ansible/shell/ip.txt) # vim send_plubic_key2.sh #! /bin/bash while read Line do expect /etc/ansible/shell/send_plubic_key2.exp $Line done < /etc/ansible/shell/ip.txt 在定義expect腳本 # vim send_plubic_key2.exp #! /usr/bin/expect -f set ipaddr [lindex $argv 0] spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$ipaddr expect { "password:" { send "appmon\r" } } expect eof
ansible常用模塊
1、copy模塊 :複製文件到遠程主機
copy模塊參數如下: backup: #在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no content: #用於替代“src”,可以直接設定指定文件的值 dest: #必選項。要將源文件複製到的遠程主機的絕對路徑,如果源文件是一個目錄,那麼該路徑也必須是個目錄 directory_mode: #遞歸設定目錄的權限,默認爲系統默認權限 force: #如果目標主機包含該文件,但內容不同,如果設置爲yes,則強制覆蓋,如果爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes others:#所有的file模塊裏的選項都可以在這裏使用 group # 複製到遠程主機後,指定文件或目錄的屬 mode # 複製到遠程主機後,指定文件或目錄權限,類似與 `chmod’指明如 0644 owner # 複製到遠程主機後,指定文件或目錄屬主 src:#被複制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸複製。在這 種情況下,如果路徑使用“/”來結尾,則只複製目錄裏的內容,如果沒有使用“/”來結尾,則包含目錄在內的整個內容全部複製, 類似於rsync。
例子:將本地文件“/etc/ansible/ansible.cfg”複製到遠程服務器,設置屬主和屬組及文件權限
# ansible storm_cluster -m copy -a “src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=root mode=0644″
2、file模塊: 設置文件屬性
file模塊參數如下: force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在,但之後會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然後創建新的 軟鏈,有兩個選項:yes|no group:定義文件/目錄的屬組 mode:定義文件/目錄的權限 owner:定義文件/目錄的屬主 path:必選項,定義文件/目錄的路徑 recurse:遞歸設置文件的屬性,只對目錄有效 src:被鏈接的源文件路徑,只應用於state=link的情況 dest:被鏈接到的路徑,只應用於state=link的情況 state: directory:如果目錄不存在,就創建目錄 file:即使文件不存在,也不會被創建 link:創建軟鏈接 hard:創建硬鏈接 touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最後修改時間 absent:刪除目錄、文件或者取消鏈接文件
例子:遠程文件符號鏈接創建
# ansible storm_cluster -m file -a “src=/etc/resolv.conf dest=/tmp/resolv.conf state=link” src表示已經存在的文件,dest表示創建的軟連接的文件名,最後的state狀態爲link
例子:遠程文件符號鏈接刪除
# ansible storm_cluster -m file -a “path=/tmp/resolv.conf state=absent”
3、fetch模塊:文件拉取模塊,主要是將遠程主機中的文件拷貝到本機中
fetch模塊參數如下: 和copy模塊的作用剛剛相反,並且在保存的時候使用hostname來進行保存,當文件不存在的時候,會出現錯誤,除非設置了選項fail_on_missing爲yes Dest:用來存放文件的目錄,例如存放目錄爲backup,源文件名稱爲/etc/profile在主機pythonserver中,那麼保存爲/backup/pythonserver/etc/profile Fail_on_missing: Yes/no,當源文件不存在的時候,標識爲失敗 Flat: 允許覆蓋默認行爲從hostname/path到/file的,如果dest以/結尾,它將使用源文件的基礎名稱 Src: 在遠程拉取的文件,並且必須是一個file,不能是目錄 Validate_checksum Yes/no,當文件fetch之後進行md5檢查
例子:從遠程主機上拉取文件到本機
# ansible server -m fetch -a “src=/root/123 dest=/root src表示爲遠程主機上需要傳送的文件的路徑,dest表示爲本機上的路徑,在傳送過來的文件,是按照IP地址或hostname進行分類,然後路徑是源文件的路徑,例如上面的最終路徑爲/root/192.168.1.60/root/123在拉取文件的時候,必須拉取的是文件,不能拉取文件夾
例子:指定路徑目錄進行保存
# ansible pythonserver -m fetch -a “src=/root/Ssh.py dest=/root/kel/ flat=yes” 在使用參數爲flat的時候,如果dest的後綴名爲/,那麼就會保存在目錄中,然後直接保存爲文件名,如上例的結果爲 dest”: “/root/kel/Ssh.py; 當dest後綴不爲/的時候,那麼就會直接保存爲kel的文件,如上例1所示。主要是在於dest是否已/結尾,從而來區分這是個目錄還是路徑。
4、assemble模塊:文件組裝模塊,主要是將多份配置文件組裝爲一份配置文件。
assemble模塊參數如下: Backup:Yes/no 是否創建備份文件,使用時間戳 Delimiter:配置文件內容之間的分隔符 Dest:目的文件用來連接所有的源文件 Follow:Yes/no 表示文件系統的鏈接,如果存在,應該follow Group:文件所屬組,相當於chown Mode:文件屬性,0644,記住保留前面的0 Owner:文件所屬用戶 Regexp:組裝的時候是否匹配相關的文件進行組合 Remote_src:True/False,False表示src文件在本機上,True表示src在遠程主機上 Src:已經存在的目錄文件
例子:將本機上的配置文件組裝發送到遠程主機
# ansible pythonserver -m assemble -a “src=/root/kel/ dest=/tmp/kel.conf remote_src=False” 在本機目錄/root/kel的文件進行組裝,發送到遠程配置文件/tmp/kel.conf中,在此注意參數remote_src爲False表示組裝本機的配置文件,如果在本機目錄中不存在文件,那麼將會顯示Python代碼和亂碼
5、command模塊:在遠程主機上執行命令
Command不適用於有shell變量的情況,也不適用於有管道符或者&&的情況,如果要使用此種情況,那麼可以使用shell模塊
參數如下: creates:一個文件名,當該文件存在,則該命令不執行 free_form:要執行的linux指令 chdir:在執行指令之前,先切換到該目錄 removes:一個文件名,當該文件不存在,則該選項不執行 executable:切換shell來執行指令,該執行路徑必須是一個絕對路徑
例子:查看遠程服務器的負載信息
# ansible storm_cluster -m command -a “uptime”
6、shell模塊:切換到某個shell執行指定的指令,與command不同的是,此模塊可以支持命令管道,同時還有另一個模塊也具備此功能:raw
參數如下: chdir # 執行之前,先cd到指定目錄在執行命令 creates # 一個文件名,當這個文件存在,則該命令不執行 executable # 切換shell來執行命令,需要使用命令的絕對路徑 free_form= # 執行的命令 removes # 一個文件名,這個文件不存在,則該命令不執行
例子:遠程執行shell腳本
# ansible storm_cluster -m shell -a “/tmp/rocketzhang_test.sh”
7、service模塊:系統服務管理
參數如下: arguments # 向服務傳遞的命令行參數 enabled # 設置服務開機自動啓動,參數爲yes|no name= # 控制服務的名稱 pattern # 如果通過status指令來查看服務的狀態時,沒有響應,就會通過ps指令在進程中根據該模式進行查找,如果匹配到,則認爲該服務依然在運行 runlevel # 設置服務自啓動級別 sleep # 如果執行了restarted,則在stop和start之間沉睡幾秒鐘 state # 啓動`started’ 關閉`stopped’ 重新啓動 `restarted’ 重載 `reloaded’
例子:啓動http服務,並添加到啓動服務項中,設置開機啓動
# ansible web -m service -a “name=httpd state=started enabled=yes ”
8、cron模塊:管理計劃任務
參數如下: backup # 如果設置,創建一個crontab備份 cron_file # 如果指定, 使用這個文件cron.d,而不是單個用戶crontab day # 日應該運行的工作( 1-31, *, */2, etc ) hour # 小時 ( 0-23, *, */2, etc ) job # 指明運行的命令是什麼 minute # 分鐘( 0-59, *, */2, etc ) month # 月( 1-12, *, */2, etc ) name # 定時任務描述 reboot # 任務在重啓時運行,不建議使用,建議使用special_time special_time # 特殊的時間範圍,參數:reboot(重啓時),annually(每年),monthly(每月),weekly(每週),daily(每天),hourly(每小時) state # 指定狀態,prsent表示添加定時任務,也是默認設置,absent表示刪除定時任務 user # 以哪個用戶的身份執行 weekday # 周 ( 0-6 for Sunday-Saturday, *, etc )
例子:在指定節點上定義一個計劃任務,每隔3分鐘到主控端更新一次時間
# ansible all -m cron -a ‘name=”custom job” minute=*/3 hour=* day=* month=* weekday=* job=”/usr/sbin/ntpdate 172.16.254.139″‘
例子:新建一個cron文件
# ansible pythonserver -m cron -a “name=’for test’ weekday=’2′ minute=’0′ hour=12 user=’root’ job=’cat /etc/passwd >/root/111′ cron_file=’test ansible'” 新增一個任務,在目錄/etc/cron.d/目錄中,文件名稱爲test ansible,用戶爲root
9、yum模塊:軟件包安裝管理
參數如下: conf_file # yum的配置文件 disable_gpg_check # 關閉gpg_check disablerepo # 不啓用某個源 enablerepo # 啓用某個源 List # 非冪等性命令 name= # 指定要安裝的包,如果有多個版本需要指定版本,否則安裝最新的包 state # 安裝(`present’),安裝最新版(`latest’),卸載程序包(`absent’)
例子:確定一個包安裝的是指定版本,如下:
# ansible server -m yum -a “name=acme-1.5 state=present”
例子:安裝一個最新版包:
# ansible server -m yum -a “name=acme state=latest”
例子:指定repo來進行安裝包
# ansible server -m yum -a “name=httpd enablerepo=kel state=present” 在指定源的時候,使用enablerepo,注意這個名字是配置文件/etc/yum.repo.d/目錄中文件的section的名稱,如下所示: # cat rhel-source.repo |grep kel [kel] name=kel baseurl=file:///tmp/kel
例子:更新所有安裝包
# ansible server -m yum -a “name=* state=latest
例子:指定rpm進行安裝
# ansible server -m yum -a “name=/usr/local/src/kel.noarch.rpm state=present”
例子:指定遠程網址rpm進行安裝
# ansible server -m yum -a “name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6.0.el6.ngx.noarch.rpm state=present”
10、synchronize模塊:使用rsync同步文件
使用rsync 模塊,ansible主機以及遠程主機必須安裝rsync 包,否則無法使用這個模塊
參數如下: archive # 是否採用歸檔模式同步,即以源文件相同屬性同步到目標地址 checksum # 是否效驗 compress # 開啓壓縮,默認爲開啓 copy_links # 同步的時候是否複製連接 delete # 刪除源中沒有而目標存在的文件(即以推送方爲主) dest= # 目標地址 dest_port # 目標接受的端口,ansible配置文件中的 ansible_ssh_port 變量優先級高於該 dest_port 變量 dirs # 以非遞歸的方式傳輸目錄 existing_only # Skip creating new files on receiver. group # Preserve group links # Copy symlinks as symlinks. mode # rsync同步的方式,默認都是推送push。如果你在使用拉取pull功能,可以通過mode=pull更改推送模式爲拉取模式 recursive # 是否遞歸 yes/no rsync_opts # 使用rsync 的參數 rsync_path # 指定遠程服務器上的rsync命令所在路徑信息。這個參考rsync命令的–rsync-path參數,–rsync-path=PATH rsync_timeout # 指定 rsync 操作的 IP 超時時間,和rsync命令的 –timeout 參數效果一樣. set_remote_user # put user@ for the remote paths. If you have a custom ssh config to define the remote user for src=\‘#\‘” # 同步的數據源目錄或文件 –exclude=.Git #忽略同步.git結尾的文件 由於模塊默認啓用了archive參數,該參數默認開啓了recursive,links,perms,times,owner,group和-D參數。如果你將該參數設置爲no,那麼你將停止很多參數,比如會導致如下目的遞歸失敗,導致無法拉取
例子:把本機根目錄下的time.sh文件同步到目標主機上。目標機器需要安裝rsync軟件
# ansible web -a ‘yum install rsync -y’ # ansible web -m synchronize -a ‘src=/time.sh dest=/tmp/’
11、user模塊:系統用戶賬號管理
參數如下: comment # 用戶的描述信息 createhome # 是否創建家目錄 force # 在使用`state=absent’是, 行爲與`userdel –force’一致. group # 指定基本組 groups # 指定附加組,如果指定爲(‘groups=’)表示刪除所有組 home # 指定用戶家目錄 login_class # 可以設置用戶的登錄類 FreeBSD, OpenBSD and NetBSD系統. move_home # 如果設置爲`home=’時, 試圖將用戶主目錄移動到指定的目錄 name= # 指定用戶名 non_unique # 該選項允許改變非唯一的用戶ID值 password # 指定用戶密碼 remove # 在使用 `state=absent’時, 行爲是與 `userdel –remove’一致. shell # 指定默認shell state #設置帳號狀態,不指定爲創建,指定值爲absent表示刪除 system # 當創建一個用戶,設置這個用戶是系統用戶。這個設置不能更改現有用戶。 uid #指定用戶的uid update_password # 更新用戶密碼
例子:添加用戶foo,指定密碼,設置家目錄,不允許遠程登錄
# ansible webserves -m user -a “name=foo password=<crypted passwordhere> home=/home/foo shell=/sbin/nologin”
12、group模塊:系統用戶組管理
參數如下: gid # 設置組的GID號 name= # 管理組的名稱 state # 指定組狀態,默認爲創建,設置值爲absent爲刪除 system # 設置值爲yes,表示爲創建系統組
例子:創建一個foo組,指定gid號
# ansible webserves -m group -a “name=foo gid=360 system=yes”
13、script模塊:將本地腳本複製到遠程主機並運行
參數如下: creates # 一個文件名,當這個文件存在,則該命令不執行 free_form= # 本地腳本路徑 removes # 一個文件名,這個文件不存在,則該命令不執行
例子:將ansible主機上/root/local.sh複製到遠程主機並執行
#ansible test -m script -a ‘/root/local.sh’
14、setup模塊:收集遠程主機的facts
每個被管理節點在接收並運行管理命令之前,會將自己主機相關信息,如操作系統版本、IP地址等報告給遠程的ansbile主機
參數如下: Fact_path:/etc/ansible/facts.d,Fact的路徑 Filter:過濾串
例子:收集fact並且進行保存
# ansible server -m setup –tree /tmp/facts 執行之後,會顯示相關的fact,並且在/tmp/facts中會保存fact信息
例子:收集內存信息並輸出
# ansible pythonserver -m setup -a “filter=ansible_*_mb” 使用過濾字符串,從而進行了相關的匹配,得到相關的內存信息如下: “ansible_facts”: { “ansible_memfree_mb”: 746, “ansible_memtotal_mb”: 996, “ansible_swapfree_mb”: 2015, “ansible_swaptotal_mb”: 2015 }
ansible playbook