Ansible簡介
Ansible是自動化運維的工具,基於Python開發,實現了批量系統配置、批量程序部署、批量運行命令等功能。
Ansible是基於模塊工作的,ansible提供一個框架,通過模塊實現批量部署。
Ansible是一種配置管理工具
Ansible不需要安裝客戶端軟件
Ansible的功能實現基於SSH遠程連接服務
安裝
安裝方法有多種,可以下載源碼后編譯安裝,可以從git上獲取資源安裝,可以直接yum安裝。也可以pip安裝。
1、使用yum安裝
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install ansible -y
查看ansible版本
ansible --version
2、源碼安裝
源碼安裝需要python2.6以上版本,其依賴模塊paramiko、PyYAML、Jinja2、httplib2、simplejson、pycrypto模塊,以上模塊可以通過pip或easy_install 進行安裝
3、pip安裝
pip是專門用來管理Python模塊的工具,Ansible會將每次正式發布都更新到pip倉庫中。所以通過pip安裝或更新Ansible,會比較穩妥的拿到最新穩定版。
目錄說明
tree /etc/ansible/
/etc/ansible/
├── ansible.cfg # ansible的配置文件
├── hosts # ansible的主倉庫 用來存儲需要管理的遠程主機的相關信息
└── roles #角色,一套文件夾,里面定義了例如變量,具體任務task。Role里面定義的內容可以實現某些特殊功能,而你在使用不通的腳本過程中可以導入Role來實現某一個功能。而不用重復寫
常用命令
幫助文檔
ansible-doc可以列出相關的幫助
ansible-doc -l 列出ansible的模塊,通常結合grep來篩選。
ansible-doc -s XXX 選項可以獲取指定模塊的使用幫助。
利用ansible遠程批量執行命令
語法: ansible ceshi -m command -a 'uptime' ansible 主機組 -m ansible內置功能模塊名 -a 命令
ad-hoc常用模塊
1、copy模塊
從本地copy文件分發到目錄主機路徑
參數說明:
src= 源文件路徑
dest= 目標路徑
注意src= 路徑后面帶/ 表示帶里面的所有內容復制到目標目錄下,不帶/是目錄遞歸復制過去
content= 自行填充的文件內容
owner 屬主
group 屬組
mode權限
ansible all -m copy -a "src=/ceshi/123.sh dest=/tmp/fstab.ansible mode=600"
2、fetch模塊
從遠程主機拉取文件到本地
fetch使用很簡單,src和dest,dest只要指定一個接收目錄,默認會在后面加上遠程主機及src的路徑
ansible all -m fetch -a "src=/tmp/hi.txt dest=/ceshi"
3、command模塊
在遠程主機上執行命令,屬於裸執行,非鍵值對顯示;不進行shell解析;
默認模塊
ansible all -m command -a "ifconfig"
4、shell模塊
由於commnad只能執行裸命令(即系統環境中有支持的命令),至於管道之類的功能不支持,
shell模塊可以做到
ansible all -m shell -a "ifconfig|grep lo"
5、file模塊
設置文件屬性(創建文件)
常用參數:
path目標路徑
state directory為目錄,link為軟件鏈接
group 目錄屬組
owner 屬主
recurse:遞歸設置文件的屬性,只對目錄有效
其他參數通過ansible-doc -s file 獲取
ansible all -m file -a "path=/tmp/hello state=directory" #創建文件夾 ansible all -m file -a "src=/tmp/hi.txt path=/var/tmp/hi.link state=link" #創建軟鏈接
6、cron模塊
通過cron模塊對目標主機生成計划任務
常用參數:
除了分(minute)時(hour)日(day)月(month)周(week)外
name: 本次計划任務的名稱
state: present 生成(默認) |absent 刪除 (基於name)
ansible all -m cron -a "minute=*/1 job='/usr/sbin/update time.windows.com &>/dev/null' name=update_time" #對各主機添加每隔1分鍾從time.windows.com同步時間 #此時登陸任意節點查看crontab任務 [root@localhost tmp]# crontab -l #Ansible: update_time */1 * * * * /usr/sbin/update time.windows.com &>/dev/null ansible all -m cron -a "name=update_time state=absent" #刪除計划任務 #此時登陸查看,計划任務已經被刪除
7、yum模塊
故名思義就是yum安裝軟件包的模塊;
常用參數說明:
enablerepo,disablerepo表示啟用與禁用某repo庫
name 安裝包名
state (present' or
installed', latest')表示安裝, (
absent' or `removed') 表示刪除
ansible all -m yum -a "name=epel-release state=installed" #通過安裝epel擴展源並安裝nginx ansible all -m yum -a "name=nginx state=installed"
8、service模塊
服務管理模塊
常用參數:
name:服務名
state:服務狀態
enabled: 是否開機啟動 true|false
runlevel: 啟動級別 (systemed方式忽略)
ansible all -m service -a "name=nginx state=started enabled=true"
9、script模塊
把本地的腳本傳到遠端執行;前提是到遠端可以執行,不要把Linux下的腳本同步到windows下執行;
#創建一個腳本文件 [root@localhost ceshi]# more appe.sh #!/bin/bash echo "ansible script test!" > /tmp/ansible.txt #執行 ansible all -m script -a "/ceshi/appe.sh" #此時目標端查看根據腳本內容已經產生了相應的文件
參數配置
1、環境配置
Ansible配置以ini格式存儲配置數據,在Ansible中幾乎所有配置都可以通過Ansible的Playbook或環境變量來重新賦值。
在運行Ansible命令時,命令將會按照以下順序查找配置文件。
ANSIBLE_CONFIG
:首先,Ansible命令會檢查環境變量,及這個環境變量指向的配置文件。./ansible.cfg
:其次,將會檢查當前目錄下的ansible.cfg配置文件。~/.ansible.cfg
:再次,將會檢查當前用戶home目錄下的.ansible.cfg配置文件。/etc/ansible/ansible.cfg
:最后,將會檢查在用軟件包管理工具安裝Ansible時自動產生的配置文件。
2、ansible.cfg配置參數
Ansible有很多配置參數,以下是幾個默認的配置參數:
inventory = /etc/ansible/hosts library = /usr/share/my_modules/ forks = 5 sudo_user = root remote_port = 22 host_key_checking = False timeout = 20 log_path = /var/log/ansible.log
inventory
:該參數表示inventory文件的位置,資源清單(inventory)就是Ansible需要連接管理的一些主機列表。library
:Ansible的所有操作都使用模塊來執行實現,這個library參數就是指向存放Ansible模塊的目錄。forks
:設置默認情況下Ansible最多能有多少個進程同時工作,默認5個進程並行處理。具體需要設置多少個,可以根據控制端性能和被管理節點的數量來確定。sudo_user
:設置默認執行命令的用戶,也可以在playbook中重新設置這個參數。remote_port
:指定連接被管理節點的管理端口,默認是22,除非設置了特殊的SSH端口,否則不需要修改此參數。host_key_checking
:設置是否檢查SSH主機的密鑰。可以設置為True或False。即ssh的主機再次驗證。timeout
:設置SSH連接的超時間隔,單位是秒。log_path
:Ansible默認不記錄日志,如果想把Ansible系統的輸出記錄到日志文件中,需要設置log_path。需要注意,模塊將會調用被管節點的(r)syslog來記錄,執行Ansible的用戶需要有寫入日志的權限。
3、ssh配置互信
將ansible server的ssh公鑰分發到各被管節點上。
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N '' ssh-copy-id root@10.17.12.60 ssh-copy-id cloud@10.17.12.100
此處我測試了root用戶以及一個普通用戶
ansible組件
Inventory
默認的Ansible的Inventory是一個靜態的INI格式的文件/etc/ansible/hosts
1.1.1.1 ansible_ssh_user=root ansible_ssh_pass='123456' #定義了一個1.1.1.1的主機,然后使用內置變量定義了SSH登陸用戶以及密碼 [docker] #定義一個組叫docker 1.1.1.2[1:3] #定義docker組下面3台主機1.1.1.21-1.1.1.23 [docker:vars] #對docker組使用inventory內置變量定義了SSH登錄密碼 ansible_ssh_pass='123456' #對docker組使用inventory內置變量定義了SSH登錄密碼 [ansible:children] #定義了一個組叫ansible,這個組下面包含docker組 docker #定義了一個組叫ansible,這個組下面包含docker組
ansible支持多個inventory文件,這樣更加方便我們管理不同業務或者不同環境中的機器。
1、首先需要修改ansible.cfg中hosts文件的定義,使之不再指向某個文件夾,而是指向某個目錄
2、在inventory文件夾下新建兩個文件測試使用
3、使用list-hosts參數驗證