Ansible使用簡明手冊
1、簡介
ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:
(1)、連接插件connection plugins:負責和被監控端實現通信;
(2)、host inventory:指定操作的主機,是一個配置文件里面定義監控的主機;
(3)、各種模塊核心模塊、command模塊、自定義模塊;
(4)、借助於插件完成記錄日志郵件等功能;
(5)、playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。
2、特性
(1)、no agents:不需要在被管控主機上安裝任何客戶端;
(2)、no server:無服務器端,使用時直接運行命令即可;
(3)、modules in any languages:基於模塊工作,可使用任意語言開發模塊;
(4)、yaml,not code:使用yaml語言定制劇本playbook;
(5)、ssh by default:基於SSH工作;
(6)、strong multi-tier solution:可實現多級指揮。
3、Ansible配置
目前在ansible安裝在虛擬機上,地址為20.0.9.40, 密碼為111111
Ansible的操作路徑為/etc/ansible/playbooks
(1) SSH免密鑰登錄設置
## 生成公鑰/私鑰
# ssh-keygen -t rsa -P ''
## 寫入信任文件(將/root/.ssh/id_rsa_storm1.pub分發到其他服務器,並在所有服務器上執行如下指令):
# cat /root/.ssh/id_rsa_storm1.pub >> /root/.ssh/authorized_keys
# chmod 600 /root/.ssh/authorized_keys將公鑰重定向追加到authorized_keys中,內容如下:
## 主機組定義
(2) 配置主機組 /etc/ansible/playbooks/hosts
配置完主機組之后,可以使用ansible giotest –m ping, 測試是否配置成功。
主機組配置方法:
顯示pong,證明配置成功,可以連接到節點。
使用[]來定義主機組名,使用ansible_ssh_host定義需要部署的節點地址。
方括號[]中是組名,用於對系統進行分類,便於對不同系統進行個別的管理。
把一個組作為另一個組的成員:
可以把一個組作為另一個組的子成員,以及分配變量給整個組使用. 這些變量可以給 /usr/bin/ansible-playbook 使用,但不能給 /usr/bin/ansible 使用:
[atlanta]
host1
host2
[raleigh]
host2
host3
[southeast:children]
atlanta
raleigh
4、常用模塊簡介
目前在ansible安裝在虛擬機上,地址為20.0.9.40, 密碼為111111
目錄結構
[root@root ~]# cd /etc/ansible/playbooks
[root@root playbooks]# ls
bio common file gio sn vars vio
common/ 目錄為配置部署的公共目錄,為lustre的主要裝機流程。
bio/ 為bio節點配置部署的目錄
gio/ 為gio節點配置部署的目錄
sn/ 為sn 節點配置部署的目錄
file/ 為配置部署的主要配置文件目錄
vio/ 為vio節點配置部署的目錄
例:使用ansible為gio節點安裝IBA驅動,yml文件在目錄/etc/ansible/playbooks/common
ansible-playbook install_IBA.yml --extra-vars “hosts=gio”
使用ansible為gio節點安裝rdac,yml文件在目錄/etc/ansible/playbooks/common
ansible-playbook install install_rdac.yml --extra-vars “hosts=gio”
ansible-playbook 為ansible劇本的執行命令,后面跟需要執行的yml文件, --extra-vars定義需要執行的主機組
查看ansible的所有模塊
#ansible-doc -l
查看模塊命令的具體使用方法
#ansible-doc -s user(添加模塊名)
查看遠程主機登陸信息
#ansible giotest -m command -a "uptime"
file模塊允許更改用戶及權限
ansible giotest -m file -a "dest=/srv/foo/a.txt mode=600"
使用file模塊創建目錄,類似於mkdir -p
ansible giotest -m file -a "dest=/path/to/c mode=755 owner=root group=root state=directory"
使用file模塊刪除文件或者目錄
ansible giotest -m file -a "dest=/path/to/c state=absent"
查看遠程主機的一些基本信息
#ansible giotest -m setup
測試遠程主機的運行狀態
#ansible giotest -m ping
查看遠程主機的特定進程也可將shell換成raw
#ansible storm_cluster -m shell -a "ps -ef | grep httpd"
#ansible storm_cluster -m raw -a "pa -ef | grep httpd"
遠程文件信息查看
#ansible storm_cluster -m command -a "ls -al /tmp/a.txt"
在遠程主機創建目錄
#ansible storm_cluster -m file -a "path=/tmp/test.txt state=directory"
遠程文件符號鏈接刪除
#ansible storm_cluster -m file -a "path=/tmp/a.txt state=absent"
將本地文件“/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"
重啟主機組的所有主機,每次重啟10台
#ansible storm_cluster -a "/sbin/reboot/" -f 10
使用shell模塊在遠程主機執行命令
#ansible storm_cluster -m shell -a "echo $TERM"
file模塊允許更改文件的用戶及權限
#ansible storm_cluster -m file -a "dest=/tmp/test.sh mode=600 "
創建一個新的用戶,查看並刪除
#ansible storm_cluster -m command -a "useradd -s /sbin/nologin -M user1"
#ansible storm_cluster -m command -a "id user1"
#ansible storm_cluster -m command -a "userdel user1"
后台執行命令的最大時間是1800s即30分鍾,-p每60s檢查下狀態默認15s
ansible all -B 1800 -p 60 -a "/usr/bin/long_running_operation --do-stuff"
搜集網卡信息
ansible all -m setup -a "filter=ansible_eth[0-2]"
=====================================================================
管理軟件包
config_file:yum的配置文件
disable_gpg_check:關閉gpg_check
確保rpm包已經安裝,但不更新
#ansible storm_cluster -m yum -a "name=python state=present"
確保安裝包到一個特定的版本
#ansible storm_cluster -m yum -a "name=python-2.7 state=present"
確保一個軟件包是最新版本
#ansible storm_cluster -m yum -a "name=python state=latest"
確保一個軟件包沒有被安裝
#ansible storm_cluster -m yum -a "name=python state=absent"
安裝httpd,啟動,並檢查進程
#ansible storm_cluster -m yum -a "name=httpd state=installed"
#ansible storm_cluster -m service -a "name=httpd state=started"
#ansible storm_cluster -m shell -a "ps -ef |grep httpd"
======================================================================
服務管理
確保storm_cluster組所有主機的httpd是啟動的
ansible storm_cluster -m service -a "name=httpd state=started"
重啟storm_cluster組所有主機的httpd服務
ansible storm_cluster -m service -a "name=httpd state=restarted"
確保storm_cluster組所有主機的httpd是關閉的
ansible storm_cluster -m service -a "name=httpd state=stopped"
啟動storm_cluster組所有主機的nginx服務,確保開機時啟動
ansible storm_cluster -m service -a "name=nginx state=started enabled=yes"
=====================================================================
搜集系統信息
搜索主機的所有信息
#ansible all -m setup
搜集和內存相關的信息
#ansible all -m setup -a "filter=ansible_*_mb"
===============================================================================
后台運行
長時間運行的操作可以放到后台執行,ansible會檢查任務的狀態,在主機執行的同一個任務會分配同一個job ID
后台執行命令3600s,-B表示后台執行的時間
#ansible all -B 3600 -a "/usr/bin/long_running_operation --do-stuff"
檢查任務的狀態
ansible all -m async_status -a "jid=123456789"
===============================================================================
File設置文件的屬性
相關選項如下:
force:需要在兩種情況下強制創建軟連接,一種是源文件不存在,但之后會創立的情況下;另一種是目標軟連接已存在,需要先取消之前的軟鏈,有兩個選項:yes|no.
group:定義文件/目錄的屬性
mode:定義文件/目錄的權限
owner:定義文件/目錄的屬性
path:必選項,定義文件/目錄的路徑
recurse:遞歸設置文件的屬性,只對目錄有效
src:被鏈接的源文件路徑,只應用於state=link的情況
dest:被鏈接到的路徑,只應用於state=link的情況
directory:如果目錄不存在,就創建目錄
touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已經存在,則更新其最后修改時間
absent:刪除目錄、文件或者取消連接文件
將服務器文件拷貝到不同的主機組(playbooks)
=========================================================================
User管理用戶
home: uid: name: system: state:
group: password: createhome: remove: shell:
創建一個用戶,並設置
#ansible storm_cluster -m user -a "createhome=yes home=/home/user1 password=123456 name=user2 state=present shell=/bin/bash"
==========================================================================
Mount配置掛載點
fstype:必選項,掛載文件的類型
name:必選項,掛載點
opts:傳遞給mount命令的參數
===========================================================================
Copy 復制文件到遠程主機
backup:在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項yes|no
content:用於代替“src”,可以直接設定指定文件的值
dest:必選項,要將源文件復制到遠程主機的絕對路徑,如果源文件是一個目錄,那么該路徑也必須是一個目錄
directory_mode:遞歸設置目錄的權限,默認為系統默認權限
force:如果目標主機包含該文件,但內容不同,如果設置為yes,則強制覆蓋,如果為no,則只有當前目標主機的目標位置不存在該文件夾時,才復制,默認為yes
others:所有的File模塊里的選項都可以在這里使用
src:被復制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑,如果路徑是一個目錄,它將遞歸復制,在這種情況下,如果路徑使用“/”來結尾,則只復制目錄里的內容,如果沒有使用“/”來結尾,則包含在內的整個內容全部復制。
===============================================================================
Command 在遠程主機上執行命令
create:一個文件名,當該文件存在,則該命令不執行
free_form:要執行的Linux指令
chdir:在執行命令之前,先切換到該目錄
removes:一個文件名,當該文件不存在,則該選項不執行
executeble:切換shell來執行命令,該執行路徑必須是一個絕對路徑
shell 切換到某個shell執行指定的指令
參數與command相同,與command不同的是,此模塊可以支持命令管道,同時還有另一個模塊也具備此功能:raw
===============================================================================
Cron用於管理計划任務
backup:對遠程主機上的原任務計划內容修改之前做備份
cron_file:如果指定該選項,則用該文件替換遠程主機上的cron.d目錄下的任務計划。
job:要執行的任務,依賴於state=present
special_time:指定什么時候執行,參數:reboot,yearly,monthly,weekly,daily,hourly
state:確認該任務計划是創建還是刪除
user:確定任務的執行者
每天兩點的時候以root的身份重啟主機組,取消定時任務直接添加 state=absent
#ansible storm_cluster -m cron -a '"name=root system" hour=2 user=root job="/sbin/reboot"'
查看主機組crontab的任務
#ansible storm_cluster -m command -a "crontab -l"
每隔兩分鍾的時候查看主機組的home目錄
#ansible storm_cluster -m cron -a 'name="check the home directory" minute=*/3 job="ls -lh /home"'
每次重啟的時候echo出reboot
#ansible storm_cluster -m cron -a 'name="reboot" special_time=reboot job="echo reboot"'
每天12點檢查主機組指定目錄
#ansible storm_cluster -m cron -a 'name="check dirs" hour="12" job="ls -alh > /dev/null"'
===============================================================================
Filesystem在塊設備上創建文件系統
dev:目標塊設備
force:在一個已有文件系統的設備上強制創建
fstype:文件系統的類型
opts:傳遞給mkfs的選項
===============================================================================
playbooks詳解
playbooks是ansible管理配置、部署應用和編排的語言,可以使用playbooks來描述你想在遠程主機執行的策略或者執行的一組步驟過程等。如果說ansible模塊是工作中的工具的話,那么playbooks就是方案。
Playbooks組成
Target section
定義將要執行playbook的遠程主機組
Variable section
定義playbook運行時需要使用的變量
Task section
定義將要在遠程主機上執行的任務列表
Handler section
定義task執行完成以后需要調用的任務