1. 程式人生 > >Ansible安裝部署及常用模塊詳解

Ansible安裝部署及常用模塊詳解

就會 新用戶 特殊 packages add chdir epel change ima

Ansible命令使用

Ansible語法使用ansible <pattern_goes_here> -m <module_name> -a <arguments>

-m NAME,–module-name=NAME:指定執行使用的模塊

-u USERNAME,–user=USERNAME:指定遠程主機以USERNAME運行命令

-s,–sudo:相當於Linux系統下的sudo命令

-USUDO_USERNAME,–sudo-user=SUDO_USERNAME:使用sudo,相當於Linux下的sudo命令

-C -check只檢查不實際執行

-e EXTRA_VARS,引用外部參數

-i INVENTORY,指定倉庫列表,默認/etc/ansible/hosts

–list-hosts,列出執行主機列

==========================================================================================

實驗架構:

Master:

Ansible 172.16.250.149

Slave:

node1 172.16.252.245

node2 172.16.251.163

node3 172.16.250.217

==========================================================================================

Ansible的安裝部署

Ansible在epel的yum中有提供,所以配置好epel源,直接使用yum命令安裝即可

yum install ansible

安裝目錄

配置文件目錄:/etc/ansible/

執行文件目錄:/usr/bin/

Lib庫依賴目錄:/usr/lib/pythonX.X/site-packages/ansible/

Help文檔目錄:/usr/share/doc/ansible-X.X.X/

Man文檔目錄:/usr/share/man/man1/

#yum install ansible -y

配置和被管理的主機直接建立基於ssh的密鑰認證

[root@Ansible~]#ssh-keygen #生成密碼
Generatingpublic/privatersakeypair.
Enterfileinwhichtosavethekey(/root/.ssh/id_rsa):
Createddirectory‘/root/.ssh‘.
Enterpassphrase(emptyfornopassphrase):
Entersamepassphraseagain:
Youridentificationhasbeensavedin/root/.ssh/id_rsa.
Yourpublickeyhasbeensavedin/root/.ssh/id_rsa.pub.
Thekeyfingerprintis:
2c:b0:df:16:26:8e:c7:e6:b4:c6:6a:22:e1:18:89:e9root@Ansible
Thekey‘srandomartimageis:
+--[RSA2048]----+
||
||
|.|
|o.|
|.o.oS|
|*==.|
|+o..Bo|
|oE..=oo|
|.o.oo|
+-----------------+

==========================================================================================

添加認證

[root@Ansible~]#ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
[root@Ansible~]#[email protected]  #驗證
[email protected]
[email protected]
[email protected]

==========================================================================================

定義主機,將所有被管理的主機加入到/etc/ansible/hosts中,否則無法管理

[root@Ansible~]#vim /etc/ansible/hosts
[web]
172.16.250.149
172.16.252.245
172.16.251.163
172.16.250.217

==========================================================================================

#執行ping存活檢測

[root@Ansible~]#ansible web -m ping
172.16.250.217|SUCCESS=>{
"changed":false,
"ping":"pong"
}
172.16.251.163|SUCCESS=>{
"changed":false,
"ping":"pong"
}
172.16.250.149|SUCCESS=>{
"changed":false,
"ping":"pong"
}
172.16.252.245|SUCCESS=>{
"changed":false,
"ping":"pong"
}

#列出執行主機列表

[root@Ansible /etc/ansible]#ansible web --list-hosts 
  hosts (4):
    172.16.250.149
    172.16.252.245
    172.16.251.163
    172.16.250.217

==========================================================================================

[root@Ansible /etc/ansible]#vim ansible.cfg
host_key_checking = False
[root@Ansible /etc/ansible]#useradd locy    #新建用戶
[locy@Ansible ~]$ ssh-keygen
[root@node1 ~]#echo "******" | passwd --stdin locy
[locy@Ansible ~]$ ssh [email protected]
[locy@node1 ~]$
[root@Ansible ~]#su locy
[locy@Ansible ~]$ ssh [email protected]
Last login: Sat Jul  8 10:29:22 2017 from 172.16.250.149
[locy@node1 ~]$ logout
Connection to 172.16.252.245 closed.
[locy@Ansible ~]$ ansible 172.16.252.245 -m ping
172.16.252.245 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

==========================================================================================

#做免密sodu

[root@node1 ~]#visudo 
%wheel  ALL=(ALL)       NOPASSWD: ALL
[root@node1 ~]#usermod -G wheel locy

