天天看點

Ansible 介紹與實戰操作示範

作者:大資料老司機

一、概述

Ansible是新出現的自動化運維工具,基于Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優點,實作了批量系統配置、批量程式部署、批量運作指令等功能。

Ansible 特點:

  • 部署簡單,隻需要在主要端部署Ansible環境,被控端無需作任何操作
  • 預設使用SSH協定對裝置進行管理
  • 主從集中化管理
  • 配置簡單、功能強大、擴充性強
  • 支援API及自定義子產品、可以通過Python輕松擴充
  • 通過Playbooks來定制強大的配置、狀态管理
  • 對雲計算平台、大資料都有很好的支援

官方文檔:https://docs.ansible.com/ansible/latest/

GitHub位址:https://github.com/ansible/ansible

二、Ansible 架構

Ansible 介紹與實戰操作示範

上圖為ansible的基本架構,從上圖可以了解到其由以下部分組成:

  • 核心:ansible
  • 核心子產品(Core Modules):這些都是ansible自帶的子產品
  • 擴充子產品(Custom Modules):如果核心子產品不足以完成某種功能,可以添加擴充子產品
  • 插件(Plugins):完成子產品功能的補充
  • 劇本(Playbooks):ansible的任務配置檔案,将多個任務定義在劇本中,由ansible自動執行
  • 連接配接插件(Connectior Plugins):ansible基于連接配接插件連接配接到各個主機上,雖然ansible是使用ssh連接配接到各個主機的,但是它還支援其他的連接配接方法,是以需要有連接配接插件
  • 主機清單(Host Inventory):定義ansible管理的主機

三、Ansible 工作原理

Ansible 介紹與實戰操作示範

從上面的圖上可以了解到:

  • 管理端支援local 、ssh、zeromq 三種方式連接配接被管理端,預設使用基于ssh的連接配接,這部分對應上面架構圖中的連接配接子產品;
  • 可以按應用類型等方式進行Host Inventory(主機清單)分類,管理節點通過各類子產品實作相應的操作,單個子產品,單條指令的批量執行,我們可以稱之為ad-hoc;
  • 管理節點可以通過playbooks 實作多個task的集合實作一類功能,如web服務的安裝部署、資料庫伺服器的批量備份等。playbooks我們可以簡單的了解為,系統通過組合多條ad-hoc操作的配置檔案 。

四、Ansible 安裝與基礎配置

yum install epel-release
yum -y install ansible
ansible --version           
Ansible 介紹與實戰操作示範

1)開啟記錄日志

配置檔案:/etc/ansible/ansible.cfg

# 去掉前面的'#'号
#log_path = /var/log/ansible.log ==> log_path = /var/log/ansible.log           

2)去掉第一次連接配接ssh ask确認

# 第一種(推薦)
vi /etc/ansible/ansible.cfg  
# 其實就是把#去掉
# host_key_checking = False  ==> host_key_checking = False

# 第二種
vi /etc/ssh/ssh_config
StrictHostKeyChecking ask  ==> StrictHostKeyChecking no           
Ansible 介紹與實戰操作示範

五、Ansible 的七個指令

安裝完ansible後,發現ansible一共為我們提供了七個指令:ansible、ansible-doc、ansible-galaxy、ansible-lint、ansible-playbook、ansible-pull、ansible-vault。這裡我們隻檢視usage部分,詳細部分可以通過 "指令 -h" 的方式擷取。

1)ansible

ansible是指令核心部分,其主要用于執行ad-hoc指令,即單條指令。預設後面需要跟主機和選項部分,預設不指定子產品時,使用的是command子產品。不過預設使用的子產品是可以在/etc/ansible/ansible.cfg 中進行修改的#module_name = command。

ansible 192.168.182.130 -a 'date'           

2)ansible-doc

該指令用于檢視子產品資訊,常用參數有兩個-l 和 -s

#列出所有已安裝的子產品ansible-doc  -l
ansible-doc  -l
#檢視具體某子產品的用法,這裡如檢視command子產品
ansible-doc  -s command           

