Ansible的安裝/概念/部署/模塊/劇本

Ansible

Ansible	自動化運維工具 基於python開發,可實現批量系統配置、批量程序部署、批量運行命令等

Ansible 安裝

Ansible需要主機python版本達到2.7或以上;不支持windows系統

Centos6版本需要安裝epel源之後纔可以安裝Ansible

安裝包地址 https://releases.ansible.com/ansible/rpm/release/epel-7-x86_64/

源碼安裝教程 Github

Ansible 基本概念

  • 控制結點(control node)
任何安裝Ansible的機器都可以是控制節點;
你可以從任意控制節點調用 /usr/bin/ansible 執行一條任務或 /usr/bin/ansible-playbook 讀取劇本執行多個任務
  • 受管節點
使用Ansible管理的網絡設備和服務器都是受管節點,受管節點也可以叫做 ‘主機‘
  • 清單(inventory)
受管節點的列表;Ansible在管理某個節點前,需要將節點添加到 ”主機清單文件“ 中,清單文件可以爲每個受管節點指定信息,列如IP、port 也可以把主機分成主機組管理
  • 模塊(Modules)
Ansible執行代碼的單位,Ansible自帶許多模塊每個模塊都有指定用途;可以通過任務調用單個模塊
  • 任務(Tasks)
Ansible執行的單位,可以使用臨時命令一次執行一個任務
  • 劇本(Playbook)
任務的有序列表文件,可以重複讀取劇本文件重複運行劇本內容的任務

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 語法格式
ansible	主機/主機組	-m 模塊	-a '模塊參數'

Ansible 模塊

  • ping
檢查目標主機是否在線

例:ansible	主機/主機組	-m	ping
  • yum
Centos	系統上安裝命令

name:指定安裝包的名字
state:latest(安裝最新版本)、present(默認安裝)、installed(安裝)、absent(卸載)、removed(卸載)

例:ansible 主機/主機組 -m yum -a ‘name=httpd state=latest’
  • command
command 模塊用來執行系統命令,但不支持shell下的特殊符號 如:| &&...

例:ansible	主機/主機名	-m	command	-a 'echo 你好'
  • shell
shell 模塊和 command 模塊使用方法基本一致,但可以支持shell的特殊符號

例:ansible	主機/主機名	-m	shell	-a 'cd /opt/	&&	touch a.txt'
  • service
service 模塊用來管理 centos 上的服務的啓動、關閉、重啓、重載

name:服務名
state:started(啓動)、stopped(停止)、restarted(重啓)、reloaded(重載)
enabled:默認 no,將服務設置爲開機自啓

例:ansible	主機/主機名	-m	service	-a 'name=服務名	state=started	enabled=yes'
  • file
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
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
group 模塊用來創建用戶組

gid:指定gid
name:指定用戶名
system:指定創建的用戶在是否爲系統組,false	true 默認爲false	gid小於1000爲系統組
state:創建/刪除 (present,absent)

例:ansible	-m  group  -a  'name=tom  gid=6666  state=present'
  • copy
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
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
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/’
  • synchronize
使用rsync同步文件,將主控方目錄推送到指定節點的目錄下;使用此模塊需要先安裝rsync

delete: 刪除不存在的文件,delete=yes 使兩邊的內容一樣(即以推送方爲主),默認no 
src: 要同步到目的地的源主機上的路徑,如果路徑使用”/”來結尾,則只複製目錄裏的內容,如果沒有使用”/”來結尾,則包含目錄在內的整個內容全部複製 
dest:目的地主機上將與源同步的路徑
dest_port:默認目錄主機上的端口 ,默認是22,走的ssh協議。 
mode: push或pull,默認push,一般用於從本機向遠程主機上傳文件,pull 模式用於從遠程主機上取文件。 
rsync_opts:通過傳遞數組來指定其他rsync選項

  • fetch模塊
fetch 模塊用於從遠程機器獲取文件,並將其本地存儲在由主機名組織的文件樹中。 
src:遠程系統上要獲取的文件;這必須是一個文件,而不是一個目錄
dest:保存文件的目錄
flat:允許您覆蓋將目標文件添加到主機名/ path / to / file的默認行爲
  • setup
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
script 模塊在遠程主機上執行主控制端的腳本,相當於 scp+shell

例:ansible	主機/主機組	-m script	-a '/root/test.sh'
  • stat
stat 模塊用於獲取遠程文件的狀態信息,包括atime、ctime、mtime、md5、uid、gid等...

例:ansible	主機/主機組 	-m stat	 -a  "path=/etc/sysctl.conf"
  • cron
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
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 劇本

  • Playbook核心元素
tasks			任務集
varniables		內置變量 或 自定義變量在playbook中調用
tmeplate		模板
handlers 和 notify結合使用,由特定條件觸發的操作,滿足條件就會執行,否則不執行
roles			角色
  • Playbook語法
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      #觸發要執行的動作
  • Playbook 常用命令
ansible-playbook    name.yml    參數

參數:

	-k	交互輸入 ssh 密碼
	-K	輸入 sudo 密碼
	-u	指定用戶

	--syntax-check				   檢查語法
	--list-task					   查看tasks任務
	--list-hosts				   查看生效主機
	--start-at-task='copy nginx'	指定從某個task開始執行
  • Playbook 條件判斷
##單條條件判斷
---
- 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'}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章