由淺入深學習Ansible工具

由淺入深學習Ansible工具


  Ansible是新出現的自動化運維工具,基於python開發,實現批量系統配置、批量程序部署、批量運行命令等功能。
  Ansible是基於模塊工作的,本身沒有批量部署能力。真正具有批量部署的是Ansible所運行的模塊。

Ansible的特性

  模塊化:調用特定的模塊,完成特定任務
  有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
  支持自定義模塊
  基於Python語言實現
  部署簡單,基於python和SSH(默認已安裝),agentless
  安全,基於OpenSSH
  支持playbook編排任務
  冪等性:一個任務執行1遍和執行n遍效果一樣,不因重複執行帶來意外情況
  無需代理不依賴PKI(無需ssl)
  可使用任何編程語言寫模塊
  YAML格式,編排任務,支持豐富的數據結構
  較強大的多層解決方案

Ansible的架構

由淺入深學習Ansible工具

  Core Modules:內建模塊
  Custom Modules自定義模塊:讓用戶完成自定義任務的核心組件
  Connection Plugins連接插件:默認ssh連接
  Host Inventory主機清單:列在清單中的主機才能進行管理
  email、logging、other插件:實現記錄日誌,發送郵件等功能
  核心組件Playbooks:類似於劇本的存在,定義主機角色,將劇本扔給角色

Ansible工作原理

由淺入深學習Ansible工具

Ansible主要組成部分

  ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,通常是JSON格式的YML文件
  INVENTORY:Ansible管理主機的清單/etc/anaible/hosts
  MODULES:Ansible執行命令的功能模塊,多數爲內置核心模塊,也可自定義
  PLUGINS:模塊功能的補充,如連接類型插件、循環插件、變量插件、過濾插件等,該功能不常用
  API:供第三方程序調用的應用程序編程接口
  ANSIBLE:組合INVENTORY、 API、 MODULES、 PLUGINS的綠框,可以理解爲是ansible命令工具,其爲核心執行工具

Ansible命令執行來源

  1. USER,普通用戶,即SYSTEM ADMINISTRATOR
  2. CMDB(配置管理數據庫) API 調用
  3. PUBLIC/PRIVATE CLOUD API調用
  4. USER-> Ansible Playbook -> Ansibile

利用Ansible實現管理的方式

  1. Ad-Hoc 即ansible命令,主要用於臨時命令使用場景
  2. Ansible-playbook 主要用於長期規劃好的,大型項目的場景,需要有前提的規劃

Ansible-playbook(劇本)執行過程

  1. 將已有編排好的任務集寫入Ansible-Playbook
  2. 通過ansible-playbook命令分拆任務集至逐條ansible命令,按預定規則逐條執行

Ansible主要操作對象

  1. HOSTS主機
  2. NETWORKING網絡設備

注意事項

  1. 執行ansible的主機一般稱爲主控端,中控,master或堡壘機
  2. 主控端Python版本需要2.6或以上
  3. 被控端Python版本小於2.4需要安裝python-simplejson
  4. 被控端如開啓SELinux需要安裝libselinux-python
  5. windows不能做爲主控端

Ansible的安裝方式

rpm包安裝:EPEL源

yum install ansible

編譯安裝

yum -y install python-jinja2 PyYAML python-paramiko python-babel
python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible

Git方式安裝

git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup

pip安裝:pip是安裝Python包的管理器,類似yum

yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install ansible --upgrade

確認安裝

[root@Ansible ~]#ansible --version
ansible 2.7.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

Ansible的相關文件

相關配置文件

/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主機清單
/etc/ansible/roles/ 存放角色的目錄

相關程序文件

/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具
/usr/bin/ansible-galaxy 下載/上傳優秀代碼或Roles模塊的官網平臺
/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具/usr/bin/ansiblepull 遠程執行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基於Console界面與用戶交互的執行工具

主機清單/etc/ansible/hosts文件格式

  主機清單文件遵循INI文件風格,中括號中的字符爲組名。可以將同一個主機同時歸併到多個不同的組中;此外,當如若目標主機使用了非默認的SSH端口,還可以在主機名稱之後使用冒號加端口號來標明

