Ansible
Ansible 自動化運維工具 基於python開發,可實現批量系統配置、批量程序部署、批量運行命令等
Ansible 安裝
Ansible需要主機python版本達到2.7或以上;不支持windows系統
Centos6版本需要安裝epel源之後纔可以安裝Ansible
安裝包地址 https://releases.ansible.com/ansible/rpm/release/epel-7-x86_64/
Ansible 基本概念
任何安裝Ansible的機器都可以是控制節點;
你可以從任意控制節點調用 /usr/bin/ansible 執行一條任務或 /usr/bin/ansible-playbook 讀取劇本執行多個任務
使用Ansible管理的網絡設備和服務器都是受管節點,受管節點也可以叫做 ‘主機‘
受管節點的列表;Ansible在管理某個節點前,需要將節點添加到 ”主機清單文件“ 中,清單文件可以爲每個受管節點指定信息,列如IP、port 也可以把主機分成主機組管理
Ansible執行代碼的單位,Ansible自帶許多模塊每個模塊都有指定用途;可以通過任務調用單個模塊
Ansible執行的單位,可以使用臨時命令一次執行一個任務
任務的有序列表文件,可以重複讀取劇本文件重複運行劇本內容的任務
Ansible 部署
控制節點和受管節點通信是通過openssh建立,建立通信時需要密碼認證很不方便所以先做免密鑰登陸
## 生成密鑰對
ssh-keygen
## 拷貝公鑰到受管節點
ssh-copy-id user@ip
vim /etc/ansible/hosts
[server_name]
10.0.0.2[2:3] ## 批量添加一個範圍的受管節點IP
10.0.0.21 ## 添加指定的受管節點IP
ansible 主機/主機組 -m 模塊 -a '模塊參數'
Ansible 模塊
檢查目標主機是否在線
例:ansible 主機/主機組 -m ping
Centos 系統上安裝命令
name:指定安裝包的名字
state:latest(安裝最新版本)、present(默認安裝)、installed(安裝)、absent(卸載)、removed(卸載)
例:ansible 主機/主機組 -m yum -a ‘name=httpd state=latest’
command 模塊用來執行系統命令,但不支持shell下的特殊符號 如:| && 等...
例:ansible 主機/主機名 -m command -a 'echo 你好'
shell 模塊和 command 模塊使用方法基本一致,但可以支持shell的特殊符號
例:ansible 主機/主機名 -m shell -a 'cd /opt/ && touch a.txt'
service 模塊用來管理 centos 上的服務的啓動、關閉、重啓、重載
name:服務名
state:started(啓動)、stopped(停止)、restarted(重啓)、reloaded(重載)
enabled:默認 no,將服務設置爲開機自啓
例:ansible 主機/主機名 -m service -a 'name=服務名 state=started enabled=yes'
file 模塊用來創建文件、目錄、鏈接文件
group:定義文件/目錄的屬組
owner:定義文件/目錄的屬主
mode:定義文件/目錄的權限
dest:被鏈接到的路徑,只應用於 state=link 的情況
src:被鏈接的源文件路徑,只應用於 state=link 的情況
pecurse:遞歸設置文件的屬性,只對目錄有效
state:
directory:如果目錄不存在,就創建
file:文件不存在,也不會創建
link:創建軟鏈接
hard:創建硬鏈接
touch:如果文件不存在,就創建;如果文件存在,就更新時間戳
absent:刪除目錄、文件或取消鏈接文件
例:ansible 主機/主機組 -m file -a 'path=/ect/a.txt state=touch'
user 模塊用來創建用戶
uid:指定uid
home:指定創建的家目錄
groups:指定用戶組
name:創建的用戶名
shell:指定用戶登陸的shell環境
remove:刪除用戶家目錄,默認 no
password:設置密碼,密碼需要爲密文
createhome:是否創建家目錄 yes/no
state:創建/刪除 (present,absent) 默認爲 present
例:ansible 主機/主機組 -m user -a 'name=tom state=absent remove=yes' #刪除tom用戶並刪除家目錄
group 模塊用來創建用戶組
gid:指定gid
name:指定用戶名
system:指定創建的用戶在是否爲系統組,false true 默認爲false gid小於1000爲系統組
state:創建/刪除 (present,absent)
例:ansible -m group -a 'name=tom gid=6666 state=present'
copy 模塊用來複制文件至目標主機
src:需要copy的文件或目錄
dest:拷貝至目標主機的哪個路徑,dest爲必須參數
content:當不使用src指定拷貝文件時,可以使用content直接指定文件內容
backup:是否將目標主機同名文件備份 yes/no 默認no
force:當存在同名文件並且文件內容不同時,是否覆蓋 yes/no 默認yes
mode:指定拷貝到目標主機後文件的權限
owner:指定拷貝到目標主機後文件的屬主
group:指定拷貝到目標主機後文件的屬組
directory_mode:遞歸授權
例:ansible all -m copy -a 'src=/etc/a.txt dest=/etc/'
unarchive 模塊用來解壓文件
copy:解壓文件前,是否將文件複製到遠程主機 yes/no 默認no
creates:指定一個文件名,當該文件存在時,則解壓指令不執行
dest:存放解壓後的文件的絕對路徑 遠程主機
group:解壓後的目錄或文件的屬組
mode:解壓後文件的權限
src:需要解壓文件的絕對路徑
owner:解壓後文件或目錄的屬主
例:ansible 主機/主機組 -m unarchive -a ‘src=/root/nginx.tar.gz dest=/opt/ group=www ower=www mode=777’
get_url 模塊主要用於http、ftp、https服務器上下載文件
url:指定要下載的文件的url地址
例:ansible webservers -m get_url -a ‘url=http://nginx.org/download/nginx-1.15.7.tar.gz dest=/root/’
使用rsync同步文件,將主控方目錄推送到指定節點的目錄下;使用此模塊需要先安裝rsync
delete: 刪除不存在的文件,delete=yes 使兩邊的內容一樣(即以推送方爲主),默認no
src: 要同步到目的地的源主機上的路徑,如果路徑使用”/”來結尾,則只複製目錄裏的內容,如果沒有使用”/”來結尾,則包含目錄在內的整個內容全部複製
dest:目的地主機上將與源同步的路徑
dest_port:默認目錄主機上的端口 ,默認是22,走的ssh協議。
mode: push或pull,默認push,一般用於從本機向遠程主機上傳文件,pull 模式用於從遠程主機上取文件。
rsync_opts:通過傳遞數組來指定其他rsync選項
fetch 模塊用於從遠程機器獲取文件,並將其本地存儲在由主機名組織的文件樹中。
src:遠程系統上要獲取的文件;這必須是一個文件,而不是一個目錄
dest:保存文件的目錄
flat:允許您覆蓋將目標文件添加到主機名/ path / to / file的默認行爲
setup 模塊用於收集遠程主機的一些基本信息
ansible_all_ipv4_addresses:僅顯示ipv4的信息
ansible_devices:僅顯示磁盤設備信息
ansible_distribution:顯示是什麼系統,例:centos,suse等
ansible_distribution_major_version:顯示是系統主版本
ansible_distribution_version:僅顯示系統版本
ansible_machine:顯示系統類型,例:32位,還是64位
ansible_eth0:僅顯示eth0的信息
ansible_hostname:僅顯示主機名
ansible_kernel:僅顯示內核版本
ansible_lvm:顯示lvm相關信息
ansible_memtotal_mb:顯示系統總內存
ansible_memfree_mb:顯示可用系統內存
ansible_memory_mb:詳細顯示內存情況
ansible_swaptotal_mb:顯示總的swap內存
ansible_swapfree_mb:顯示swap內存的可用內存
ansible_mounts:顯示系統磁盤掛載情況
ansible_processor:顯示cpu個數
ansible_processor_vcpus:顯示cpu個數(只顯示總的個數)
例:ansible 主機/主機組 -m setup -a 'filter=ansible_processor_vcpus'
script 模塊在遠程主機上執行主控制端的腳本,相當於 scp+shell
例:ansible 主機/主機組 -m script -a '/root/test.sh'
stat 模塊用於獲取遠程文件的狀態信息,包括atime、ctime、mtime、md5、uid、gid等...
例:ansible 主機/主機組 -m stat -a "path=/etc/sysctl.conf"
cron 模塊遠程主機crontab配置
例:ansible all -m cron -a "name='test' hour='2-5' minute='*/5' day='1' month='3,4' weekday='1' job='ls -l' user=tom"
mount 模塊掛載文件系統
src:設備文件路徑
path:掛載點路徑
fstype:掛載文件系統類型
opts:掛載方參數信息
state:
absent:卸載,清除fstab內的掛載信息
umounted:卸載,不清除fstab的掛載信息
present:不掛載,只添加到fstab文件
mounted:掛載,添加到fstab文件
例:ansible all -m mount -a 'apth=/tmp/app src=/dev/sdb fstype=ext4 state=mounted opts=rw'
Ansible 劇本
tasks 任務集
varniables 內置變量 或 自定義變量在playbook中調用
tmeplate 模板
handlers 和 notify結合使用,由特定條件觸發的操作,滿足條件就會執行,否則不執行
roles 角色
playbook使用yaml語法格式,後綴可以是yaml 或 yml
在playbook文件中,可以使用 ‘---’ 區分多個play,‘---’ 表示play的開始;‘...’ 用來表示play的結尾,可省略
使用 # 號註釋代碼
縮進必須同一,不能空格和tab混用
縮進級別必須一致,同樣的縮進表示同樣的級別,程序判斷配置的級別是通過縮進結合換行實現
YAML文件內容區分大小寫
k/v 的值可以同行寫也可以換行寫。同行使用 ‘ : ’ 分隔
v 可以是字符串,也可以是列表
一個完整的代碼塊功能至少需要 name: task
例:
vim playbook.yml
--- #固定格式
- hosts: 主機/主機組 #定義需要執行主機
remote_user: root #遠程用戶
become: yes #切換用戶運行
become_user: mysql #切換用戶爲 mysql
vars: #定義變量
http_port: 8088 #變量
tasks: #定義一個任務的開始
tags: touch_playbook.txt #定義一個標籤
- name: create new file #定義任務的名稱
file: name=/tmp/playtest.txt state=touch #調用模塊,具體要做的事情
- name: http_port
debug: msg="{{ http_port }}" #調用變量
ignore_errors: True #忽略錯誤,強制返回成功
notify: #定義執行一個動作(action)讓handlers來引用執行,與handlers配合使用
- restart apache #notify要執行的動作,這裏必須與handlers中的name定義內容一致
handlers: #處理器:更加tasks中notify定義的action觸發執行相應的處理動作
- name: restart apache #要與notify定義的內容相同
service: name=httpd state=restarted #觸發要執行的動作
ansible-playbook name.yml 參數
參數:
-k 交互輸入 ssh 密碼
-K 輸入 sudo 密碼
-u 指定用戶
--syntax-check 檢查語法
--list-task 查看tasks任務
--list-hosts 查看生效主機
--start-at-task='copy nginx' 指定從某個task開始執行
##單條條件判斷
---
- hosts: all
remote_user: root
tasks:
- name: 'server_name'
command: /sbin/shutdown -r now
when: ansible_distribution == "CentOS"
##多條條件判斷
---
- hosts: all
remote_user: root
tasks:
- name: 'server_name'
command: /sbin/shutdown -r now
when:
- ansible_distribution == "CentOS"
- ansible_distribution_major_version == "7"
##組條件判斷
---
- hosts: all
remote_user: root
tasks:
- name: 'server_name'
command: /sbin/shutdown -r now
when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "7") or (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")
---
- hosts: all
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: 'Install Httpd'
yum:
name: "{{ package }}"
state: latest
- name: 'Start Service'
service:
name: "{{ service }}"
state: started
##普通形式
---
- hosts: all
remote_user: root
tasks:
- name: 'Install Packages'
yum:
name: "{{ item }}"
state: latest
with_items:
- httpd
- mysql
- php
##鍵值對形式
---
- hosts: all
remote_user: root
tasks:
- name: 'Add User'
user:
name: "{{ item.name }}"
groups: "{{ item.groups }}"
state: present
with_items:
- {name: 'test1', groups: 'wheel'}
- {name: 'test2', groups: 'root'}