3)ansible-playbook

ansible-playbook 指令是使用最多的指令,其通過讀取playbook 檔案後,執行相應的動作,這個後面會做為一個重點來講。

4)ansible-galaxy

ansible-galaxy 指令用于友善的從https://galaxy.ansible.com/ 站點下載下傳第三方擴充子產品,我們可以形象的了解其類似于centos下的yum、python下的pip或easy_install 。如下示例:

ansible-galaxy install aeriscloud.docker           

5)ansible-lint

ansible-lint是對playbook的文法進行檢查的一個工具。用法如下:

ansible-lint playbook.yml           

6)ansible-pull

該指令使用需要談到ansible的另一種模式,pull 模式,這和我們平常經常用的push模式剛好相反,其适用于以下場景:你有數量巨大的機器需要配置,即使使用非常高的線程還是要花費很多時間;你要在一個沒有網絡連接配接的機器上運作Anisble,比如在啟動之後安裝。

7)ansible-vault

  • ansible-vault 主要應用于配置檔案中含有敏感資訊,又不希望他能被人看到,vault可以幫你加密/解密這個配置檔案,屬進階用法。
  • 主要對于playbooks裡比如涉及到配置密碼或其他變量時,可以通過該指令加密,這樣我們通過cat看到的會是一個密碼串類的檔案,編輯的時候需要輸入事先設定的密碼才能打開。
  • 這種playbook檔案在執行時,需要加上 --ask-vault-pass參數,同樣需要輸入密碼後才能正常執行。

六、Ansible 主要組成部分

1)ansible 指令執行來源

  • USER,普通使用者,即system administrator
  • USER -> ansile playbook -> ansible
  • CMDB,(配置管理資料庫)API調用
  • PUBLIC / PRIVATE CLOUD API調用

2)ansible 管理方式

  • Ad-Hoc,即ansible指令,主要用于臨時指令使用場景
  • Ansible-playbook,主要用于長期規劃好的,大型項目的場景,需要有前提的規劃

    ansible-playbook(劇本)執行過程:将已有編排好的任務集寫入ansible-playbook通過ansible-playbook指令分拆任務集至逐條ansible指令,按預定規則逐條執行

3)ansible主要操作對象

  • HOSTS:主機
  • NETWORKING:網絡裝置

注意事項:

  • 執行ansible的主機一般稱為主要端,中控,master或堡壘機
  • 主要端python版本需要在2.6或以上
  • 被控端python版本小于2.4需要安裝python-simplejson
  • 被控端如開啟SELinux需要安裝libselinux-python
  • windows不能作為主要端

七、Ansible 連接配接被控端方式

1)ssh 密鑰

# 生成秘鑰
ssh-keygen
# 将秘鑰拷貝到被管理伺服器上
ssh-copy-id  -i ~/.ssh/id_rsa.pub -p 22 [email protected]           

2)賬号密碼

1、指令行配置

# -k:互動式
ansible -uroot -k 192.168.182.130 -m ping           

2、配置檔案中配置

# 預設主機配置檔案:/etc/ansible/hosts
192.168.182.130 ansible_ssh_user=root ansible_ssh_pass=123456

[web]
192.168.182.130 ansible_ssh_user=root ansible_ssh_pass=123456           

常用的配置參數如下:

Ansible 介紹與實戰操作示範

八、Host Inventory(主機清單)

主機清單配置(預設配置檔案:/etc/ansible/hosts)

1)添加被管控節點

192.168.182.110           

示例:

# -m:指定子產品
# -a:指定參數
ansible 192.168.182.110 -m ping
ansible 192.168.182.110 -m shell -a "df -h"           
Ansible 介紹與實戰操作示範

2)配置主機組

# 定義webservers組
[webservers]
192.168.182.110
192.168.182.112           

示例:

# -m:指定子產品
# -a:指定參數
ansible webservers -m ping
ansible webservers -m shell -a "df -h"           
Ansible 介紹與實戰操作示範

