Ansible 自動化運維工具
Ansible是什么?
Ansible是一個“配置管理工具”也是一個“自動化運維工具”
Ansible 作用:
Ansible是新出現的自動化運維工具,基於Python開發,實現批量系統配置,批量程序部署,批量運行命令
Ansible 簡介:
Ansible 是一個能實現批量部署的自動化運維工具,基於python開發,能實現批量系統配置,批量部署程序,批量運行命令。Ansible是基於模塊來運行,它本身沒有任何批量部署的能力,ansible主要是提供一種批量部署的框架。
Ansible的框架:
- 連接的插件connection plugins: 負責和被監控端的通信
- Host inventory : 指定服務器上配置文件定義監控的客戶端
- 核心模塊: command、shell、yum、copy、ping、rm、自定義模塊(第三方模塊)等
- Playbook: 劇本任務,在非必要的情況下可以在一個節點執行多個任務
Ansible 特性:
- No agent 不需要在被管控主機上安裝任何軟件
- No server 不用單獨啟用服務,能使用直接運行,使用時直接運行命令
- 對硬件資源占用小
- 不需要在被管控的主機上安裝任何軟件
- 基於模塊工作
- 基於ssh工作
- 使用yaml語言
- 可實現多級指揮
Asible的優勢:
1) 輕量級易操作
2) 分布式,無agent客戶端
3) 配置語法是YAML語言
4) 輕量級,無需在客戶端安裝agent,更新時在操作機更新一次即可
5) 批量任務執行可以寫成腳本,不用發送給客戶機就可執行
6) 使用python編寫,維護簡單
7) 支持sudo
Ansible的架構:
連接其他主機默認使用的ssh協議,也支持local、zeromq的方式連接
核心:ansible
核心模塊(core modules):ansible自帶的模塊
擴展模塊(custom modules):核心模塊不能滿足需求,添加擴展模塊。
插件(plugins):完成模塊的補充
劇本(playbook):在ansible配置文件中,可以將多個任務定義在一個劇本中,在ansibel執行劇本。
連接插件(connectior plugins):ansible默認使用ssh連接的,但是ansible也支持其他的連接方式,其他的連接方式是需要插件的支持,才可以實現通信。
主機群(host inventory): 定義ansible管理的主機的
Ansible生成的主要文件
1 |
/etc/ansible |
Ansible的工作原理:
- 服務端連接客戶端,實現通信
- 通過服務器的節點使用模塊實現客戶端的需求
- 通過劇本實現多個任務的實現
Ansible 的7個命令:
Ansible、Ansible-doc、Ansible-galaxy、Ansible-lint、Ansible-playbook、Ansible-pull、Ansible-vault:
Ansible:
Ansible是核心的指令,主要用於執行單條命令,默認跟的是主機和選項部分,默認不指定模塊時,使用的是command模塊(默認使用的模塊可以在ansible.cfg修改):
Eg:[root@44 ~]# ansible all -a "pwd"
192.168.20.70 | SUCCESS | rc=0 >>
/root
- 參數:
- -a 'Arguments', --args='Arguments' 命令行參數
- -m NAME, --module-name=NAME 執行模塊的名字,默認使用 command 模塊,所以如果是只執行單一命令可以不用 -m參數
- -i PATH, --inventory=PATH 指定庫存主機文件的路徑,默認為/etc/ansible/hosts.
- -u Username, --user=Username 執行用戶,使用這個遠程用戶名而不是當前用戶
- -U --sud-user=SUDO_User sudo到哪個用戶,默認為 root
- -k --ask-pass 登錄密碼,提示輸入SSH密碼而不是假設基於密鑰的驗證
- -K --ask-sudo-pass 提示密碼使用sudo
- -s --sudo sudo運行
- -S --su 用 su 命令
- -l --list 顯示所支持的所有模塊
- -s --snippet 指定模塊顯示劇本片段
- -f --forks=NUM 並行任務數。NUM被指定為一個整數,默認是5。 #ansible testhosts -a "/sbin/reboot" -f 10 重啟testhosts組的所有機器,每次重啟10台
- --private-key=PRIVATE_KEY_FILE 私鑰路徑,使用這個文件來驗證連接
- -v --verbose 詳細信息
- all 針對hosts 定義的所有主機執行
- -M MODULE_PATH, --module-path=MODULE_PATH 要執行的模塊的路徑,默認為/usr/share/ansible/
- --list-hosts 只打印有哪些主機會執行這個 playbook 文件,不是實際執行該 playbook 文件
- -o --one-line 壓縮輸出,摘要輸出.嘗試一切都在一行上輸出。
- -t Directory, --tree=Directory 將內容保存在該輸出目錄,結果保存在一個文件中在每台主機上。
- -B 后台運行超時時間
- -P 調查后台程序時間
- -T Seconds, --timeout=Seconds 時間,單位秒s
- -P NUM, --poll=NUM 調查背景工作每隔數秒。需要- b
- -c Connection, --connection=Connection 連接類型使用。可能的選項是paramiko(SSH),SSH和地方。當地主要是用於crontab或啟動。。。。。
Ansible-doc:
Ansible-doc -h 用於查看模塊的信息常見的參數-l -s
Ansible-doc -l 列出已安裝的模塊
Ansible-doc -s 模塊 : 查查看具體模塊的使用方法
Ansible-galaxy:
Ansible-galaxy 從站點下載第三方的擴展模塊
[root@44 ~]# ansible-galaxy -h
Usage: ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...
Ansible-lint:
Ansible-lint對playbook的語法進行檢查的工具
Ansible-lint 劇本名
注:本人安裝的ansible 沒有此命令選項所以用ansible-playbook --syntax-check 對劇本進行語法的檢查
[root@44 ~]# ansible-playbook --syntax-check + 劇本名
對劇本語法進行檢查但不執行
Ansible-playbook:
Ansible-playbook 讀取playbook文件執行相應的動作。
執行ansible-playbook的劇本
eg:執行a.yml劇本
[root@44 ~]# ansible-playbook a.yml
Ansible-pull:
Ansible-pull 適用於數量多的機器配置,遠程執行命令的工具。對運維架構能力比較強
Ansible-vault:
Ansible-vault 配置文件有敏感信息,設置加密/解密這個配置文件
常用模塊使用
Ansible語法:ansible 機組名 -m 模塊 -a 執行的內容
1) Setup模塊
用來查看遠程主機的一些基本信息
Ansible 用戶 -m setup
2) Ping模塊
## 用來測試遠程主機的運行狀態
Ansible 用戶 -m ping
3) Copy模塊
復制文件到遠程主機
示例:將本地文件“/etc/ansible/ansible.cfg”復制到遠程服務器
Ansibles -m copy -a "src=/etc/ansible/ansible.cfgdest=/tmp/ansible.cfg owner=root group=root mode=0644"
4) Command模塊
## 在遠程主機上執行命令
相關選項如下:
ansible storm_cluster-m command -a "uptime"
5) Shell模塊
## 切換到某個shell執行指定的指令,參數與command相同。
這個模塊與script不同的是,首先要將寫好的sh腳本分發到機組,再執行
與command不同的是,此模塊可以支持命令管道,同時還有另一個模塊也具備此功能:raw。
示例:
先在本地創建一個SHELL腳本
vim/tmp/rocketzhang_test.sh
將創建的腳本文件分發到遠程
ansiblestorm_cluster -m copy -a "src=/tmp/rocketzhang_test.shdest=/tmp/rocketzhang_test.sh owner=root group=root mode=0755"
遠程執行
# ansiblestorm_cluster -m shell -a "/tmp/rocketzhang_test.sh"
6) Script模塊
用script:模塊可以實現到對象節點上執行本機腳本。有點類似copy+shell+刪除copy的腳本的這樣一個綜合的功能。
ansible host32-m script -a /tmp/hello.sh
7) 更多模塊
其他常用模塊,比如:service、cron、yum、synchronize就不一一例舉,可以結合自身的系統環境進行測試。
service:系統服務管理
cron:計划任務管理
yum:yum軟件包安裝管理
synchronize:使用rsync同步文件
user:系統用戶管理
group:系統用戶組管理
File : 對文件目錄的創建、刪除
Path 參數:用來指定要操作的文件或目錄
State 參數: 設定操作的需求
State=directory 創建目錄
State=touch 創建文件
State=link 創建硬連接
State=absent 缺席、刪除
Ansible-playbook 劇本
Ansible-playbook的作用:
為什么使用ansible-playbook哪?當批量部署的過程中有些監控器需要做出改動的時候,我們不需要通過ansible命令去手動去改動,那樣太過於消耗時間,我們可以把它寫成腳本,有改動的時候,只需要修改定義下的變量就好。Ansible中的腳本功能就是ansible-playbook劇本。
Ansible-playbook 的使用方法:
Ansible-playbook的組織格式:YAML語言格式
YAML的簡介:
類似於半結構化數據,聲明式配置,可讀性較高用來表達資料序列的格式,容易與腳本語言交互
YAML的語法格式:
① 任何書記結構用縮進來標識,可以嵌套
② 每一行的一個鍵值key:value ,冒號隔開。若想在一行標識用{}和,分隔
③ 列表用-標識
Playbook 組成的結構:
Host: 被監控的主機
Tasks :任務,調用的模塊執行操作
Variables: 變量
Templates: 模板
Handlers :處理器
Roles :角色
基本結構:
– host:webservices
remote_user:
– tasks:
– task1
module_name
YAML文件擴展名通常為.yml,如test.yml。
Eg:
[root@44 ~]# cat a.yml
- hosts: 192.16.20.70
remote_user: root
tasks:
- name: add group
group: name=new state=present
- name: add user
user: name=yxyfyy group=new
- hosts: 192.168.20.70
remote_user: root
tasks:
- name: copy
copy: src=/etc/services dest=/tmp/ owner=nobody group=new
[root@44 ~]# ansible-playbook --syntax-check a.yml
[WARNING]: Could not match supplied host pattern, ignoring: 192.16.20.70
playbook: a.yml
編寫playbook 劇本(執行拷貝的模板,把主機上的1111.txt文件拷貝到被監控的主機上。)
[root@44 ~]# cat a.yml
- hosts: 192.168.20.70
remote_user: root
tasks:
- name: copy
copy: src=/root/1111.txt dest=/tmp/ owner=nobody group=root
對playbook劇本進行檢測有沒有錯誤
[root@44 ~]# ansible-playbook --syntax-check a.yml
playbook: a.yml
執行playbook劇本
[root@44 ~]# ansible-playbook a.yml
PLAY [192.168.20.70] ******************************************************************
TASK [Gathering Facts] ****************************************************************
ok: [192.168.20.70]
TASK [copy] ***************************************************************************
changed: [192.168.20.70]
PLAY RECAP ****************************************************************************
192.168.20.70 : ok=2 changed=1 unreachable=0 failed=0
檢查結果
[root@44 ~]# cat 1111.txt
ansible
[root@yk3 ~]# cat /tmp/1111.txt
ansible
Ansible-playbook的組成:
Ansible-playbook可以理解為把ansible的使用的模塊方法寫入ansible-playbook劇本中。
Ansible-playbook文件是以“.yaml”或“.yml”結尾的文件
EG:
[root@44 ~]# cat a.yml
- hosts: 192.168.20.70 (指定被操作主機)
(yaml語法中使用冒號映射鍵值對,“冒號”后必須加空格)
remote_user: root (指定遠程操作時使用那個用戶)
(注意格式:yaml語法用層級關系,同一層級的是對齊的。(開頭對齊))
tasks: (操作的任務列表,可以有多個任務)
- name: copy (自定義任務名稱)
copy: src=/root/1111.txt dest=/tmp/ owner=nobody group=root
(任務的操作,copy:copy模塊,src:源地址,(copy的內置條件) dest:目的地址, owner:所屬人 group:所屬組)
Hosts:定義要操作的主機,可以是IP地址、主機名(提前域名解析)、定義的分組。 定義多個主機要用,分隔開
Ansible-playbook 劇本
Ansible-playbook的作用:
為什么使用ansible-playbook哪?當批量部署的過程中有些監控器需要做出改動的時候,我們不需要通過ansible命令去手動去改動,那樣太過於消耗時間,我們可以把它寫成腳本,有改動的時候,只需要修改定義下的變量就好。Ansible中的腳本功能就是ansible-playbook劇本。
Ansible-playbook 的使用方法:
Ansible-playbook的組織格式:YAML語言格式
YAML的簡介:
類似於半結構化數據,聲明式配置,可讀性較高用來表達資料序列的格式,容易與腳本語言交互
YAML的語法格式:
① 任何書記結構用縮進來標識,可以嵌套
② 每一行的一個鍵值key:value ,冒號隔開。若想在一行標識用{}和,分隔
③ 列表用-標識
Playbook 組成的結構:
Host: 被監控的主機
Tasks :任務,調用的模塊執行操作
Variables: 變量
Templates: 模板
Handlers :處理器
Roles :角色
基本結構:
– host:webservices
remote_user:
– tasks:
– task1
module_name
YAML文件擴展名通常為.yml,如test.yml。
Eg:
[root@44 ~]# cat a.yml
- hosts: 192.16.20.70
remote_user: root
tasks:
- name: add group
group: name=new state=present
- name: add user
user: name=yxyfyy group=new
- hosts: 192.168.20.70
remote_user: root
tasks:
- name: copy
copy: src=/etc/services dest=/tmp/ owner=nobody group=new
[root@44 ~]# ansible-playbook --syntax-check a.yml
[WARNING]: Could not match supplied host pattern, ignoring: 192.16.20.70
playbook: a.yml
編寫playbook 劇本(執行拷貝的模板,把主機上的1111.txt文件拷貝到被監控的主機上。)
[root@44 ~]# cat a.yml
- hosts: 192.168.20.70
remote_user: root
tasks:
- name: copy
copy: src=/root/1111.txt dest=/tmp/ owner=nobody group=root
對playbook劇本進行檢測有沒有錯誤
[root@44 ~]# ansible-playbook --syntax-check a.yml
playbook: a.yml
執行playbook劇本
[root@44 ~]# ansible-playbook a.yml
PLAY [192.168.20.70] ******************************************************************
TASK [Gathering Facts] ****************************************************************
ok: [192.168.20.70]
TASK [copy] ***************************************************************************
changed: [192.168.20.70]
PLAY RECAP ****************************************************************************
192.168.20.70 : ok=2 changed=1 unreachable=0 failed=0
檢查結果
[root@44 ~]# cat 1111.txt
ansible
[root@yk3 ~]# cat /tmp/1111.txt
ansible
Ansible-playbook的組成:
Ansible-playbook可以理解為把ansible的使用的模塊方法寫入ansible-playbook劇本中。
Ansible-playbook文件是以“.yaml”或“.yml”結尾的文件
EG:
[root@44 ~]# cat a.yml
- hosts: 192.168.20.70 (指定被操作主機)
(yaml語法中使用冒號映射鍵值對,“冒號”后必須加空格)
remote_user: root (指定遠程操作時使用那個用戶)
(注意格式:yaml語法用層級關系,同一層級的是對齊的。(開頭對齊))
tasks: (操作的任務列表,可以有多個任務)
- name: copy (自定義任務名稱)
copy: src=/root/1111.txt dest=/tmp/ owner=nobody group=root
(任務的操作,copy:copy模塊,src:源地址,(copy的內置條件) dest:目的地址, owner:所屬人 group:所屬組)
Hosts:定義要操作的主機,可以是IP地址、主機名(提前域名解析)、定義的分組。 定義多個主機要用,分隔開