eg:
[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配置文件

  Ansible 配置文件爲/etc/ansible/ansible.cfg (一般保持默認)

[defaults]
#inventory = /etc/ansible/hosts # 主機列表配置文件
#library = /usr/share/my_modules/ # 庫文件存放目錄
#remote_tmp = $HOME/.ansible/tmp #臨時py命令文件存放在遠程主機目錄
#local_tmp = $HOME/.ansible/tmp # 本機的臨時命令執行目錄
#forks = 5 # 默認併發數
#sudo_user = root # 默認sudo 用戶
#ask_sudo_pass = True #每次執行ansible命令是否詢問ssh密碼
#ask_pass = True
#remote_port = 22
#host_key_checking = False # 檢查對應服務器的host_key,建議取消註釋
#log_path=/var/log/ansible.log #日誌文件
#module_name = command #默認模塊

Ansible命令

  ansible通過ssh實現配置管理、應用部署、任務執行等功能,建議配置ansible端能基於密鑰認證的方式聯繫各被管理節點

ansible-doc:顯示模塊幫助文檔

  ansible-doc –l 列出所有模塊
  ansible-doc ping 查看指定模塊幫助用法
  ansible-doc –s ping 查看指定模塊幫助用法

ansible命令格式

  ansible <host-pattern> [-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 切換
    --become-user=USERNAME 指定sudo的runas用戶,默認爲root

Ansible的Host-pattern

  All表示所有主機清單中的所有主機
    ansible all –m ping

邏輯與

  在websrvs組並且在dbsrvs組中的主機
    ansible “websrvs:&dbsrvs” –m ping

邏輯或

  在websrvs組,但不在dbsrvs組中的主機
    ansible 'websrvs:!dbsrvs' –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基於祕鑰認證連接目標主機

  1. 祕鑰認證,生成祕鑰文件

    [root@Ansible ~]# ssh-keygen -t rsa -P ""
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    fe:e7:77:ab:0a:af:9c:34:80:13:95:11:e6:c1:52:fb root@Ansible
    The key's randomart image is:
    +--[ RSA 2048]----+
    |      oB+        |
    |     .+oo        |
    |     ..o         |
    |      o .        |
    |     o .SE       |
    |      ...        |
    |        .+       |
    |        o.= . . .|
    |         +o=oo.o.|
    +-----------------+
  2. 將生成的公鑰文件傳送到目標主機上
[root@Ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
The authenticity of host '192.168.36.37 (192.168.36.37)' can't be established.
RSA key fingerprint is 81:e7:91:36:23:aa:e0:db:7e:35:f1:d2:81:cf:97:9a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.36.37' (RSA) to the list of known hosts.
[email protected]'s password:
Now try logging into the machine, with "ssh '[email protected]'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Ansible使用示例

  探測目標主機是否可達

由淺入深學習Ansible工具

Ansible常用模塊

  Ansible有許多模塊,這裏僅列出最常用的幾種模塊進行練習

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

  ansible srvs -m command -a 'service vsftpd start'
  ansible srvs -m command -a 'echo magedu |passwd --stdin wang'
  此命令不支持 $VARNAME < > | ; & 等,用shell模塊實現
  command模塊缺陷:(當字符串輸出,command在執行時,不使用shell解析)

  查看遠程主機名

由淺入深學習Ansible工具

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

  ansible srv -m shell -a 'echo magedu |passwd –stdin wang'
  調用bash執行命令 類似 cat /tmp/stanley.md | awk -F'|' '{print $1,$2}'&> /tmp/example.txt 這些複雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器

  遠程主機用戶添加密碼

由淺入深學習Ansible工具

Script:在遠程主機上運行ansible服務器上的腳本

  -a "/PATH/TO/SCRIPT_FILE“
  ansible websrvs -m script -a /data/f1.sh
由淺入深學習Ansible工具

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”
  指定內容,直接生成目標文件

  複製ansible服務器文件到遠程主機,並設置權限爲600

由淺入深學習Ansible工具

  遠程主機查看

由淺入深學習Ansible工具

Fetch:從遠程主機提取文件至主控端,copy相反,目錄可先tar

  ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts'

  複製遠程主機文件到ansible服務器

由淺入深學習Ansible工具

  ansible服務器查看複製過來的文件

由淺入深學習Ansible工具

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'

  設置遠程主機文件所屬用戶爲Darius,權限爲666

由淺入深學習Ansible工具

  設置遠程主機文件的鏈接文件

由淺入深學習Ansible工具

  查看遠程主機文件

由淺入深學習Ansible工具

Hostname:管理主機名

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

  直接修改主機名,主機名的配置文件同時也進行修改

由淺入深學習Ansible工具

  查看主機名稱以及主機配置文件

由淺入深學習Ansible工具

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 'state=absent name=Synctime' 刪除任務

  添加每五分鐘同步一次時間的計劃任務

由淺入深學習Ansible工具

  刪除計劃任務

由淺入深學習Ansible工具

Yum:管理包

  ansible srv -m yum -a 'name=httpd state=present' 安裝
  ansible srv -m yum -a 'name=httpd state=absent' 刪除

  安裝軟件包

由淺入深學習Ansible工具

  查看包是否安裝

由淺入深學習Ansible工具
  

  卸載軟件包

由淺入深學習Ansible工具

  查看包是否卸載

由淺入深學習Ansible工具

Service:管理服務

  ansible srv -m service -a 'name=httpd state=stopped' # 停止服務
  ansible srv -m service -a 'name=httpd state=started enabled=yes' # 啓動服務並設置開機自啓動
  ansible srv -m service -a 'name=httpd state=reloaded' # 重新加載配置文件
  ansible srv -m service -a 'name=httpd state=restarted' # 重啓服務

  遠程啓動服務,查看端口號看是否啓動成功

由淺入深學習Ansible工具

  停止服務

由淺入深學習Ansible工具

User:管理用戶

  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 remove=yes'
  刪除用戶及家目錄等數據

  創建用戶user1,uid=2048,所屬組爲root,家目錄爲/app/user1,備註爲test user1

由淺入深學習Ansible工具
由淺入深學習Ansible工具

  刪除用戶並刪除用戶家目錄

由淺入深學習Ansible工具

Group:管理組

  ansible srv -m group -a "name=testgroup system=yes“
  ansible srv -m group -a "name=testgroup state=absent"

  創建組

由淺入深學習Ansible工具

  刪除組

由淺入深學習Ansible工具

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章