3)配置連接配接使用者名和密碼

[webservers]
192.168.182.130 ansible_ssh_user=root ansible_ssh_pass=123456           

常用配置參數如下:

Ansible 介紹與實戰操作示範

示例:

ansible 192.168.182.130 -m ping           
Ansible 介紹與實戰操作示範

4)子分組

[web]
192.168.182.130
192.168.182.110
[mysql]
192.168.182.111
# 子分組
[nfs:children]
web
mysql
# 對分組統一定義變量
[nfs:vars]
ansible_ssh_user=root
ansible_ssh_pass=123456
ansible_ssh_port=22           

示例:

ansible nfs -m ping
# -o:一行顯示
ansible nfs -m ping -o           
Ansible 介紹與實戰操作示範

5)自定義主機清單檔案

cat>hostlist<<EOF
[web]
192.168.182.130
192.168.182.110
[mysql]
192.168.182.111
# 子分組
[nfs:children]
web
mysql
# 對分組統一定義變量
[nfs:vars]
ansible_ssh_user=root
ansible_ssh_pass=123456
ansible_ssh_port=22
EOF           

示例:

# -i:指定主機清單檔案
ansible -i hostlist nfs -m ping           
Ansible 介紹與實戰操作示範

九、Ad-Hoc(點對點模式)

官方文檔:https://docs.ansible.com/ansible/latest/command_guide/intro_adhoc.html

1)簡介

ad-hoc 指令是一種可以快速輸入的指令,而且不需要儲存起來的指令,一般測試調試時用的多,ad-hoc簡而言之,就是"臨時指令"。

2)常用子產品

1、command 子產品(預設子產品)

預設子產品,沒有shell強大,基本上shell子產品都可以支援command子產品的功能。

【1】幫助

ansible-doc command
# 推薦使用下面這個
ansible-doc command -s           

【2】參數解釋

  • free_form——必須參數,指定需要遠端執行的指令。需要說明一點,free_form 參數與其他參數(如果想要使用一個參數,那麼則需要為這個參數指派,也就是name=value模式)并不相同。比如,當我們想要在遠端主機上執行 ls 指令時,我們并不需要寫成”free_form=ls” ,這樣寫反而是錯誤的,因為并沒有任何參數的名字是 free_form,當我們想要在遠端主機中執行 ls 指令時,直接寫成 ls 即可。因為 command 子產品的作用是執行指令,是以,任何一個可以在遠端主機上執行的指令都可以被稱為 free_form。
  • chdir——此參數的作用就是指定一個目錄,在執行對應的指令之前,會先進入到 chdir 參數指定的目錄中。
  • creates——看到 creates,你可能會從字面上了解這個參數,但是使用這個參數并不會幫助我們建立檔案,它的作用是當指定的檔案存在時,就不執行對應指令,比如,如果 /testdir/test檔案存在,就不執行我們指定的指令。
  • removes——與 creates 參數的作用正好相反,它的作用是當指定的檔案不存在時,就不執行對應指令,比如,如果 /testdir/tests 檔案不存在,就不執行我們指定的指令,此參數并不會幫助我們删除檔案。

【3】示例示範

# 上面指令表示在 web 主機上執行 ls 指令,因為使用的是 root 使用者,是以預設情況下,ls 出的結果是 web 主機中 root 使用者家目錄中的檔案清單。
ansible web -m command -a "ls"

# chdir 參數表示執行指令之前,會先進入到指定的目錄中,是以上面指令表示檢視 web 主機上 /testdir 目錄中的檔案清單,傳回顯示有2個檔案。
ansible web -m command -a "chdir=/testdir ls"

# 下面指令表示 /testdir/testfile1 檔案存在于遠端主機中,則不執行對應指令。/testdir/testfile3 不存在,才執行”echo test”指令。
ansible web -m command -a "creates=/testdir/testfile1 echo test"

