1. 程式人生 > >Ansible 之 概念和常用模塊介紹

Ansible 之 概念和常用模塊介紹

ansible 概念 模塊

1 概述


ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。

ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括如下的特性:

(1)、連接插件connection plugins:負責和被監控端實現通信;

(2)、host inventory:指定操作的主機,是一個配置文件裏面定義監控的主機;

(3)、模塊化,調用特定的模塊,完成特定任務,各種模塊核心模塊、command模塊、還支持自定義模塊;

(4)、借助於插件完成記錄日誌郵件等功能;

(5)、支持playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。

(6)、基於Python語言實現,由Paramiko, PyYAML和Jinja2三個關鍵模塊;

(7)、部署簡單,無agent

(8)、支持冪等性;

(9)、ansible:用於Configuration和Command and Control

本文將通過例子介紹ansible的配置和ansible的常用模塊使用



2 ansible配置介紹


安裝服務包

服務包在epel源中,直接安裝

yum -y install ansible

配置文件:/etc/ansible/ansible.cfg

主機清單:/etc/ansible/hosts

主程序:

ansible

ansible-playbook

ansible-doc

ansible的簡單使用格式:

ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS -f FORKS -C -u USERNAME -c CONNECTION

簡要命令介紹

-m指明要加載的模塊,因為不同的功能需要調用不同的模塊,模塊才是完成功能的核心,如果不指定模塊,默認是command命令,在目標主機上執行一個命令

-a 定義模塊的操作

-f:指定一批要執行機器的數量

查看所有主機

ansible all --list-hosts

查看對應組 websrvs 的所有的主機

ansible websrvs --list-hosts

檢查狀態

ansible all -m ping

執行命令,默認是模塊是command

如執行ifconfig命令

ansible all -a 'ifconfig'

等價於如下命令

ansible all -m command -a 'ifconfig'

查看模塊類列表,和模塊的功能解釋,自帶模塊叫標準模塊,可以自定義模塊。

ansible-doc -l



3 ansible的常用模塊


獲取模塊列表:ansible-doc -l

查看對應模塊詳細介紹的命令: ansible-doc -s module

Ansible:無代理模式,建議通過ssh管理, 由模塊實現相應的管理

常用模塊:

文件管理 copy, file, fetch, get_url

軟件包安裝管理:yum, easy_install, pip,apt

服務管理: service

用戶管理: group, user

任務計劃: cron, at

命令管理: command, shell

自動將腳本復制到遠端執行後刪除: script

測試管理: ping

3.1 實驗環境準備

73是ansible主機,63,,65,72,75是被管理的主機,操作前同步時間

ansibles服務包在epel源中,或者extras(僅次於os外的倉庫)包中。配置好yum源後

yum -y install ansible

在ansible主機端生成密鑰 ,或者直接在hosts文件定義時,直接寫入密碼,但是這種方式不安全,建議生成ssh 的key文件

生成ssh key,分發到到每臺需要管控的主機上

ssh-keygen -t rsa -P ''
for i in 63 65 72 75 ;do ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected].$i;done

#註意,這裏如果機器太多,可以通過except命令輸入yes和密碼實現自動化分發ssh key

73上配置如下

在hosts文件定義要管理的主機,納入同一組,一個主機可以納入多個組,

vim  /etc/ansible/hosts
[websrvs]
172.18.50.72
172.18.50.75
[dbsrvs]
172.18.50.63
172.18.50.65

完成hosts配置和認證後,不需要重啟任何服務,可以直接使用ansible

3.2 常用模塊介紹

command模塊:在遠程主機運行命令;

chdir:執行命令前切換工作目錄至指定的位置;

create=/PATH/TO/SOMEFILE+OR_DIR:如果此次給定的文件或者目錄存在,則不執行命令

remove,

removes=/PATH/TO/SOMEFILE_OR_DIR:如果此處給定的文件或目錄不存在,則不執行命令;與create相反,意為:令此處給定的文件或目錄存在時方執行命令;

例子

在172.18.50.63的/tmp下創建文件73abc和目錄test,但是遵循冪等原則,mkdir命令如果對應目錄以及存在,就會報錯

ansible 172.18.50.63 -m command -a "touch 73abc chdir=/tmp"
ansible 172.18.50.63 -m command -a "mkdir test chdir=/tmp"

查看管理主機的當前路徑,如果不更改路徑,默認在該路徑下執行操作

ansible 172.18.50.63 -m command -a "pwd"

shell模塊:在遠程主機在shell進程下運行命令,支持shell特性,如管道等;

chdir=:執行命令前切換工作目錄至指定的位置;

creates=/PATH/TO/SOMEFILE_OR_DIR:如果此處給定的文件或目錄存在,則不執行命令;

removes=/PATH/TO/SOMEFILE_OR_DIR:如果此處給定的文件或目錄不存在,則不執行命令;意為:令此處給定的文件或目錄存在時方執行命令;

executable=/PATH/TO/SHELL:指定運行命令使用的shell解釋器;

例子

完成高級shell命令,如管道命令和重定向命令,需要用shell模塊來執行,跟command命令相似

如執行以下命令,雖然沒有保存,但是更改密碼沒有成功,模塊需要指定shell模塊執行成功

ansible 172.18.50.63 -m command -a "echo test6666 | passwd --stdin test66"

正確命令

ansible 172.18.50.63 -m shell -a "echo test6666 | passwd --stdin test66"

將每臺主機上的/root/host1重定向到文件/etc/hosts裏

ansible all -m shell -a "cat /root/host1 >> /etc/hosts"