==========================================================================================

對172.16.252.245做ping操作,連接用戶locy,以sodu方式運行

[locy@Ansible ~]$ ansible 172.16.252.245 -m ping -u locy -b
172.16.252.245 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
或使用root方式   (不建議)
[locy@Ansible ~]$ ansible 172.16.252.245 -m ping -u locy -b --become-user=root

==========================================================================================

Ansible常用模塊詳解

ansible <host-pattern> [-m module_name] [-a args] [options] #ansible命令格式

指定主機組或ip地址 指定調用模塊 傳遞給模塊的參數

ansible-doc -l 查看所有模塊

ansible-doc command 查看command模塊詳細信息

ansible-doc -s command 查看command模塊詳細用法

==========================================================================================

Command

命令模塊接受命令名稱,後面是空格分隔的列表參數。給定的命令將在所有選定的節點上執行。它不會通過shell進行處理,比如$HOME和操作如”小於”<“,”>”, “|”, “;”,”&”‘ 工作(需要使用(shell)模塊實現這些功能)。

action: command

chdir # 在執行命令之前,先切換到該目錄

creates # 一個文件名,當這個文件存在,則該命令不執行,可以用來做判斷

executable # 切換shell來執行命令,需要使用命令的絕對路徑

free_form # 要執行的Linux指令,一般使用Ansible的-a參數代替。

removes # 一個文件名,這個文件不存在,則該命令不執行,與creates相反的判斷

==========================================================================================

對所有機器使用pwd命令

#-m 指定使用的模塊command -a 傳遞給模塊的參數

[root@Ansible ~]#ansible web -m command -a ‘pwd‘
172.16.250.217 | SUCCESS | rc=0 >>
/root
172.16.252.245 | SUCCESS | rc=0 >>
/root
172.16.251.163 | SUCCESS | rc=0 >>
/root
172.16.250.149 | SUCCESS | rc=0 >>
/root

==========================================================================================

查看磁盤使用情況並將內容傳輸到/tmp/df.txt中

[root@Ansible ~]#ansible web -m shell -a ‘df -h > /tmp/df.txt‘

對/tmp/df.txt進行查看

[root@Ansible ~]#ansible web -m command -a ‘cat /tmp/df.txt‘

批量添加用戶

[root@Ansible ~]#ansible web -m command -a ‘useradd Tom‘

==========================================================================================

shell

執行的命令中有管道或者變量,就需要使用shell

action: shell

chdir # 執行之前,先cd到指定目錄在執行命令

creates # 一個文件名,當這個文件存在,則該命令不執行

executable # 切換shell來執行命令,需要使用命令的絕對路徑

free_form # 執行的命令

removes # 一個文件名,這個文件不存在,則該命令不執行

==========================================================================================

對/tmp/df.txt進行查看

[root@Ansible ~]#ansible web -m shell -a ‘cat /tmp/df.txt‘

給上步添加的用戶設定密碼

[root@Ansible ~]#ansible web -m shell -a ‘echo rookie | passwd --stdin Tom‘

==========================================================================================

copy

復制模塊,將文件復制到被管理主機

action: copy

backup # 創建一個備份文件包括時間戳信息,如果以某種方式重創錯了,還可以拿回原始文件

content # 取代src=,表示直接用此處指定的信息生成為目標文件內容

dest # 遠程節點存放文件的路徑,必須是絕對路徑

directory_mode # 遞歸復制設置目錄權限,默認為系統默認權限

force # 如果目標主機包含該文件,但內容不同,如果設置為yes,則強制覆蓋,如果設置為no,則只有當目標主機的目標位置不存在該文件時,才復制。默認為yes

group # 復制到遠程主機後,指定文件或目錄的屬組

mode # 復制到遠程主機後,指定文件或目錄權限,類似與chmod指明如 0644

owner # 復制到遠程主機後,指定文件或目錄屬主

src # 要復制到遠程主機的文件在本地的地址,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸復制。在這種情況下,如果路徑使用”/”來結尾,則只復制目錄裏的內容,如果沒有使用”/”來結尾,則包含目錄在內的整個內容全部復制,類似於rsync。

==========================================================================================

將本地的/etc/fatab文件復制到目標主機的/tmp/ansible.log,屬主為roo,屬組為locy,權限為640,並備份