# 下面指令表示 /testdir/testfile3 檔案不存在于遠端主機中,則不執行對應指令。/testdir/testfile1 存在,才執行”echo test”指令。
ansible web -m command -a "removes=/testdir/testfile1 echo test"           

2、shell 子產品

shell子產品 [執行遠端主機的shell/python等腳本]。

【1】檢視幫助

ansible-doc shell -s           

【2】示例示範

# -o:一行顯示
# 安裝httpd
ansible web -m shell -a 'yum -y install httpd' -o

# 檢視時間
ansible web -m shell -a 'uptime' -o           

3、script 子產品

script子產品 [在遠端主機執行主要端的shell/python等腳本 ]。

【1】檢視幫助

ansible-doc script -s           

【2】參數解釋

  • free_form——必須參數,指定需要執行的腳本,腳本位于 ansible 管理主機本地,并沒有具體的一個參數名叫 free_form,具體解釋請參考 command 子產品。
  • chdir——此參數的作用就是指定一個遠端主機中的目錄,在執行對應的腳本之前,會先進入到 chdir 參數指定的目錄中。
  • creates——使用此參數指定一個遠端主機中的檔案,當指定的檔案存在時,就不執行對應腳本,可參考 command 子產品中的解釋。
  • removes——使用此參數指定一個遠端主機中的檔案,當指定的檔案不存在時,就不執行對應腳本,可參考 command 子產品中的解釋。

【3】示例示範

# 下面指令表示 ansible 主機中的 /testdir/testscript.sh 腳本将在 web 主機中執行,執行此腳本之前,會先進入到 web 主機中的 /opt 目錄
ansible web -m script -a "chdir=/opt /testdir/testscript.sh"

# 下面指令表示,web主機中的 /testdir/testfile1檔案已經存在,ansible 主機中的 /testdir/testscript.sh 腳本将不會在 web 主機中執行。
ansible web -m script -a "creates=/testdir/testfile1 /testdir/testscript.sh"

# 下面指令表示,web 主機中的 /testdir/testfile1 檔案存在,ansible 主機中的 /testdir/testscript.sh 腳本則會在 web 主機中執行。
ansible ansible-demo3 -m script -a "removes=/testdir/testfile1 /testdir/testscript.sh"           

4、raw 子產品

raw子產品 [類似于command子產品、支援管道傳遞]。

【1】檢視幫助

ansible-doc raw -s           

【2】示例示範

ansible web -m raw -a "ifconfig eth0 |sed -n 2p |awk '{print \$2}' |awk -F: '{print \$2}'"           

5、copy 子產品

copy 子產品 從主要端複制檔案到被控端。

【1】檢視幫助

ansible-doc copy -s           

【2】示例示範

# -a,--args:後面接參數
ansible web -m copy -a 'src=/etc/ansible/hosts dest=/tmp/hosts owner=root group=bin mode=777'

# backup=yes/no:檔案存在且檔案内容不一樣是否備份,預設不備份
ansible web -m copy -a 'src=/etc/ansible/hosts dest=/tmp/hosts owner=root group=bin mode=777 backup=yes'           

6、fetch 子產品

copy 子產品從被控端複制檔案到主要端,正好跟copy相反。

【1】檢視幫助

ansible-doc fetch -s           

【2】示例示範

# 跟copy支援的參數差不多,src:遠端主機的目錄,dest:主要端目錄,其實真正存放的目錄在:/tmp/192.168.182.129/tmp/up.sh,會按每台主機分組存放
#  This `must' be a file, not a directory:隻支援單個檔案擷取
ansible 192.168.182.129 -m fetch -a "src=/etc/fstab dest=/testdir/ansible/"           

7、unarchive 子產品(解包子產品)

unarchive 子產品是解包子產品。

【1】檢視幫助

ansible-doc unarchive -s           

