Ansible使用介紹(一)基本概念及常用模塊

隨著運維自動化經歷了從本地部署到基礎設施即服務(IaaS)、平臺即服務(PaaS)在到軟件即服務(SaaS)的發展階段,掌握多種自動化運維工具就成了運維人員必備技能之一,ansible就是目前國內使用比較廣泛的自動化運維工具之一。

本機索引:

一、ansible工具介紹

二、ansible常用模塊

三、ansible系列命令

``9]0HNNH`_2{0YJS4R27DF

隨著運維自動化經歷了從本地部署基礎設施即服務(IaaS)、平臺即服務(PaaS)在到軟件即服務

(SaaS)的發展階段,掌握多種自動化運維工具就成了運維人員必備技能之一,ansible就是目前國內使

用比較廣泛的自動化運維工具之一。

 

一、ansible工具介紹:

常用自動化運維工具:

Ansible:python,中小型應用環境,300-500臺

Saltstack:python,一般需部署agent,執行效率更高,大型環境1000臺以上

Puppet:ruby,功能強大,配置復雜,重型,適合大型環境

Fabric:python,agentless

Chef:ruby,國內應用少

Cfengine

func

 

Ansible

ansible是新出現的自動化運維工具,基于Python開發,集合了眾多運維工具(puppet、

cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量

運行命令等功能。

 

特性:

模塊化:調用特定的模塊,完成特定任務

有Paramiko,PyYAML,Jinja2(模板語言)三個關機模塊

支持自定義模塊

基于Python語言實現

部署簡單,基于python和SSH(默認已安裝),agentless

安全,基于OpenSSH

支持playbook編排任務

冪等性:一個任務執行1遍和執行n遍效果一樣,不因重復執行帶來意外情況

無需代理不依賴PKI(無需ssl)

可使用任何編程語言寫模塊

YAML格式,編排任務,支持豐富的數據結構

較強大的多層解決方案

 

Ansible主要組成部分:

API:供第三方程序調用的應用程序編程接口

Inventory:Ansible管理主機清單,存放在/etc/ansible/hosts

Modules:模塊,Ansible執行命令的功能的模塊,多個命令的組合

Playbook:劇本,多個模塊的組合,編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件

Plugins:模塊功能的補充,如連接類型的插件、循環插件、變量插件、過濾插件等,該功能不常用

Ansible:組合Inventory、API、Modules、Plugins的綠框,可以理解為是ansible命令工具,其為核心執行工具

工作原理

 

相關文件:

/etc/ansible/ansible.cfg? ? 主配置文件,配置ansible工作特性

/etc/ansible/hosts ???????????????? 主機清單文件

/etc/ansible/rules? ? ? ? ? ? ? 角色目錄

程序:

/usr/bin/ansible ???????????? 主程序,臨時命令執行工具

/usr/bin/ansible-doc ???????????? 查看配置文檔,模塊功能查看工具

/usr/bin/ansible-galaxy ??????? 下載/上傳優秀代碼或Roles模塊的官網平臺

/usr/bin/ansible-playbook ?? 定制自動化任務,編排劇本工具/usr/bin/ansible-pull 遠

程執行命令的工具:

/usr/bin/ansible-vault ?????????? 文件加密工具

/usr/bin/ansible-console ????? 基于Console界面與用戶交互的執行工具

 

 

/etc/ansible/ansible.cfg ansible ? ? ?

配置文件(一般保持默認)

[defaults]

#forks?????????????? = 5??????????? 并發執行數量,默認5

#poll_interval = 15????????? 拉取數據間隔時間,默認15秒

#sudo_user???? = root?????????????? sudo命令默認用戶

#remote_port = 22????????? 連接遠程端口號

#host_key_checking = False ???????? 檢查對應服務器的host_key,##建議取消注釋

#log_path=/var/log/ansible.log ? 日志文件,##建議取消注釋

ansible.cfg

 

/etc/ansible/hosts?

主機清單inventory文件

inventory文件遵循INI文件風格,中括號中的字符為組名。可以將同一個主機

同時歸并到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口,

還可以在主機名稱之后使用冒號加端口號來標明

ntp.magedu.com

[webservers]

www1.magedu.com:2222

www2.magedu.com

[dbservers]

db1.magedu.com

db2.magedu.com

db3.magedu.com

如果主機名稱遵循相似的命名模式,還可以使用列表的方式標識各主機

示例:

[websrvs]

www[01:100].example.com

[dbsrvs]

db-[a:f].example.com

ansiblehost

 

ansible命令

功能:通過ssh實現配置管理、應用部署、任務執行等功能

建議:配置ansible端能基于密鑰認證的方式聯系各被管理節點?

格式:ansible <host-pattern> [-m module_name] [-a args]

常用選項:

–version ???????????????? 顯示版本

-m module ???????????? 指定模塊,默認為command

-v 詳細過程 ????????????????? –vv -vvv更詳細

–list-hosts ???????????? 顯示主機列表,可簡寫—list

-k, –ask-pass ???????????????? 提示連接密碼,默認Key驗證

-K, –ask-become-pass 提示輸入sudo

-C, –check ???????????? 檢查,并不執行

-T, –timeout=TIMEOUT ?????? 執行命令的超時時間,默認10s

-u, –user=REMOTE_USER ?? 執行遠程執行的用戶

-b, –become ????????????????? 代替舊版的sudo 切換

 

<host-pattern>???????????????????????? 匹配主機的列表

?ALL??????????????????? 表示列表中的所有主機

示例:

ansible all -m? ping

 

?*??????????????????????? 支持通配符

示例:

ansible “*” -m ping

ansible 192.168.1.* -m ping

ansible “*srvs” -m ping

或關系

示例:

ansible “websrvs:appsrvs”? -m ping

ansible “192.168.1.10:192.168.1.20” -m ping

邏輯與:

ansible “websrvs:&dbsrvs”? -m ping

在websrvs組,但不在dbsrvs組中的主機

邏輯非:

ansible ‘websrvs:!dbsrvs’? -m ping

綜合邏輯:

ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ -m -ping

正則表達式:

ansible “websrvs:&dbsrvs”? -m ping

ansible “~(web|db).*\.magedu\.com” -m ping

 

ansible命令執行過程

1.加載自己的配置文件 默認/etc/ansible/ansible.cfg

2.加載自己對應的模塊文件,如command

3.通過ansible將模塊或命令生成對應的臨時py文件,并將該 文件傳輸至遠程服務器

的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件

4.給文件+x執行

5.執行并返回結果

6.刪除臨時py文件,sleep 0退出

 

執行狀態:

綠色:執行成功并且不需要做改變的操作

綠色

黃色:執行成功并且對目標主機做變更

黃色

紅色:執行失敗

紅色

 

二、ansible常用模塊:

查看模塊幫助:

ansible-doc module

顯示模塊簡要說明:

ansible-doc ?-s ?module

 

Command模塊

功能:默認模塊,在遠程主機執行命令,可忽略-m選項

???????? ansible srvs -m command -a ‘service vsftpd start’

???????? ansible srvs -m command -a ‘echo magedu |passwd –stdin wang’ 不成功

注意:

(1)使用Command模塊執行腳本時,要注意規范,shebang機制,否則將執行失敗

(2)不支持管道“|”,變量“$”,以及重定向,需使用shell模塊

 

Shell模塊

功能:和command相似,用shell執行命令

???????? ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’

注意:

(1)調用bash執行命令 類似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &>

/tmp/example.txt 這些復雜命令,即使使用shell也可能會失敗。

解決辦法:寫到腳本,copy到遠程,執行,再把需要的結果拉回執行命令的機器

(2)可將默認模塊替換為shell:

? ? ? ? vim ansible.conf

? ? ? ?module_name = shell

修改默認模塊

ansible srvs -m command -a ‘echo magedu |passwd –stdin wang’ ?成功

修改密碼成功

 

Script模塊

功能:運行腳本,不需要將腳本復制到被控端

???????? -a “/PATH/TO/SCRIPT_FILE”

???????? snsible websrvs -m script -a f1.sh

script模塊

 

Copy模塊

功能:從服務器復制文件到客戶端,

???????? ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600

???????? backup=yes”

如目標存在,默認覆蓋,此處指定先備份

?? ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt” 利用內容,直接生成

目標文件

 

Fetch模塊

功能:從客戶端取文件至服務器端,copy相反,目錄可先tar

?????? ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’

?示例:

打包/var/log下所有日志文件并遠程抓取

???????? ansible all -m shell -a ‘tar Jcf log.tar.xz /var/log/*.log’

???????? ansible all -m fetch -a ‘src=/root/log.tar.xz dest=/data’

 

File模塊

功能:設置文件屬性

示例:

創建新文件:

???????? ansible all -m file -a ‘name=/data/f3 state=touch’

刪除文件:

???????? ansible all -m file -a ‘name=/data/f3 state=absent’

創建目錄:

???????? ansible all -m file -a ‘name=/data/dir1 state=directory’

刪除目錄:

???????? ansible all -m file -a ‘name=/data/dir1 state=absent’

創建軟連接

???????? ansible all -m file -a ‘src=/etc/fstab dest /data/fstab.link state=link’

刪除軟連接:

?????? ansible all -m file -a ‘dest /data/fstab.link state=absent’

創建文件指定所有者,權限:

???????? ansible srv -m file -a “path=/root/a.sh owner=wang mode=755”

???????? ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’

 

Hostname模塊

功能:管理主機名,生效同時更改文件永久生效

示例:

更改一個主機的主機名:

???????? ansible node1 -m hostname -a “name=websrv”

注意:

(1)Host模塊不會修改/etc/hosts文件中的主機名解析,注意修改

(2)批量修改主機名時最好加變量,防止所有主機名一致

 

Cron模塊

功能:計劃任務

支持時間:minute,hour,day,month,weekday

示例:

創建計劃任務:每周1,3,5,每分鐘打印,任務名稱:warningcron

???????? ansible all -m cron -a ‘minute=* weekday=1,3,5 job=”/usr/bin/wall FBI warning” name=warningcron’

注釋cronname=waringcron的計劃任務:

???????? ansible all -m cron -a ‘disabled=true job=”/usr/bin/wall FBI warning” name=warningcron’

給cronname=waringcron的計劃任務去掉注釋:

???????? ansible all -m cron -a ‘disabled=true job=”/usr/bin/wall FBI warning” name=warningcron’

創建計劃任務:每五分鐘同步一次服務器時間,任務名稱:syntime

???????? ansible srv -m cron -a “minute=*/5 job=’/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime”

刪除計劃任務:Synctime

???????? ansible srv -m cron -a ‘state=absent name=Synctime’?

 

Yum模塊

功能:管理包

示例:

yum安裝vsftpd包:(默認state=installd

???????? ansible all -m yum -a ‘name=vsftpd’

安裝多個包用逗號隔開:

???????? ansible all -m yum -a ‘name=vsftpd,httpd’

顯示所有已安裝的包:

???????? ansible all -m yum -a ‘name=vsftpd? list=installd’

卸載vsftpd包:

???????? ansible all -m yum -a ‘name=vsftpd? state=removed’

安裝從互聯網下載的包:

???????? ansible srv -m copy -a ‘src=/root/package.rpm dest=/data/package’

???????? ansible srv -m yum -a ‘name=/data/package.rpm’

更新緩存:

???????? ansible srv -m yum -a ‘update_cache=yes’

更新緩存同時安裝dstat包

???????? ansible srv -m yum -a ‘name=dstat update_cache=yes’

 

Service模塊

功能:管理服務

示例:

停止httpd服務:

???????? ansible srv -m service -a ‘name=httpd state=stopped’

開啟httpd服務:

???????? ansible srv -m service -a ‘name=httpd state=started’

重新加載httod服務:

???????? ansible srv -m service -a ‘name=httpd state=reloaded’

重啟httpd服務:

???????? ansible srv -m service -a ‘name=httpd state=restarted’

開啟ftp服務,同時設置開機自動啟動:

???????? ansible srv -m service -a ‘name=vsftpd state=started enabled=yes’

重啟ftp服務:

???????? ansible srv -m service -a ‘name=vsftpd state=restarted’

 

User模塊

功能:管理用戶

示例:

添加用戶,指定uid、家目錄、主組及注釋:

???? ansible srv -m user -a ‘name=user1 comment=”test user” uid=2048 home=/app/user1 group=root’

添加一個系統用戶:

? ?ansible srv -m user -a ‘name=sysuser1 system=yes home=/app/sysuser1’

刪除用戶:

? ?ansible srv -m user -a ‘name=user1 state=absent’

添加一個nginx用戶:

???????? ansible srv -m user -a ‘name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment=”nginx service”

刪除nginx用戶同時刪除家目錄:

???????? ansible srv -m user -a ‘name=nginx state=absent remove=yes’

 

Group模塊

功能:管理組

示例:

創建一個系統組:

?????? ansible srv -m group -a “name=testgroup system=yes”

刪除一個組:

???????? ansible srv -m group -a “name=testgroup state=absent”

創建nginx組:

???????? ansible srv -m group -a ‘name=nginx system=yes gid=80’

刪除nginx組:

???????? ansible srv -m group -a ‘name=nginx state=absent’

 

三、ansible系列命令:

ansible系列命令包括:

ansible

ansible-doc

ansible-playbook

ansible-vault

ansible-console

ansible-galaxy

ansible-pull

 

ansible-doc

功能:顯示模塊幫助

格式:ansible-doc [options] [module…]

-a ??????????????????? 顯示所有模塊的文檔

-l??????????????????????? 列出可用模塊

-s?????????????????????? 顯示指定模塊的playbook片段

示例:

ansible-doc? ping?????????? 查看ping模塊幫助

ansible-doc -s ping????????? 查看ping模塊的簡單說明

 

Ansible-vault

功能:管理加密解密yml文件

格式:ansible-vault [create|decrypt|edit|encrypt|rekey|view]

ansible-vault encrypt hello.yml 加密yml文件

ansible-vault decrypt hello.yml 解密yml文件

ansible-vault view hello.yml ???????? 查看yml加密文件

ansible-vault edit hello.yml? ? ? ? ? 編輯加密文件

ansible-vault rekey hello.yml ??????? 重新修改加密口令

ansible-vault create new.yml ?????? 創建新文件

 

Ansible-console

功能:ansible控制臺,可交互執行命令,支持tab

root@test (2)[f:10] $

執行用戶@當前操作的主機組 (當前組的主機數量)[f:并發數]$

設置并發數: forks n 例如: forks 10

切換組: cd 主機組 例如: cd web

列出當前組主機列表: list

列出所有的內置命令: ?或help

示例:

列出主機列表中所有主機:

root@all (2)[f:5]$ list

切換至appsrvs組:

root@all (2)[f:5]$ cd appsrvs

列出appsrvs組下所有主機:

root@appsrvs (2)[f:5]$ list

安裝httpd:

root@appsrvs (2)[f:5]$ yum name=httpd state=present

開啟httpd服務:

root@appsrvs (2)[f:5]$ service name=httpd state=started

ansible-console

 

ansible-galaxy

功能:連接https://galaxy.ansible.com下載相應的roles

galaxy

列出所有已安裝的galaxy:

ansible-galaxy list

安裝galaxy:

ansible-galaxy install geerlingguy.redis

刪除galaxy:

ansible-galaxy remove geerlingguy.redis

 

ansible-pull

功能:推送命令至遠程,效率無限提升,對運維技術要求較高

當前應用還較少

 

在本節內容中,我們主要介紹了ansible的使用及一些常用模塊,在下節內容中,我們將為您解讀

ansible中playbook以及roles的使用

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99715

(6)
wangxczwangxcz
上一篇 2018-05-29
下一篇 2018-05-29

相關推薦

欧美性久久久久