[root@Ansible ~]#ansible web -m copy -a ‘src=/etc/fstab dest=/tmp/ansible.log owner=root group=locy mode=640 backup=yes‘

對上一步的操作結果進行查看

[root@Ansible ~]#ansible web -m shell -a ‘ls -l /tmp/ansible.log‘
172.16.250.217 | SUCCESS | rc=0 >>
-rw-r-----. 1 root locy 541 7月   9 20:10 /tmp/ansible.log
172.16.250.149 | SUCCESS | rc=0 >>
-rw-r-----. 1 root locy 541 7月   9 20:10 /tmp/ansible.log
172.16.252.245 | SUCCESS | rc=0 >>
-rw-r-----  1 root locy 541 7月   9 08:10 /tmp/ansible.log
172.16.251.163 | SUCCESS | rc=0 >>
-rw-r-----  1 root locy 541 7月   9 20:10 /tmp/ansible.log

==========================================================================================

cron

定時任務模塊,設置管理節點生成定時任務

action: 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 )

==========================================================================================

每天淩晨三點、四點、五點、六點將磁盤使用情況保存在/tmp/df.log

[root@Ansible ~]#ansible web -m cron -a ‘name="harddrive check" minute="15" hour="3,4,5,6" job="df -lh >> /tmp/df.log"‘

每十分鐘將磁盤使用情況保存在/tmp/df.log

[root@Ansible ~]#ansible web -m cron -a ‘name="harddrive check2" minute="*/10" job="df -lh >> /tmp/df.log"‘
[root@Ansible ~]#crontab -l
#Ansible: harddrive check
15 3,4,5,6 * * * df -lh >> /tmp/df.log
#Ansible: harddrive check2
*/10 * * * * df -lh >> /tmp/df.log

將harddrive check刪除

[root@Ansible ~]#ansible web -m cron -a ‘name="harddrive check" state=absent‘

======================================================================================

fetch

遠程文件復制到本地

dest #保存文件的目錄

fail_on_missing #當設置為yes時,如果源文件丟失,任務將會失敗

flat #允許覆蓋將主機名/路徑/文件/文件附加到目的地的默認行為

src #獲取遠程系統上的文件。這必須是一個文件,而不是一個文件目錄

validate_checksum #在獲取文件之後驗證源和目標校驗和

==========================================================================================

將遠程文件/tmp/df.txt復制到本地/root/下

[root@Ansible ~]#ansible web -m fetch -a ‘src=/tmp/df.txt dest=/root/‘

==========================================================================================

file

文件操作模塊,設置文件屬性

action: file

force # 需要在兩種情況下強制創建軟連接,一種是源文件不存在但之後會建立的情況下;另一種是目標連接已存在,需要先取消之前的軟連接,有兩個選項:yes|no

group # 設置文件或目錄的屬組

mode # 設置文件或目錄的權限

owner # 設置文件或目錄的屬主

path # 必選項,定義文件或目錄的路徑

recurse # 遞歸設置文件的屬性,只對目錄有效

src # 要被鏈接到的路徑,只應用與state=link的情況

state # directory:如果目錄不存在,創建目錄

==========================================================================================

查看web組下的所有主機的/tmp/df.txt

[root@Ansible ~]#ansible web -m shell -a ‘ls -l /tmp/df.txt‘
172.16.250.217 | SUCCESS | rc=0 >>
-rw-r--r--. 1 root root 562 7月   9 19:18 /tmp/df.txt
172.16.250.149 | SUCCESS | rc=0 >>
-rw-r--r--. 1 root root 535 7月   9 19:18 /tmp/df.txt
172.16.251.163 | SUCCESS | rc=0 >>
-rw-r--r--  1 root root 615 7月   9 19:18 /tmp/df.txt
172.16.252.245 | SUCCESS | rc=0 >>
-rw-r--r--  1 root root 535 7月   9 07:18 /tmp/df.txt

將web組下的所有主機的/tmp/df.txt權限改為600屬主屬組為locy

[root@Ansible ~]#ansible web -m file -a ‘path=/tmp/df.txt state=touch mode="600" owner=locy group=locy‘
172.16.250.217 | SUCCESS | rc=0 >>
-rw-------. 1 locy locy 562 7月   9 21:41 /tmp/df.txt
172.16.250.149 | SUCCESS | rc=0 >>
-rw-------. 1 locy locy 535 7月   9 21:41 /tmp/df.txt
172.16.252.245 | SUCCESS | rc=0 >>
-rw------- 1 locy locy 535 7月   9 09:41 /tmp/df.txt
172.16.251.163 | SUCCESS | rc=0 >>
-rw------- 1 locy locy 615 7月   9 21:41 /tmp/df.txt

