馬哥出品 ansible中文文檔:http://www.ansible.com.cn/index.htmlhtml
ansible介紹:python
ansible是個什麼東西呢?官方的title是「Ansible is Simple IT Automation」——簡單的自動化IT運維管理工具。這個工具的目標有這麼幾項:讓咱們自動化部署APP;自動化管理配置項;自動化的持續交付;自動化的(AWS)雲服務管理。基於Python開發,可實現對多臺服務器進行批量配置、程序的部署及指令的運行。大大減小了在運維工程中的工做量。mysql
ansible是基於模塊工做的,自己沒有批量部署的能力。真正具備批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:sql
(1)、鏈接插件connection plugins:負責和被監控端實現通訊;shell
(2)、host inventory:指定操做的主機,是一個配置文件裏面定義監控的主機;apache
(3)、各類模塊核心模塊、command模塊、自定義模塊;json
(4)、藉助於插件完成記錄日誌郵件等功能;centos
(5)、playbook:劇本執行多個任務時,非必需可讓節點一次性運行多個任務。安全
ansible特色:
服務器
1.簡單,ansible天然的自動化語言與容許運維人員,開發者,和IT管理人員在很短的時間內完成自動化項目。
2.無代理,默認使用SSH而不須要客戶端。避免了額外的端口開啓,提升安全性,避免沒必要要的管理,減小CPU的使用
3.乾的活多,ansible能幹自動完成軟件部署,配置管理,流程化管理,和cloud provisioning。
ansible安裝:
因爲ansible是用python開發的,安裝過程當中依賴衆多python模塊,這裏建議yum安裝ansible,想要更新版本的可下載源碼編譯安裝,
yum install ansible -y
yum安裝ansible的默認配置文件路徑,ansible.cfg是ansible的主配置文件,
ansible]# ls /etc/ansible/
ansible.cfg hosts roles
hosts是默認的hostfile路徑,可配置DNS域名,ip。
經過ssh key方式鏈接遠端客戶機,省去密碼環節
ssh-keygen -t rsa -P ''
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.137.130
注意這個地方是有個坑的,因爲ansible執行的時候須要把臨時模塊拷貝到客戶端,而默認的拷貝方式是經過sftp來的方式拷貝的,若是你的客戶端沒有裝sftp,那麼執行ansible會出錯的。
若是沒裝sftp能夠用scp。 下面的這一行原本是註釋起來的,把註釋去掉就OK了
ansible]# grep "scp_if_ssh" /etc/ansible/ansible.cfg
scp_if_ssh = True
還有個坑,即便裝了sftp也不必定能用,你的ssh要啓用它才OK。
ansible]# grep "Subsystem" /etc/ssh/sshd_config
Subsystem sftp /usr/lib/openssh/sftp-server
ansible的基本工做流程:
1.ansible經過OPENSSH或者python的pramamiko鏈接客戶端
2.把ansible module推送到客戶端。
ansible]# grep "remote_tmp" /etc/ansible/ansible.cfg
remote_tmp = $HOME/.ansible/tmp
ansible]# ansible one -a "ls ~/.ansible"
salt-master | success | rc=0 >>
tmp
3.經過ssh執行客戶端上的ansible module
4.執行完畢
5.刪除剛剛推送過去的ansible module
ansible基本命令行模塊:
ansible-doc -s 模塊名 ##查看模塊用法幫助
ansible-doc -l ##查看有哪些可用模塊
1.臨時作小事情或一次性行爲可用命令行,大型或常常重複使用的活用play-book
2.命令行三劍客:command(默認),shell(支持管道,變量,),raw(客戶機不能裝python時使用)
3.官方建議用command,shell和raw須要用到的時候再用
command:命令模塊,默認模塊,用於遠程執行命令
-a 'COMMAND'
ansible]# grep -n "module_name" ansible.cfg
97:#module_name = command
ansible all -a 'date'
user:
-a 'name= state={present|absent} system= uid='
# ansible one -m user -a 'name=mysql uid=306 system=yes group=mysql'
# ansible one -m user -a 'name=mysql shell=/sbin/nologin createhome=no'
group:
-a 'name= gid= state= system='
# ansible one -m group -a 'name=mysql gid=306 system=yes'
cron:修改定時任務
-a 'name="" minute= hour= day= month= weekday= job= user= state='
state狀態
present:增長
absent:刪除,配置name就可移除
# ansible one -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"'
copy:複製文件到遠程主機
-a 'dest= src= mode= owner= group='
src=:定義本地源文件路徑
dest=:定義遠程目標文件路徑
content=:取代src=,表示直接用此處指定的信息生成目標文件內容;
# ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=/root mode=640'
# ansible all -m copy -a 'content="Hello Ansible\nHi MageEdu" dest=/tmp/test.ansible'
file:設定文件屬性
-a 'path= mode= owner= group= state={directory|link|present|absent} src='
path=:指定文件路徑,可使用name或dest來替換
建立文件的符號連接
src=:指明源文件
path=:指明符號連接文件路徑
# ansible all -m file -a 'path=/tmp/fstab.link src=/tmp/fstab.ansible state=link'
# ansible all -m file -a "path=/tmp/resolv.conf state=absent"
# ansible salt-master -m file -a 'dest=/tmp/ansible.log owner=lixc group=lixc mode=644
state=touch' #touch:遠程主機建立文件
force:須要在兩種狀況下強制建立軟連接,
一種是源文件不存在,但以後會創建的狀況下;
另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no
group:定義文件/目錄的屬組
mode:定義文件/目錄的權限
owner:定義文件/目錄的屬主
path:必選項,定義文件/目錄的路徑
recurse:遞歸設置文件的屬性,只對目錄有效
src:被連接的源文件路徑,只應用於state=link的狀況
dest:被連接到的路徑,只應用於state=link的狀況
state:
directory:建立遞歸文件,若是目錄不存在,就建立目錄,
file:即便文件不存在,也不會被建立
link:建立軟連接
hard:建立硬連接
touch:若是文件不存在,則建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間
absent:刪除目錄、文件或者取消連接文件
ping:測試指定主機可否鏈接
yum:安裝程序包
-a 'name= state={present|latest|absent}'
name:指明要安裝的程序包,能夠帶上版本號
state=:present,latest表示安裝,absent表示卸載
# ansible one -m yum -a 'name=mysql-server state=latest|installed'
還有一個後臺執行的功能。
-B 30是設置後臺執行時間爲30秒,
-P2是沒兩秒鐘報告一次狀態,這個當你的任務要執行很長時間的時候能夠用。
# ansible one -m yum -a 'name=apache2 state=installed' -B 30 -P2 >>/dev/null
service:指定運行狀態
-a 'name= state={started|stopped|restarted} enabled='
name=:服務名稱
state=:狀態,取值有started,stopped,restarted
enabled=:是否開機自動啓動,取值爲true或者false
shell: ##可支持管道,變量,command模塊不支持,
例:echo "centos" |passwd --stdin centos
# ansible storm_cluster -m shell -a "/tmp/rocketzhang_test.sh"
script: ##將本地腳本複製到遠程主機並運行之;要使用相對路徑指定腳本
-a '/path/to/script'
setup: ##收集遠程主機的facts
每一個被管理節點在接收並運行管理命令以前,會將本身主機相關信息,如操做系統版本,ip地址等報告給遠程的ansible主機
Inventory的默認路徑是在/etc/ansible/hosts,分爲靜態和動態兩種
靜態:須要手工的把你要管理的主機寫進去。
動態:事先有一個資源管理系統,裏面有全部主機信息,用腳本程序把資源管理系統裏的信息給拉過來,以json格式呈現
配置靜態Inventory:
ansible]# cat -n /etc/ansible/hosts
1 [alltest:children]
2 salt
3 leihuo
4
5 [salt]
6 salt-master ansible_ssh_user=lixc ansible_ssh_pass=123456
7 10.240.162.112 ansible_connection=paramiko
8
9 [leihuo]
10 lixc ansible_ssh_host=192.168.131.203 ansible_ssh_port=21100
11 10.240.162.11[1:9]:22
第1行,alltest這個組包含倆子組分別是下面的salt,和leihuo
第6行能夠設置主機的默認鏈接用戶,及密碼
第7行能夠設置ssh的鏈接方式,默認是openssh,我這裏用paramiko,不用官網推薦用openssh,由於openssh查詢key的時候,很耗時,效率不高。
第10行,能夠給主機隨便取個別名,這裏的「lixc」就是一個別名,若是ssh默認端口不是22,這裏能夠
指定特定的端口,
指定ssh端口也能夠像第11行,這麼指定。
不過以上兩種指定ssh端口方法,只針對咱們有少部分的主機是特殊端口,若是咱們全部主機都是指定的端口,配置文件裏有個選項,改爲咱們須要的端口就OK了,修改後對全局有效
ansible]# grep "remote_port" /etc/ansible/ansible.cfg
remote_port = 22
第7行和11行,是倆相同的主機,說明同一主機能夠在不一樣的組中。在現實當中就像我一臺服務器便可以裝mysql也能夠裝apache是一個道理。
變量:
ansible的變量主要給後面的playbook使用,分爲主機變量和組變量
ansible]# cat -n /etc/ansible/hosts
1 [alltest:children]
2 salt
3 leihuo
4
5 [salt]
6 salt-master salt-port=4505 mysql-port=3306
7 10.240.162.112 salt-path=/usr/bin/salt-call
8
9 [leihuo]
10 lixc ansible_ssh_host=192.168.131.203 ansible_ssh_port=21100
11 10.240.162.11[1:9]:22
12 [alltest:vars]
13 ls-path=/bin/ls
14 liss=lisisi
6,7行設置主機變量
12-14行,設置的爲alltest這個組的變量。組變量就是,我這個組的成員均可以用
固然咱們也能夠不在/etc/ansible/hosts裏面定義變量,也能夠把變量寫進單獨的文件裏,不過變量定義的形式就不是誰=誰,這麼個形式了。而是遵循yaml語法的key: value的形式。
把變量寫進文件:
ansible]# for dir in {host_vars,group_vars};do ls /etc/ansible/${dir};done
10.240.162.112 salt-master
alltest
文件定義格式:
ansible]# cat /etc/ansible/host_vars/salt-master
---
salt-port: 4505
mysql-port: 3306
ansible目標主機匹配patterns:
匹配全部主機
*或者all
匹配多個組
salt:leihuo
在salt這個組裏,但不能在leihuo這個組裏的主機
salt:!leihuo
取兩個組的交集
salt:&leihuo
排除某一主機
ansible-playbook site.yaml --limit salt-msater
固然也能夠用正則,在/etc/ansible/hosts裏面去定義。如
~salt(master|minion)\.li*\.com