ansible的介紹和安裝
ansible的介紹和安裝
ansible基于python開發的一種簡單的自動化IT工具,能夠實現批量系統配置、部署、運行命令等功能。無需agent端,因為它是基于ssh來運行。
對于saltstack和puppet來說,它是一款很好的基于ssh方案的替代品,能夠大大地簡化Linux管理員的自動化配置管理與流程控制方式,它利用推送的方式對客戶端系統加以配置,這樣所有的工作都可以在主控制端完成,其命令機制同樣非常強大,可以使用Web UI實現授權管理與配置。
性能特性總結:
它是基于Python語言實現,通過ssh進行管理節點,無需agent端,使用起來很方便。
Ansible巧妙地利用了現有的組件進行組裝稱一個完整的系統,如:
1.Paramiko組件(python的ssh連接庫)
2. PyYAML組件(python的YAML解析器庫)
3.Jinja2組件(Python的模板引擎庫)
受控節點如果是Python 2.4 或 Python 2.5 ,則需額外安裝Simplejson模塊。到Python的2.6或以上版本,就則內置了Simplejson模塊,不需要額外安裝任何其它依賴。值得欣慰的是,目前主流的服務器上內置的Python版本絕多數都是Python 2.6以上版本。
Anshible的核心組件
Ansible在管理節點將ansible模塊通過ssh協議(或者kerberos、LDAP)推送到被管理端執行,執行完之后自動刪除,可以使用SVN等來管理自定義模塊及編排。
Host Inventory: 自定義ansible管理主機,可以進行分組管理,對應的文件是hosts;
Core Modules : ansible核心模塊,ansible中模塊就是用來指定對遠程主機具體的操作,比如,執行命令模塊command、創建文件模塊file等(這是ansible自帶的模塊)
Custom Modules:自定義模塊,如果核心模塊不足以完成某種功能就可以使用任何語言自定義模塊;
Connection Plugins:連接插件是ansible用來連接被管理端的一種方式,比如客戶端運行了SSH服務,ansible利用ssh服務跟客戶端通信,ansible是通過python編寫的,而python有一個paramiko支持并行連接ssh,ansible事實上就是使用paramiko進行連接被管理管,但是它還支持其他的連接方法,但是需要插件(如zeroMQ就是C/S模式工作)
Plugins:第三方插件支持,如Email、logging模塊,只要有python編寫能力就可以自行編寫插件;
Playbooks: 劇本或編輯是ansible的任務配置文件、將多個任務定義在劇本中有ansible自動執行,Playbooks最大的好處就是支持冪等,也就是說相同的任務不管執行對少次其結果是不變的,帶來的好處就是持續可維護性;
Anshible的安裝
一、yum或apt安裝
二、python安裝
三、源碼包安裝
Ansible文件說明:
[root@bogon ~]# rpm -ql ansible|more
/etc/ansible
/etc/ansible/ansible.cfg 主配置文件
/etc/ansible/hosts 默認定義主機清單文件
/etc/ansible/roles 用來編排Playbook
Ansible模塊使用幫助命令,其中使用-l可以查看ansible自帶的模塊
/usr/bin/ansible-doc
/usr/bin/ansible-galaxy
/usr/bin/ansible-inventory
用來執行playbook的程序
/usr/bin/ansible-playbook
/usr/bin/ansible-pull
/usr/bin/ansible-vault
Ansible開始簡單實用
ansible -i /etc/ansible/host all [options]
其中 -i 用來指定inventory文件,默認就是使用/etc/ansible/hosts,其中all是針對hosts定義的所有主機執行,這里也可以hosts中地址的組名或模塊
[options]
-m:指定模塊(默認是command模塊)
-a: 指定模塊的參數
-u:指定執行遠程主機的用戶(默認是root)ansible.cfg中可配置
-s:以sodu方式運行
-U:sudo到哪個用戶(默認是root用戶)
-f:指定多個進程并發處理(默認是5)
--private-key=/path:指定私鑰路徑
-T:ssh連接超時時間(默認10秒)
-t:日志輸出到該目錄
-v:顯示詳細信息
開始使用ansible
1)定義Inventory
Inventory文件是用來定義要管理的主機,默認位置在/etc/ansible/hosts,如果不保存在默認位置,也可以使用-i選項指定,被管理的機器可以通過其ip或域名指定。每個中括號[ ]里代表一個分組,其下的機器列表都歸屬這個分組,直到出現下一個中括號位置,通常我們按組來執行任務,同一個組受控服務器用相同的配置,一臺服務器也可以歸屬多個組,以完成多個功能角色的配置,低耦合,模塊化,非常的靈活,如定義一個分組[web],并給定一臺主機:
cat /etc/ansible/hosts
[web]
192.168.20.55 ansible_ssh_user="root" ansible_ssh_pass="111111"
2)執行ansible的命令
配置好主機列表之后就可以開始執行批量任務,ansible自帶了ping模塊,可以測試“管理節點”和“受控節點”之間的網絡通訊情況;
Linux服務器均使用SSH進行遠程管理,SSH服務是服務器必備組件,Ansible在設計上見話是用成本,在“管理節點”上使用SSH連接“受控節點”,通過創建SSH連接來發送指使并執行,達到配置管理的目的,這樣避免了不同版本的操作系統、甚至不同發行版本的操作系統下使用agent帶來的兼容性問題。
首先,ansible測試管理節點和受控節點的網絡通訊情況:
不使用免密鑰的時候則安裝sshpass
centos使用yum安裝
ubuntu使用apt-get安裝
或者:
注意,如果是第一次使用SSH連接agent端,那么就不能使用-k了,要先進行公鑰保存確認,然后再使用-k連接,
ansible第一次遠程連接agent端的時候,agent端先安裝apt -y install python-minimal,再執行ansible命令
如:
如果出現這樣的錯誤時則操作下面的步驟:
遠程端:
服務端:
如果使用密鑰方式登陸SSH,去掉-k參數即可,可以為Ansible設置一個特定的用戶,所有操作均以此用戶來執行,甚至可以為每個“受控節點”設置各自不同的用戶
全局用戶的設置見配置文件/etc/ansible/ansible.cfg,修改[defaults]段落里的remote_user的值即可,也可以通過修改remote_port來定義Ansible去使用非標準的22/SSH端口來進行連接和管理,在沒有給“受控節點”或“受控組”進行特定設置時,Ansible將默認使用全局設置。
cat /etc/ansible/ansible.cfg
3)Inventory格式的編寫
Ansible通過讀取默認的主機清單配置/etc/ansible/hosts,可以同時連接到多個遠程主機上執行任務,默認路徑可以通過修改ansible.cfg的hostfile參數地址路徑,主機清單配置格式如下:
# 指定IP地址并且支持通配;
# 組嵌套,當執行組[weball]時就會執行它的所有子組但是子組可以獨立執行;
另外可以通過設置ansible_ssh_user來指定用戶在“受控節點”上執行的任務,還可以通過設置ansible_ssh_host來指定不同主機或域名,SSH對應的端口也可以通過ansible_ssh_port來修改,同時還能使用特定的密鑰登陸。
常用參數如下:
ansible_connection=ssh #指定連接類型,可以使local、ssh、paramiko;
ansible_ssh_user=root #用于指定遠程主機的賬號;
ansible_ssh_pass=password #指定連接到主機的密碼連-k都省了;
ansible_ssh_port=23 #用于指定遠程主機SSH端口;
ansible_ssh_privare_key_file=/PATH #用于指定key文件;
host_key_checking=false #當第一次連接遠程主機,跳過yes/no環節;
ansible_shell_type #指定目標系統的shell(默認為sh);
ansible_python_interpreter=/ #指定Python解釋器路徑(默認/USR/BIN/PYTHON);
配置示范:
cat /etc/ansible/hosts
管理節點操作:
可能有些場景下,執行配置管理需要用root權限。但由于安全原因,可能會限制root使用SSH登錄。比如:Ubuntu系統默認就不能使用 root 直接SSH登錄系統。Ansible設計時也考慮到此類場景,這種情況下我們只需要告訴Ansible使用sudo的方式執行那些需要 root 權限的配置任務。前提條件是執行Ansible任務的用戶需要有sudo的權限。要設定Ansible使用sudo,執行Ansible的任務的用戶必須要有sudo權限。可以通過修改/etc/sudoers文件或visudo命令來完成,或者直接使用現在符合條件的用戶。參數-sudo即告訴Ansible使用sudo來運行任務,如果sudo需要密碼,則需要添加-k參數,或者在配置文件/etc/ansible/ansible.cfg中添加ask_sudo_pass的屬性。
Ansible使用鍵值方式接受參數,即傳統的KV方式(key=value)。每次執行任務后,將以JSON格式返回結果。它可以解析復雜的參數,或者用playbooks方式(后面會講解)。Ansible返回會明確指明運行是否成功、是否有變動以及失敗時的錯誤信息。
通常都用playbooks的方式來執行Ansible任務,少數情況下使用命令行模式運行。過去,我們用Ansible的ping模塊來檢查“受控節點”是否正常受控。而實際上,ping模塊僅僅執行了Ansible最核心的功能并檢查了網絡聯通性,并未做其它實際性動作。
通常都用playbooks的方式來執行Ansible任務,少數情況下使用命令行模式運行。過去,我們用Ansible的ping模塊來檢查“受控節點”是否正常受控。而實際上,ping模塊僅僅執行了Ansible最核心的功能并檢查了網絡聯通性,并未做其它實際性動作。
進而產生了setup模塊,它不僅可以反饋“受控節點”的可用性,還會收集一些系統信息以供其它模塊使用。Setup 模塊定義了一系列的采集指令,比如:內核版本、機器名、IP地址等等,并將這些信息保存在內置變量,其它模塊再執行任務時可以直接引用或用于判斷條件等。
主機變量和組變量
Inventory除了上述的基本功能外,還可以在主機后面定義變量以便于在playbook中使用,例:
不光對主機可以定義變量,對組也可以定義變量。組變量是指賦予給組內所有主機,都可以在playbook中使用,格式如下:
這就是針對web01組設置的組變量,:vars是固定格式,組內的所有變量都可以給組內的主機使用。
常用模塊的介紹:
根據Ansible官方的分類,將模塊分為核心模塊和額外模塊;
核心模塊按功能分類為:云模塊、命令模塊、數據庫模塊、文件模塊、資產模塊、消息模塊、監控模塊、網絡模塊、通知模塊、包管理模塊、源碼控制模塊、系統模塊、單元模塊、web設施模塊、windows模塊等。
具體可以參看官方頁面ansible-modules-core。這里從官方分類的模塊里選擇最常用的一些模塊進行介紹,介紹之前我們先調整一下hosts文件,把默認用戶和密碼添加到主機中,這樣就不需要指定-u及-k了

浙公網安備 33010602011771號