==========================================================================================

在root下創建file目錄

[root@Ansible ~]#ansible web -m file -a ‘path=/root/file state=directory‘
[root@Ansible ~]#ls
file

==========================================================================================

hostname

設置系統的主機名

將172.16.250.149主機名改為master

[root@Ansible ~]#ansible 172.16.250.149 -m hostname -a ‘name=master‘
[root@Ansible ~]#hostname
master

==========================================================================================

yum

基於yum源安裝程序

action: yum

conf_file # yum的配置文件

disable_gpg_check # 關閉gpg_check

disablerepo # 不啟用某個源

enablerepo # 啟用某個源

name= # 指定要安裝的包,如果有多個版本需要指定版本,否則安裝最新的包

state # 安裝(present),安裝最新版(latest),卸載程序包(absent)

==========================================================================================

為web組所有主機安裝nginx 且為最新版本

[root@Ansible ~]#ansible web -m yum -a ‘name=nginx state=latest‘

==========================================================================================

service

服務管理模塊

action: service

arguments # 向服務傳遞的命令行參數

enabled # 設置服務開機自動啟動,參數為yes|no

name # 控制服務的名稱

pattern # 定義一個模式,如果通過status指令來查看服務的狀態時,沒有響應,就會通過ps指令在進程中根據該模式進行查找,如果匹配到,則認為該服務依然在運行

runlevel # 設置服務自啟動級別

sleep # 如果執行了restarted,則在stop和start之間沈睡幾秒鐘

state # 啟動started 關閉stopped 重新啟動restarted 重載reloaded

==========================================================================================

web組所有主機啟動nginx

[root@Ansible ~]#ansible web -m service -a ‘name=nginx state=started‘

web組所有主機關閉nginx

[root@Ansible ~]#ansible web -m service -a ‘name=nginx state=stopped‘

web組所有主機重啟nginx

[root@Ansible ~]#ansible web -m service -a ‘name=nginx state=restarted‘

web組所有主機重載nginx配置文件

[root@Ansible ~]#ansible web -m service -a ‘name=nginx state=reloaded‘

web組所有主機啟動nginx,並開機啟動/不啟動

[root@Ansible ~]#ansible web -m service -a ‘name=nginx state=started enabled=yes/no‘

==========================================================================================

group

用戶組模塊,添加或刪除組

action: group

gid # 設置組的GID號

name= # 管理組的名稱

state # 指定組狀態,默認為創建,設置值為absent為刪除

system # 設置值為yes,表示為創建系統組

==========================================================================================

創建名為tom的組

[root@Ansible ~]#ansible web -m group -a ‘name=tom state=present‘

==========================================================================================

user

用戶模塊,管理用戶帳號

action: 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 # 更新用戶密碼

==========================================================================================

創建用戶tom,用戶信息為tom is tom,uid為1066,基本組為tom,附加組為wheel,shell類型為zshell,用戶家目錄為/home/tomhome

[root@Ansible ~]#ansible web -m user -a ‘name=tom comment="tom is tom" uid=1066 group=tom groups=wheel shell=/bin/zshell home=/home/tomhome‘
[root@Ansible ~]#getent passwd tom
tom:x:1066:1002:tom is tom:/home/tomhome:/bin/zshell

==========================================================================================

script

在指定節點運行服務端的腳本

[root@Ansible ~]#vim test.sh
#/bin/bash
touch /tmp/test.sh.log  #創建/tmp/test.sh.log
echo "hello" >> /tmp/test.sh.log  #將date命令結果輸出到/tmp/test.sh.log
在web組中所有主機執行/root/test.sh腳本
[root@Ansible ~]#ansible web -m script -a ‘/root/test.sh‘
[root@Ansible ~]#cat /tmp/test.sh.log
hello
[root@node1 ~]#cat /tmp/test.sh.log
hello
查看172.16.251.163主機下的/tmp/test.sh.log
[root@Ansible ~]#ansible 172.16.251.163 -m shell -a ‘cat /tmp/test.sh.log’
172.16.251.163 | SUCCESS | rc=0 >>
hello

==========================================================================================

Ansible安裝部署及常用模塊詳解