本機索引:
一、ansible工具介紹
二、ansible常用模塊
三、ansible系列命令
隨著運維自動化經歷了從本地部署到基礎設施即服務(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 ? 日志文件,##建議取消注釋
/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
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
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-galaxy
功能:連接https://galaxy.ansible.com下載相應的roles
列出所有已安裝的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