group模塊:管理組賬號

name=

state= #創建用present,刪除用absent

system=

gid=

例子

創建組test89,指定gid為1008

ansible 172.18.50.63 -m group -a "name=test89 gid=1008"

user模塊:管理用戶賬號

name=

system=

uid=

shell=

group=

groups=

comment=

home=

generate_ssh_key={true | false}

local=

例子

創建賬號sunny99,指定uid為1990

ansible 172.18.50.63 -m user -a "name=sunny99 uid=1990"

copy模塊:將文件拷貝到遠程主機

用法:

(1) src= dest=

(2) content= dest=

owner, group, mode

例子

拷貝當前目錄下的hello.sh文件到所有主機/tmp目錄下

ansible all -m copy -a "src=hello.sh dest=/tmp/ owner=daemon group=sunny mode=755"

用content直接在所有主機的目錄/tmp下生成文件hi.txt,並寫入內容

ansible all -m copy -a "content='hello,sunny\nhow are you\n' dest=/tmp/hi.txt owner=sunny group=sunny mode=664"

fetch模塊:從遠端節點取文件,會在本地對應的目錄下,即dest指定的目錄下,創建一個以主機ip命令的目錄,同時在該ip目錄下,創建src指定的目錄,將文件放到對應的目錄下

例子

從遠端的主機的/tmp下獲取hi.txt文件,放到本地的/tmp下,那麽在本地tmp下會生成以所有主機ip命名的目錄

ansible all -m fetch -a "src=/tmp/hi.txt dest=/tmp/"

get_url模塊:從互聯網上下載模塊到每一臺管理的主機,是冪等的。

get_url模塊:從互聯網上(http,https,ftp協議)下載模塊到每一臺管理的主機,是冪等的。

url=

dest=

sha256sum=

owner, group, mode

例子

下載url對應的目錄,並且保存到主機172.18.50.63的/root/blog1裏

ansible 172.18.50.63 -m get_url -a "url=http://blog.51cto.com/ghbsunny/2044309 dest=/root/blog1"

file模塊:設置文件屬性,註意file的stat比較特殊

用法:

(1) 創建鏈接文件(必須的):*path= src= state=link

(2) 修改屬性:path= owner= mode= group=

(3) 創建目錄:path= state=directory

冪等, state=directory會自動創建一個目錄

註意:state屬性的可用值:file,directory,link,hard,touch,absent

例子

創建連接

ansible 172.18.50.63 -m file -a "path=/tmp/hidirlink src=/tmp/hidir state=link"

創建目錄/tmp/hidir

ansible 172.18.50.63 -m file -a "path=/tmp/hidir state=directory"

修改目錄/tmp/hidir的屬性

ansible 172.18.50.63 -m file -a "path=/tmp/hidir mode=666 owner=sunny"

創建文件hitxt,並修改相關屬性

ansible 172.18.50.63 -m file -a "path=/tmp/hitxt state=touch owner=sunny mode=770"

cron 模塊:管理 cron.d 和 crontab條目.

minute=

day=

month=

weekday=

hour=

*job= #定制任務

*name= #表示以誰的身份身份編輯,不是遠端運行的賬號,crontab條目的描述,或者如果設置了env,則是環境變量的名稱。 如果state = absent,則是必需的。註意,如果沒有設置name和state = present,那麽總是會創建一個新的crontab條目,而不管現有條目是什麽。

user= #表示該計劃任務在遠程主機以誰的身份運行,遠程主機需要擁有該賬號

state=

present:創建

absent:刪除

例子

創建一個計劃任務,其中,遠程主機以sunny賬號執行該計劃任務

ansible 172.18.50.63 -m cron -a "minute=00 hour=*/6 day=3 state=present user=sunny job='/usr/sbin/ntpdate 172.18.50.61'"

hostname模塊:管理主機名

name=

例子

更改主機名為CentOS6CC

ansible 172.18.50.63 -m hostname -a "name=CentOS6C"

pip模塊:管理python的庫依賴管理模塊

name=

state=

version=

npm模塊:用npm管理node.js包,:實現安裝功能的組件

yum模塊:使用“yum”包管理器管理包

name=:程序包名稱,可以帶版本號;

state=

present, latest,installed:安裝

absent,remove:卸載

其他的包管理工具:apt(debian),zypper(suse), dnf(fedora),rpm,dpkg

例子

安裝tree包

ansible 172.18.50.63 -m yum -a "name=tree state=latest"

查看tree包信息,這裏使用默認的command模塊查看

ansible 172.18.50.63  -a "rpm -qi tree"

service模塊:管理服務

*name= *星號表示必須選項

state=

started

stopped

restarted

enabled=

runlevel=

例子

啟動mysql服務

ansible 172.18.50.63 -m service -a "name=mysqld state=started"

setup模塊:獲取facts,收集每個主機的變量

例子

獲取172.18.50.72主機的變量

ansible 172.18.50.72 -m setup

git模塊:版本追蹤和管理的工具

repo:倉庫路徑

dest=目標路徑

version=指明獲取的版本,默認是獲得最新的版本

例子

從git hub上下載代碼

推送git 版本,服務器和遠程主機都要安裝git命令才能實現

ansible 172.18.50.63 -m git -a "repo=https://github.com/happyfish100/fastdfs.git dest=/tmp/fastdfs"

實現如下命令的作用

直接下載git hub上的代碼

git clone https://github.com/happyfish100/fastdfs.git

deploy_helper:部署模塊

haprxoy 模塊:

backend=

host=

state=

weight=



Ansible 之 概念和常用模塊介紹