Ansible - - 使用和模塊化深刻解析

1,Ansible 系列命令

ansible
ansible-doc
ansible-playbook
ansible-valut
ansible-console
ansible-galaxy
ansible-pull

1.1 ansible-doc 顯示模塊幫助

Usage: ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]

plugin documentation tool

Options:
  -a, --all             顯示全部模塊文檔
  -l, --list              列出可用模塊
  -s, --snippet      顯示指定模塊的playbook片斷
  • 示例
ansible-doc -l    列出全部模塊
ansible-doc ping    查看指定模塊幫助用法
ansible-doc -s ping    查看指定模塊幫助用法

1.2 ansible

  • ansible 經過 ssh 實現配置管理、應用部署、任務執行等功能,建議配置 ansible 端能基於祕鑰認證的方式聯繫各被管理節點
  • ansible [-m module_name] [-a args]
--version 顯示版本
-m module 指定模塊,默認爲 command
-v 詳細過程 -vv -vvv 更詳細
--list-hosts  顯示主機列表,可簡寫 --list
-k,--ask-pass    提示輸入 ssh 鏈接密碼,默認 key 驗證
-K,--ask-become-pass    提示輸入 sudo 時的口令
-C,--check    檢查,並不執行
-T,--timeout=TIMEOUT    執行命令的超時時間,默認 10s
-u,--user=REMOTE_USER    執行遠程執行的用戶
-b,--become    代替舊版的 sudo 切換

1.2.1 ansible 的 主機模式

  • Host-pattern 匹配主機主機的列表
    • ALL:表示素有 Inventory 中的全部主機
      • 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.2.100:192.168.2.111" -m ping
    • 邏輯與
      • ansible 'websrvs:&dbsrvs' -m ping
      • websrvs 組而且在 dbsrvs 組中的主機
      • 注意:此處爲單引號
    • 邏輯非
      • ansible 'websrvs:!dbsrvs' -m ping
      • websrvs 組,但不在 dbsrvs 組中的主機
      • 注意:此處爲單引號
    • 綜合邏輯
      • ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' -m ping
      • 注意:此處爲單引號
    • 正則表達式
      • ansible 'websrvs:&dbsrvs' -m ping
      • ansible '~(web|db).*\.example\.com' -m ping
      • 注意:此處爲單引號

1.2.2 ansible 命令執行過程

  • 1,加載本身的配置文件 默認 /etc/ansible/ansible.cfg
  • 2,加載本身對應的模塊文件,如 command
  • 3,經過 ansible 將模塊或命令生成對應的臨時 py 文件,並將該 文件傳輸至遠程服務器
  • 4,給文件 +x 執行權限
  • 5,執行並返回結果
  • 6,刪除臨時 py 文件,sleep 0 退出
  • 執行狀態
    • 綠色:執行成功而且不須要作改變的操做
    • 黃色:執行成功而且對目標主機作變動
    • 紅色:執行失敗
  • 示例
    • 以 wang 用戶執行 ping 存活檢測
      • ansible all -m ping -u wang -k
    • 以 wang sudo 至 root 執行 ping 存活檢測
      • ansible all -m ping -u wang -b -k
    • 以 wang sudo 至 test 用戶執行 ping 存活檢測
      • ansible all -m ping -u wang -b -k --become-user test
    • 以 wang sudo 至 root 用戶執行 ls
      • ansible all -m command -u wang --become-user=root -a 'ls /root' -b -k -K

