1. 程式人生 > >Ansible基礎

Ansible基礎

linux ansible

介紹:

ansible是基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點

具有批量系統配置、批量程序部署、批量運行命令等功能。

是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。


操作:


以下通過實際演練來更好的理解ansible的工作原理

使用三臺機器組建ansible使用環境

註意:三臺主機要網絡同步時間,101主機作為ansible控制機,106和107主機作為普通服務器

yum -y install ansible

#安裝ansible

基於密鑰進行ssh認證

配置/etc/ansible/hosts

ssh-keygen -t rsa -P ‘‘

for i in 106 107;do ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected].$i ;done

ansible -help
-m   指定調用的模塊
-a   每個模塊都有自己的專有的參數,指定此模塊參數
-f   指定每批處理多少臺主機,默認5臺
#更多的參數可自行了解
eg:
ansible all --list-hosts   #列出當前處於同一模式的所有主機
ansible webservers --list-hosts
ping模塊:

ansible all -m ping                 #測試ansible到各個服務器的連通性
192.168.1.106 | SUCCESS => {         #狀態是成功的,即連通性是沒問題
    "changed": false,           #修改狀態是失敗,說明我們未做任何修改操作
    "ping": "pong"            #ansible發出ping驗證,對方返回pong告知連接正常
}
192.168.1.107 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
ansible-doc  -h   #查看ansible文檔的幫助信息
ansible-doc  -l      #列出ansible支持的所有模塊信息,如上文只能中的ping模
ansible-doc -s command
#查看指定模塊的參數信息,command是一種常用的模塊,默認不指定模塊時就是使用command

command模塊:

[root@node1 ~]#ansible 192.168.1.106 -m command -a ‘pwd chdir=/app‘
#在執行命令pwd之前,先cd進入chdir指定的目錄,所以結果顯示目錄是/app而不是root的家目錄
#-m指定模塊,-a指定參數(基本都是鍵值對),只是這裏的參數實際上是兩臺命令一個是pwd,一個是chdir,而這兩個命令又有先後之分

ansible 192.168.1.106 -m command -a ‘mkdir dir  chdir=/app creates=dir‘
#創建目錄dir,creates表示如果dir已經存在就不再執行mkdir操作,直接跳過。此過程實現冪等性
#冪等:執行一次和執行多次的結果都是一樣的
#creates表示指定路徑文件不存在才執行指令,而removes則相反,表示指定路徑文件存在才執行指令
#creates和removes含義相反,註意區分,而且他們都是針對指定目錄下的文件而不針對用戶或進程操作

command模塊是不能是被shell語法的,所有在用到如bash類的shell時可以使用shell模塊
ansible all -m shell -a "echo centos| passwd --stdin user1"   
#shell模塊與command模塊基本相同,只是此模塊支持shell類型的語法
#如果換成command模塊,則結果是echo後的內容全部作為字符串輸出,即command是不識別管道和passwd等shell語言的

user和group模塊:

group模塊:
ansible webservers -m group -a ‘name=group1 system=yes  state=present‘
#使用group組模塊,向webservers中創建組gruop1,並且是系統組,present是創建此組的含義,absent是刪除此組的意思
192.168.1.106 | SUCCESS => {
    "changed": true, 
    "gid": 983, 
    "name": "group1", 
    "state": "present", 
    "system": true
}
#組id、組名稱、狀態、系統組,操作成功

user模塊:
ansible webservers -m user -a "name=tomm groups=group1 state=present uid=20000 shell=/bin/csh"
#創建tomm用戶,指定輔助組、uid和shell類型,創建present,
192.168.1.106 | SUCCESS => {   #上述操作成功
    "changed": true, 
    "comment": "", 
    "createhome": true,      #創建家目錄
    "group": 20000,          #
    "groups": "group1", 
    "home": "/home/tomm",    #未指定用戶家目錄,則采用默認
    "name": "tomm", 
    "shell": "/bin/csh", 
    "state": "present", 
    "system": false,   #表示不是系統用戶
    "uid": 20000
}
#此時webservers組內的成員都創建了用戶tomm

copy模塊:

將文件復制到遠程位置
ansible webservers -m copy -a ‘src=/root/aaa dest=/app/ owner=daemon group=nobody mode=664‘ 
#使用copy模塊,將本地的aaa文件復制到遠程主機webservers組中,並修改用戶/組和權限
192.168.1.106 | SUCCESS => {
    "changed": true, 
    "checksum": "7272fa0670a2f6d5cf0f5c1e6f31641fad625bf8", 
    "dest": "/app/aaa", 
    "gid": 99, 
    "group": "nobody", 
    "md5sum": "890b22b2dc6ff3f00f2374dce5634526", 
    "mode": "0664", 
    "owner": "daemon", 
    "secontext": "system_u:object_r:default_t:s0", 
    "size": 1493, 
    "src": "/root/.ansible/tmp/ansible-tmp-1510928315.78-72588321449487/source",  #生成臨時文件,而不是直接將源文件復制過去
    "state": "file", 
    "uid": 2
}
#此時對aaa文件進行修改後在執行此操作,會發現changed字段依然是true,原因是aaa修改後的hash值改變了

ansible webservers -m copy -a "content=‘hello,ansible‘ dest=/app/bbb owner=daemon group=nobody mode=664"
#本機沒有源文件而只是指定字符串,到目標webservers組,即遠程主機上就會生成bbb文件,並設置成相應的所屬用戶權限等信息
#content只是修改文件內容,如果針對文件本身屬性進行操作,可以使用file模塊

file模塊:



























本文出自 “a_pan” 博客,謝絕轉載!

Ansible基礎