一、ansible概述
Ansible是一款基於Python開發的自動化運維工具,它不須要安裝客戶端,使用SSH進行通訊,同時可支持系統帳號認證或祕鑰認證,也支持windows客戶端。node
Ansible主要組成部分:python
(1)ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,一般是JSON格式的YML文件;linux
(2)INVENTORY:Ansible管理主機的清單;nginx
(3)MODULES:Ansible執行命令的功能模塊,多數爲內置的核心模塊,也可自定義;git
(4)PLUGINS:模塊功能的補充,如鏈接類型插件、循環插件、變量插件、過濾插件等,該功能不經常使用。github
(5)API:供第三方程序調用的應用程序編程接口;shell
(6)ANSIBLE:ansible命令工具,其爲核心執行工具;
編程
(1)yum方式安裝windows
#須要安裝epel倉庫 yum install epel-release #安裝ansible yum install ansible
(2)使用pip方式安裝(須要python2.7及以上版本支持)bash
#須要安裝python-pip程序包及python-devel yum install python-pip python-devel -y #安裝須要依賴的軟件 yum install gcc glibc-devel zlib-devel rpm-build openssl-devel -y #升級PIP至最新版本 pip install --upgrade pip #安裝ansible pip install ansisble --upgrade
(3)源碼方式安裝
#安裝git客戶端 yum install git -y #拉取GitHub上的源碼包文件 git clone git://github.com/ansible/ansible.git --recursive #執行env-setup腳本,安裝ansible cd ansible source ./hacking/env-setup
(4)驗證安裝:
ansible --version
三、ansible的配置文件
Ansible安裝完成後,默認的配置文件存放在’/etc/ansible/’目錄下,’/etc/ansible’目錄的下的文件有ansible.cfg,hosts及目錄roles,ansible.cfg爲ansible默認的配置文件,使用的過程當中,大多數狀況下使用默認的配置文件便可,特殊狀況下可根據本身需求修改配置文件。Hosts爲ansible遠程管理的主機及主機組配置文件。
四、ansible配置管理的主機及主機組
Ansible安裝完成後,它與客戶端的通訊時經過ssh通訊的,與客戶端的認證方式有密碼認證及公鑰私鑰認證,默認使用的是基於公私鑰認證,爲了安裝考慮,建議使用默認的公私鑰認證。
(1)爲客戶端分發公鑰
#在ansible服務端生成祕鑰對 ssh-keygen -t rsa #爲客戶端分發公鑰,主機多時可經過腳本分發 ssh-copy-id -i /root/.ssh/id_rsa.pub "user"@host
(2)定義主機和組
Ansible對管理的主機組的配置文件爲 /etc/ansible/hosts,對於功能相同的主機能夠存放於同一組中,方便配置管理。也可將一個主機放在多個組中,若目標主機使用了非默認的SSH端口,能夠在主機名稱後使用冒號加端口來標明。
#配置一個test組,下面有三臺主機
[test]
10.0.0.13
10.0.0.14
10.0.0.8
在定義主機及組時,也可爲主機及組定義主機及組變量
#定義主機,並定義主機變量
[dayi123]
10.0.0.8 servername=nginx01 serverport=8011
#定義組變量,爲上面定義的組test定義變量
[test:vars]
serverport=80
在inventory中,組還能夠包含其餘的組,而且能夠向組中的主機指定變量,而這些變量只能在ansible-playbook中使用。
五、Ansible系列命令介紹
Ansible安裝完成後,輸入ansible按兩次tab鍵,會補全全部ansible字母開頭的命令,主要有七項。
(1)ansible命令的用法:
Ansible命令是平常工做中最長使用的命令,主要的使用場景爲非固化需求,臨時一次性的操做。
Ansible命令的使用語法格式爲:
ansible <host-pattern> [options]
經常使用的參數選項有:
-m 指定執行時使用的模塊
-u 指定遠程主機運行此命令的用戶
-s 至關於sudo
-S 使用sudo
Ansible返回結果通常會使用紅色,橘色,橘黃色顯示,紅色表示執行過程異常,會終止剩餘任務的執行,綠色和橘黃色表示執行過程沒有異常,但橘黃色表示命令執行結束後目標有狀態變化,綠色表示命令執行結束後目標沒有狀態變化。
(2)ansible-galaxy
經過ansible-galaxy上傳下載Roles(Roles下載地址爲:https://galaxy.ansible.com),
ansible-galaxy命令使用格式:
ansible-galaxy [init|info|install|list|remove] [--help] [options]
也可以使用關鍵字查詢roles:ansible-galaxy nginx
(3)ansible-pull
Ansible-pull的做用爲推送命令至遠程,效率無限提高,對運維要求較高
(4)ansible-doc
Ansible-doc是ansible模塊的文檔說明,對每一個模塊都有詳細的用法說明及案例,功能和linux的man命令相似
Ansible-doc用法:ansible-doc [options] [module]
#列出全部的模塊
ansible-doc -l
#查看摸模塊的用法
ansible-doc [module]
#查看ping命令的用法
ansible-doc ping
(5)ansible-playbook
Ansible-playbook工做機制是經過讀取預先編寫的playbook文件實現批量管理,實現的功能與ansible命令類似,ansible-playbook執行時後跟yml格式的playbook文件,執行事先編好的任務集。
使用方法如:ansible-playbook playbook.yml
(6)ansible-vault
Ansible-vault主要用於配置文件加密
用法:
ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] file_name
(7)ansible-console
Ansible-console是ansible爲用戶提供的一款交互式工具,用戶可在ansible-console虛擬出的終端上使用ansible內置的各類命令。全部的操做與shell相似,並支持tab補全。
六、ansible命令經常使用模塊的使用
ansible2.3中的模塊大概有一千多個,可經過命令」ansible-doc -l」查看有那些模塊,查看模塊時也能夠根據關鍵字搜索某個具體的模塊名稱。可經過」ansible-doc [modulename]」查看具體具體模塊的用法。
(1)ping模塊
檢查摸個主機或者某個組中的主機是否聯通,若是聯通則返回」pong」
#測試某個主機是否聯通
[root@ansible ~]# ansible 10.0.0.14 -m ping
#測試某個組的主機是否聯通
[root@ansible ~]# ansible test -m ping
#測試全部的主機是否聯通
[root@ansible ~]# ansible all -m ping
10.0.0.13 | SUCCESS => {
"changed": false,
"ping": "pong"
}
(2)command模塊
command模塊用於在被管理的客戶端執行命令,可是command模塊不支持管道符號」|」及」>」,」<」,」;」,」&」等一些特殊符號。
選項:
reates 一個文件名,當該文件存在,則該命令不執行
free_form 要執行的linux指令
chdir 在執行指令以前,先切換到該目錄
removes 一個文件名,當該文件不存在,則該選項不執行
executable 切換shell來執行指令,該執行路徑必須是一個絕對路徑
#查看磁盤剩餘空間
[root@ansible ~]# ansible 10.0.0.13 -m command -a "df -h"
10.0.0.13 | SUCCESS | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_server1-lv_root
37G 1.1G 34G 3% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 477M 33M 419M 8% /boot
(3)shell模塊
shell模塊同command模塊功能基本同樣,但shell模塊支持特殊符號。
選項(shell模塊同command模塊基本相同):
#查看是否存在用戶」dayi123」,將信息保存到」/tmp/userinfo」中
[root@ansible ~]# ansible "*" -m shell -a "grep "dayi123" /etc/passwd >>/tmp/userinfo"
#查看」/tmp/userinfo」
[root@ansible ~]# ansible "*" -m shell -a "cat /tmp/userinfo"
#修改主機10.0.0.13及10.0.0.14用戶」dayi123」的密碼
[root@ansible ~]# ansible 10.0.0.13:10.0.0.14 -m shell -a "echo "dayi123" |passwd --stdin dayi123"
(4)copy模塊
Copy模塊用於將當前主機的文件及目錄拷貝到遠程主機上。
選項:
backup 在覆蓋以前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no
content 用於替代「src」,能夠直接設定指定文件的值
dest 必選項。要將源文件複製到的遠程主機的絕對路徑,若是源文件是一個目錄,那麼該路徑也必須是個目錄
directory_mode 遞歸設定目錄的權限,默認爲系統默認權限
force 若是目標主機包含該文件,但內容不一樣,若是設置爲」yes」,則強制覆蓋,若是爲」no」,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes
src 被複制到遠程主機的本地文件,能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,它將遞歸複製。在這種狀況下,若是路徑使用」/」來結尾,則只複製目錄裏的內容,若是沒有使用」/」來結尾,則包含目錄在內的整個內容所有複製。
mode 文件或目錄拷貝完成後設置權限。
owner 文件拷貝完成後設置文件的屬主
group 文件拷貝完成後設置文件的屬組
#拷貝目錄
[root@ansible ~]# ansible test -m copy -a "src=/etc/cron.daily/ dest=/tmp/"
#拷貝文件
[root@ansible ~]# ansible test -m copy -a "src=jdk-8u144-linux-x64.rpm dest=/tmp/jdk.rpm"
#拷貝時若是目標目錄文件存在則備份並在拷貝完成後修改文件屬主權限
[root@ansible ~]# ansible "all" -m copy -a "src=/root/jdk-8u45-linux-x64.rpm dest=/home/dayi123/ mode=644 owner=dayi123 backup=yes"
(5)cron模塊
cron模塊主要用於建立計劃任務
經常使用選項:
minute=/ hour=/ day=/ month=/ weekday=/ 某個值不寫,默認就是*
name 必選項,任務的名稱
job 執行的任務,要加引號
state 有兩個選項分別爲present(建立任務),absent(刪除任務)
#建立時間同步的定時任務
[root@ansible ~]# ansible "all" -m cron -a "minute=1 hour=*/2 job='/usr/bin/ntpdate 10.0.0.30' name=ntpdate"
#刪除定時任務
[root@ansible ~]# ansible "all" -m cron -a "name=ntpdate state=absent"
(6)fetch模塊
fetch模塊它用於從遠程機器獲取文件,並將其本地存儲在由主機名組織的文件樹中。
選項:
src 遠程系統上要獲取的文件。
dest 保存文件的目錄
#獲取遠程主機上的hosts文件
[root@ansible ~]# ansible test2 -m fetch -a "src=/etc/hosts dest=/tmp"
10.0.0.13 | SUCCESS => {
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/tmp/10.0.0.13/etc/hosts",
"md5sum": "54fb6627dbaa37721048e4549db3224d",
"remote_checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"remote_md5sum": null
}
(7) file模塊
file模塊主要用於遠程主機上的文件操做
選項:
force 須要在兩種狀況下強制建立軟連接,一種是源文件不存在但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no
group 定義文件/目錄的屬組
mode 定義文件/目錄的權限
owner 定義文件/目錄的屬主
path 定義文件/目錄的路徑
recurse 遞歸的設置文件的屬性,只對目錄有效
src 要被連接的源文件的路徑,只應用於state=link的狀況
dest 被連接到的路徑,只應用於state=link的狀況
state:
directory 若是目錄不存在,建立目錄
file 即便文件不存在,也不會被建立
link 建立軟連接
hard 建立硬連接
touch 若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間
absent 刪除目錄、文件或者取消連接文件
#修改文件權限
[root@ansible ~]# ansible all -m file -a "path=/home/dayi123/jdk-8u45-linux-x64.rpm owner=dayi123"
#建立軟鏈接
[root@ansible ~]# ansible all -m file -a "src=/etc/hosts dest=/hosts state=link"
#若是目錄不存在,則建立目錄
[root@ansible ~]# ansible all -m file -a "path=/home/dayi123/tool state=directory"
(8)hostname模塊
Hostname模塊用於批量修改主機名,修改後的主機名是永久生性的,重啓後依然生效。
#修改單臺主機名
[root@ansible ~]# ansible 10.0.0.13 -m hostname -a "name=ansible-client01"
10.0.0.13 | SUCCESS => {
"ansible_facts": {
"ansible_domain": "",
"ansible_fqdn": "ansible-client01",
"ansible_hostname": "ansible-client01",
"ansible_nodename": "ansible-client01"
},
"changed": true,
"name": "ansible-client01"
}
修改多態主機的名稱時,須要在/etc/ansible/hosts中定義主機名的變量,而後在利用hostname模塊修改。
在/etc/ansible/hosts中定義關於主機名的變量:
[test]
10.0.0.13:222 servername=ansible-client01
10.0.0.14 servername=ansible-client02
10.0.0.8 servername=ansible-server
批量修改主機名:
[root@ansible ~]# ansible test -m hostname -a "name={{ servername }}"
10.0.0.8 | SUCCESS => {
"ansible_facts": {
"ansible_domain": "",
"ansible_fqdn": "ansible-server",
"ansible_hostname": "ansible-server",
"ansible_nodename": "ansible-server"
},
"changed": true,
"name": "ansible-server"
}
(9)script模塊
Script腳本模塊用於將本地的腳本複製到遠程主機並在遠程主機執行。
選項:
creates:文件名,若是這個文件存在,則該命令不執行
free_form:本地腳本路徑
removes:文件名,這個文件不存在,則該命令不執行
#去遠程主機執行腳本
[root@ansible-server ~]# ansible test -m script -a "test.sh"
10.0.0.13 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.0.0.13 closed.\r\n",
"stdout": "######################\r\n### hello linux ###\r\n######################\r\nMon Apr 9 03:43:48 CST 2018\r\n",
"stdout_lines": [
"######################",
"### hello linux ###",
"######################",
"Mon Apr 9 03:43:48 CST 2018"
]
}
#當遠程主機存在指定的文件時,腳本不執行
[root@ansible-server ~]# ansible test -m script -a "test.sh creates=/tmp/test.log"
10.0.0.13| SKIPPED
(10)yum模塊
yum模塊用於管理遠程主機上的rpm軟件包
選項:
config_file 指定yum配置文件
disable_gpg_check 關閉gpg_check
disablerepo 不啓用某個源
enablerepo 啓用某個源
name 指明要安裝的程序包,能夠帶上版本號,能夠寫爲rpm包的路徑或url地址。
state 對軟件進行的操做,是安裝仍是卸載,值爲:
present 默認的,表示安裝
lastest 安裝爲最新的版本
absent 表示刪除
#在全部的遠程主機上安裝ntpdate
[root@ansible-server ~]# ansible test -m yum -a "name=ntpdate state=present"
(11)Service模塊
servicer模塊主要用於對服務的管理
選項:
arguments 給命令行提供一些選項
enabled 是否開機啓動 yes|no, 要求狀態(state)和啓用(enabled)中至少有一個。
name 必選項,服務名稱
runlevel 運行級別
sleep 若是執行了restarted,在則stop和start之間沉睡幾秒鐘
state 對當前服務執行的動做,值有started,stopped,restarted,reloaded
#啓動httpd服務
[root@ansible-server ~]# ansible 10.0.0.8 -m service -a 'name=httpd state=started'
#設置httpd服務開機自啓動
[root@ansible-server ~]# ansible test -m service -a 'name=httpd enabled=yes'
(12)group模塊
group模塊用於管理用戶組
選項:
gid 指定組id。
name 指定組名。
state 對組的操做是建立仍是刪除(present,absent)
system 表示建立的組是否爲系統組,默認爲」no」,」yes」則表示建立的組爲系統組。
#建立用戶組
[root@ansible-server ~]# ansible test -m group -a "name=test123 gid=1000"
(13)user模塊
User模塊用戶管理遠程主機上的用戶
選項:
name 指定用戶名
group 設置用戶的屬組
groups 設置用戶的附加組
home 設置用戶的家目錄
shell 設置用戶的shell
uid 設置用戶的uid
expires 設置用戶的過時時間(時間格式爲時間戳格式)
password 設定用戶的密碼(密碼爲加密後的密碼)
system 當建立用戶時,值爲」yes」時表示建立系統用戶,默認值爲」no」
state 值爲」present」表示建立用戶,值爲」absent」時表示刪除用戶
remove 用於刪除用戶,結合」state=absent」使用
createhome 是否建立用戶家目錄,值爲」yes」時表示建立用戶家目錄,值爲」no」時表示不建立用戶家目錄,默認值爲」yes」
generate_ssh_key 是否爲用戶生成SSH密鑰。不會覆蓋現有的SSH密鑰。
ssh_key_bits 可選擇指定要建立的SSH密鑰中的位數。
ssh_key_passphrase 設置SSH密鑰的密碼。 若是沒有提供密碼,SSH密鑰將默認沒有密碼。
ssh_key_file 指定SSH密鑰文件名, 若是這是一個相對的文件名,那麼它將是相對於用戶的主目錄。
ssh_key_type 指定要生成的SSH密鑰的類型, 可用的SSH密鑰類型將取決於目標主機上的實現。
#建立用戶[root@ansible-server ~]# ansible test -m user -a "name=dayi1234 shell=/bin/bash groups=test123,dayi123"#將指定的時間轉化爲時間戳格式[root@ansible-server ~]# date -d '2019-03-01 23:59:59' +%s 1551502799#設置用戶到期時間[root@ansible-server ~]# ansible test -m user -a "name=dayi123 expires=1551502799"#刪除用戶[root@ansible-server ~]# ansible test -m user -a "name=dayi1234 state=absent remove=yes"