2,ansible 經常使用模塊

  • Command:在遠程主機執行命令,默認模塊,可忽略 -m 選項
    • ansible srvs -m command -a 'service vsftpd start'
    • ansible srvs -m command -a 'echo test | passwd --stdin wang' 不成功
    • 此命令不支持 $VARNAME < > | ; & 等,用 shell 模塊實現
  • Shell:和 command 類似,用 shell 執行命令
    • ansible srv -m shell -a 'echo test | passwd --stdin wang'
    • 調用 bash 執行命令相似 cat /tmp/stanley.md | awk -F '|' '{print $1 $2}' & > /tmp/example.txt這些複雜命令,即便使用 shell 也可能會失敗,解決辦法:寫到腳本時,copy 到遠程,執行,再把須要的結果拉回執行命令的機器
  • Script:運行腳本
    • -a '/PATH/TO/SCRIPT_FILE'
    • ansible 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'
  • File:設置文件屬性
    • 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"
  • Cron:計劃任務
    • 支持時間:minute,hour,day,month,weekday
    • ansible srv -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 & > /dev/null' name=Synctime" 建立任務
    • ansible srv -m cron -a "disabled=true job='/usr/sbin/ntpdate 172.16.0.1 & > /dev/null' name=Synctime" 禁用任務
    • ansible srv -m cron -a 'state=absent name=Synctime' 刪除任務
  • Yum:管理包
    • ansible srv -m yum -a 'name=httpd state=latest' 安裝
    • ansible srv -m yum -a 'name=htttpd state=absent' 刪除
  • Service:管理服務
    • ansible srv -m service -a 'name=httpd state=started enabled=true' 啓動而且開機自啓
    • ansible srv -m service -a 'name=httpd state=stopped' 中止
    • ansible srv -m service -a 'name=httpd state=reloaded' 平滑重啓
    • ansible srv -m service -a 'name=httpd state=restarted' 重啓
  • User:管理用戶
    • ansible srv -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=2048 comment="nginx service"'
    • ansible srv -m user -a 'anme=sysuser1 system=yes home=/app/sysuser1'
    • ansible srv -m user -a 'name=user1 state=absent remove=yes' 刪除用戶及家目錄等數據
  • Group:管理組
    • ansible srv -m group -a "name=testgroup system=yes" 建立組
    • ansible srv -m group -a "name=testgroup state=absent" 刪除組

3,ansible-galaxy

- 鏈接 ````https://galaxy.ansible.com```` 下載相應的 roles
- 列出全部已安裝的 galaxy
    - ````ansible-galaxy list````
- 安裝 galaxy
    - ````ansible-galaxy install geerlingguy.nginx````
- 刪除 galalxy
    - ````ansible-galaxy remove geerlingguy.nginx````

4,ansible-pull

  • 推送命令至遠程,效率無限提高,對運維要求較高

5,ansible-playbook

  • 使用文件基本配置如:hello.yml
# hello world yml file
---
- hosts: websrvs    # 對應ansible hosts 分組名 或 主機名
  remote_user: root    # 指定在被管理的主機上執行任務的用戶
  tasks:                       # 任務列表
    - name: hello          # 任務名稱
      command: hostname    # 調用command模塊 執行命令
  • playbook 執行命令
ansible-playbook hello.yml

6,ansible-vault

  • 功能:管理加密解密 yml 文件
# ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]

# 加密
ansible-vault encrypt hello.yml

# 解密
ansible-vault decrypt hello.yml

# 查看
ansible-vault view hello.yml

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

# 修改口令
ansible-vault rekey hello.yml

# 建立新文件
ansible-vault create new.yml

7,ansible-console:2.0+ 新增,可交互執行命令,支持 tab

  • root@all (3)[f:5]$ 執行用戶@當前操做的主機組(當前組的主機數量)[f:併發數]$
  • 設置併發數:```forks n;例如:forks 10````
  • 切換組:cd 主機組 例如:cd web
  • 列出當前組主機列表:list
  • 列出全部的內置命令:?help
  • 示例:
root@all (3)[f:5]$ list
root@all (3)[f:5]$ cd websrvs
root@websrvs (3)[f:5]$ list
root@websrvs (3)[f:5]$ yum name=httpd state=present
root@websrvs (3)[f:5]$ service name=httpd sstat=started
相關文章
相關標籤/搜索