【2】參數解釋

  • copy——預設為yes,當copy=yes,那麼拷貝的檔案是從ansible主機複制到遠端主機上的,如果設定為copy=no,那麼會在遠端主機上尋找src源檔案。
  • src——源路徑,可以是ansible主機上的路徑,也可以是遠端主機上的路徑,如果是遠端主機上的路徑,則需要設定copy=no。
  • dest——遠端主機上的目标路徑。
  • mode——設定解壓縮後的檔案權限。

【3】示例示範

ansible 192.168.182.129 -m unarchive -a 'src=/testdir/ansible/data.tar.gz dest=/tmp/tmp/'           

8、archive子產品(打包子產品)

unarchive 子產品是打包子產品。

【1】檢視幫助

ansible-doc archive -s           

【2】示例示範

# path:主要端目錄,format:壓縮格式,dest:被控端目錄檔案'
ansible 192.168.182.129 -m archive -a 'path=/tmp/ format=gz dest=/tmp/tmp/t.tar.gz'           

9、user 子產品

【1】檢視幫助

ansible-doc user -s           

【2】示例示範

# 建立使用者(present:預設,可以不寫)
ansible web -m user -a 'name=test state=present'

# 删除使用者(absent)
ansible web -m user -a 'name=test state=absent'

# 修改密碼
# 步驟一、生成加密密碼
echo '777777'|openssl passwd -1 -stdin

# 步驟二、修改秘密
ansible web -m user -a 'name=test password="$1$Jo5FD9Jr$2QB.BuybbtR35ga4O5o8N."'

# 修改shell
ansible web -m user -a 'name=test shell=/sbin/noglogin append=yes'           

10、group 子產品

【1】檢視幫助

ansible-doc group -s           

【2】示例示範

# 建立
ansible 192.168.182.129 -m group -a 'name=testgroup system=yes'
# 删除
ansible 192.168.182.129 -m group -a 'name=testgroup state=absent'           

11、yum 子產品

【1】檢視幫助

ansible-doc yum -s           

【2】示例示範

# 更新所有包
ansible web -m yum -a 'name="*" state=latest'

# 安裝apache
ansible web -m yum -a 'name="httpd" state=latest'           

12、service 子產品

【1】檢視幫助

ansible-doc service -s
           

【2】示例示範

ansible web -m service -a 'name=httpd state=started'

ansible web -m service -a 'name=httpd state=started enabled=yes'

ansible web -m service -a 'name=httpd state=stopped'

ansible web -m service -a 'name=httpd state=restarted'

ansible web -m service -a 'name=httpd state=started enabled=no'           

13、file 子產品

【1】檢視幫助

ansible-doc file -s           

【2】示例示範

# 建立檔案
ansible web -m file -a 'path=/tmp/88.txt mode=777 state=touch'

# 建立目錄
ansible web -m file -a 'path=/tmp/99 mode=777 state=directory'

# 删除
ansible web -m file -a 'path=/tmp/99 state=absent'           

14、setup 子產品

【1】檢視幫助

ansible-doc setup -s           

【2】示例示範

ansible web -m setup

ansible web -m setup -a 'filter=ansible_all_ipv4_addresses'           

15、cron 子產品

【1】檢視幫助

ansible-doc cron -s           

【2】示例示範

# 建立定時任務
ansible 192.168.182.129 -m cron -a 'minute=* weekday=1,3,5,6,7 job="/usr/bin/wall FBI warning" name=warningcron'

# 關閉定時任務
ansible 192.168.182.129 -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'

# 删除定時任務
ansible 192.168.182.129 -m cron -a ' job="/usr/bin/wall FBI warning" name=warningcron state=absent'           

16、hostname 子產品

【1】檢視幫助

ansible-doc hostname -s           

【2】示例示範

ansible 192.168.182.129 -m hostname -a 'name=192.168.182.129'           

Ansible 的介紹和簡單使用就先到這裡了,還有一個ansible-playbook是非常重要,内容也是比較多,就放到下篇文章介紹了,有疑問的小夥伴歡迎給我留言,後續會持續更新相關技術文章!!!

繼續閱讀