ansible筆記

在運維中常見自動化操作

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任務執行流程

wKiom1liOH7ApaxeAAJplxNnwd8650.jpg


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章