A. Ansible安裝配置和基本使用
http://www.tuicool.com/wx/vUfYVfA
一、ansible 安裝
ansible 依賴於python2.6或更高的版本、paramiko、PyYAML及Jinja2。
https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
將python頭文件拷貝到標准目錄,以避免編譯ansible時,找不到所需的頭文件
備份舊版本的python,並符號鏈接新版本的python
修改yum腳本,使其指向舊版本的python,已避免其無法運行
1.1 編譯安裝
解決依賴關系
解壓安裝包
https://github.com/ansible/ansible/archive/v1.7.2.tar.gz
編譯安裝
拷貝配置文件
1.2 rpm包安裝
使用阿里雲鏡像源即可,這里為了方便使用,就直接使用yum安裝了。
Fedora 用戶可直接安裝Ansible, 但RHEL或CentOS用戶,需要 配置 EPEL # yum install -y epel-release # yum install -y ansible
注意:不同版本的ansible的功能差異可能較大。
二、配置
配置文件:/etc/ansible/ansible.cfg
hostfile=/etc/ansible/hosts #指定默認hosts配置的位置 host_key_checking = False #不進行host_key檢查,省去目標key發生變化時輸入(yes/no)的步驟 ask_pass=True # 每次執行ansible命令是否詢問ssh密碼 ask_sudo_pass=True # 每次執行ansible命令時是否詢問sudo密碼
主機清單:/etc/ansible/hosts
主程序:ansible、ansible paly-book、ansible-doc
1、將要管理的主機納入 /etc/ansible/hosts配置文件中,可以填寫IP或是主機名
[WebServers] 10.10.10.3 10.10.10.4
2、.基於ssh的方式與被管理的主機進行通信,在管理的主機上(部署ansible的主機上)生成一對非對稱密鑰,將公鑰發給被管理的主機。
a,生成密鑰對:ssh-keygen -t rsa
b,將密鑰發放到要管理的主機:ssh--id -i 10.10.10.3 或 ssh--id -i /root/.ssh/id_rsa.pub [email protected]
3、使用ansible命令測試
[root@wlm yum.repos.d]# ansible all -m ping 10.10.10.4 | SUCCESS => { "changed": false, "ping": "pong" }
三、基本使用
1、常用命令
ansible-doc 命令:獲取模塊列表、模塊使用格式。
ansible-doc -l :獲取列表
ansible-doc -s mole_name:獲取指定模塊信息
2、ansible 命令格式
ansible <host-pattern> [-f forks] [-m mole_name] [-a args]
<host-pattern> 指明管控主機,以模式表示或者直接指定ip,必須事先指定在文件中;all所有
[-f forks] 指明每批管控多少主機,默認是5個主機一批次
[-m mole_name] 使用何種模塊操作,所有操作都需要通過模塊指定
[-a args] 指明模塊專用參數;args 一般是 key=value格式。註:command模塊的參數不是kv模式,而是直接給出要執行的命令。
注意:<host-pattern> 默認讀取/etc/ansible/hosts,也可以指明自定義文件路徑 -iPATH,--inventory=PATH:指明使用的 host inventory文件路徑;
3、常用模塊介紹
1、command模塊:遠程主機上運行命令
例:ansible hosts -m command -a "ls /tmp" 註:command模塊也可以省略。
給遠程主機添加用戶、設置密碼:
ansible hosts -a 'useradd user1'
ansible hosts -a 'echo abc | passwd --stdin user1'
2、shell模塊:遠程主機在shell進程下運行命令,支持shell特性,也支持管道符。
10.10.10.4 | SUCCESS | rc=0 >>
3、模塊:把當前主機文件復制到遠程主機位置,可以指定mode、own、group
10.10.10.4 | SUCCESS => { "changed": true, "checksum": "", "dest": "/root/abc.txt", "gid": 0, "group": "root", "md5sum": "", "mode": "0644", "owner": "ansible", "size": 15, "src": "/root/.ansible/tmp/ansible-tmp-1484639082.19-114656107854348/source", "state": "file", "uid": 0 }
4、cron模塊:在遠程主機指定crontab周期性計劃任務
minute= hour= day= month= weekday= job= name= (必須填寫) state=
ansible all -m cron -a "minute=*/10 job='/sbin/ntpdate 10.10.10.10 & >/dev/null' name=synctime" 可使用crontab -l查看
在管理的主機上可以刪除制定的計劃任務
10.10.10.4 | SUCCESS => { "changed": true, "envs": [], "jobs": [] }
5、fetch模塊:和相反,從遠程主機拷貝文件到本地主機
可以不要flat=yes參數,但作用:
當dest=/root/kel/ ,abc.txt會保存在/root/kel/目錄下
當dest=/root/kel ,會拷貝abc.txt文件,並命名成kel
6、file模塊:file模塊包含了文件、文件夾、超級鏈接類的創建、拷貝、移動、刪除
path=/etc/foo.conf owner=foo group=foo mode=0644
src=/file/to/link/to dest=/path/ro/symlink owner=foo group=foo state=link
src=/tmp/{{item.path}} dest={{item.dest}} state=link with_items:
path=/etc/foo.conf state=touch mode="u=rw,g=w,o=r"
path=/etc/foo.conf state=touch mode="u+w,g-w,o-rw"
7、yum模塊:用於yum安裝安裝和卸載
8、service模塊:服務管理
9、user/group模塊:user模塊管理用戶;group模塊管理group
四、Playbook劇本
playbook 是ansible更強大的配置管理組件,實現基於文本文件編排執行的多個任務,且多次重復執行。playbook組織格式為使用YAML語言來編寫的。
playbook 是由一個或多個「play」組成的列表。play的主要功能在於將事先歸為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上講,所謂的task無非是調用ansible的一個mole。將多個play組織在一個playbook中,即可以讓他們聯通起來按事先編排的機制生效。
1、例子:
在ansible主機上的root目錄下創建httpd目錄,將本機的httpd.conf文件拷貝到該目錄下,修改配置文件里的監聽埠是8081
remote_user:root #root前不能有空格
tasks: #任務列表
yum name=httpd state=present #yum後的: 刪除掉
src=/root/httpd/httpd.conf dest=/etc/httpd/conf
service name=httpd state=started
注意:yaml文件中支持#;下面的操作要跟上面的name對齊。
測試:
ansible-playbook --check playbook :只檢測可能會發生的改變,但不真正執行操作
ansible-playbook playbook :直接執行
ansible-playbook --list-hosts :列出運行任務的主機
2、playbook介紹
設置在特定條件下觸發:
a,某任務的狀態在運行後為changed時,可通過「notify」通知給相應的handles;
handles:任務在特定條件下觸發;接收到其他任務的通知是被觸發;
b,任務可以通過「tags」打標簽,而後可在ansible-playbook命令上使用-t指定進行調用;
B. Ansible系列-基礎篇-Ansible 常見模塊的使用
原文地址: Ansible系列-基礎篇-Ansible 常見模塊的使用
→ 上一篇中簡單嘗鮮了幾個模塊,本篇整理下實際中用到的模塊及其用法Demo,總計有19個模塊,分別為
ping、setup、debug、user、group、authorized_key、shell、script、command、service、systemd、、template、synchronize、file、lineinfile、yum、cron
ping 模塊主要是驗證 管理節點 和 目標節點 之間的連通性,是否正常配置好了對應賬號的ssh免密登錄
上一篇中配置的時候提到ansible facts 收集目標主機信息,也可以使用 setup 模塊。
這個模塊的好處就是讓了解到 Ansible 都有哪些內置的變數,這些變數在我們後續寫playbook的時候,在role templates 中配置很有幫助,
舉個列子,Ansible 批量部署 zabbix agent,每個agent的配置文件中的 ListenIP 和 Hostname 我們就可以使用facts中的變數 ansible_default_ipv4.address 和 ansible_hostname
另外一旦知道知道都有哪些變數的時候,下次我們就可以再收集信息展示的時候,加參數通過filter來過濾我們想看的變數就可。比如
顧名思義,就是我們想調試輸出一些結果的時候,比如上面提到的我想知道目標主機的IP地址
這里有兩種用法,一種是 msg 輸出,需要帶 {{ variable-name }} , 另外一種是 var 用法,直接寫變數名即可,不用添加 {{ }}
遠程管理用戶/用戶組
主要用來給目標主機用戶配置公鑰,默認到目標用戶家目錄的.ssh目錄的authorized_keys文件 沒有則創建authorized_keys文件
這里是把 shell 和 script、command放到一起做對比,其實還有個 raw
其中 command 執行單一命令不能使用管道符、重定向符等,raw 類型command,可以使用管道符等;
shell 和 script 類似,都可以執行腳本,卻別在於script執行的腳本在ansible管理機上,而shell執行的腳本必須先放到目標節點上去,才能執行;
另外shell執行可以使用環境變數,bash等,但是script只是執行腳本,不能帶 bash
都是用來管理伺服器上的服務,區別在於Service服務管理用於centos6及以前的系統,而systemd命令應用於centos7系統
核心參數 namestateenabled
把管理節點的文件到目標節點,並配置相關屬性
template 的作用和一樣,區別在於源文件是jinja2格式,文件中可以配置 Ansible變數,然後在目標節點上替換成對應的目標值
另外一個需要住的就是在roles中,默認是從files目錄獲取文件,template默認是 templates 文件夾獲取模板文件
主要用於目錄、文件的同步,基於 rsync實現,主要是有 push 和 pull 兩種方式, 如果是push 推送,則src是管理節點,dest是目標節點;如果是pull拉取,則src是目標節點,dest是管理節點
在目標節點創建文件或目錄,刪除文件或目錄,修改文件或目錄的許可權等;核心參數有:path、state、owner、group、mode、recurse
在文件中添加、修改、刪除一行記錄,在實踐中用的很多,這里做簡單介紹,後續有單獨文章詳細介紹
顧名思義,就是我們在Centos下進行yum安裝,核心參數主要關註: name 需要安裝的軟體名、state 軟體的狀態(present、absent、removed、latest)和 enablerepo 特殊情況指定yum源
管理Linux定時任務,核心參數說明
name 定時任務的名稱、 state 任務的狀態、minute/hour/day/month/weekday 分別設定任務執行的時間配置、user指定是哪個用戶配置任務,默認是管理員
C. 使用pip方式安裝ansible的配置文件在哪
1. 打開上節的解決方案,為JackWangServiceClient工程添加一個App.config文件
2. 修改App.config的文件如下 <xml version="1.0" encoding="utf-8" >
<configuration> <system.serviceModel> <client>
<endpoint name="MyEndPoint"
我安裝ansible的方式用pip安裝,但是找不到配置文件,pip方式安裝的配置文件在哪的?/etc目錄下是沒有的[root@localhost logs]# cd /etc/ananacrontab
anthy-conf
find找了,也沒[root@localhost ~]# find / -name
ansible/usr/local/python27/bin/ansible/usr/local/python27/lib/python2.7/site-packages/ansible[root@localhost
~]# cd /usr/local/python27/lib/python2.7/site-packages/ansible
D. Ansible-基本概述
為什麼要自動化運維
我們以 10 台機器部署 Nginx 為例。部署步驟如下:
1、通過 ssh 登錄一台機器;
2、yum install -y nginx 或者 獲取安裝包自行編譯安裝;
3、配置 Nginx
4、啟動 Nginx ,如有必要加入開機自啟動;
5、退出登錄
上面步驟重復 10 次,即可完成我們的部署要求。
痛點:
1、重復操作頻繁,增加了人工成本和後續維護成本;
2、機器太多時,容易落下某些機器且未操作,進而產生後續影響;
3、人工頻繁操作時可能有操作步驟不完整的情況,造成該機器和其他機器狀態不一致。
我們還是以 10 台機器部署 Nginx 為例。部署步驟如下:
1、在控制機或者稱為管理機的機器上寫好相關腳本。「當然該腳本我們是測試通過的,腳本中包括安裝、配置、啟動等等」
2、將寫好的腳本從控制機推送到受控機;
3、在受控機執行相關腳本,根據腳本部署我們需要的 Nginx。
好處
1、減少了重復操作,提高了工作效率;
2、減小了出錯幾率,提高了准確率;
3、所有機器狀態一致,降低了後續維護成本。
軟體安裝部署
配置同步
代碼變更
命令執行
任務執行
Ansible 是基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能的自動化管理工具。
Ansible 是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是 Ansible 所運行的模塊,Ansible 只是提供一種框架。進而能減少我們的重復操作,提高工作效率。
Ansible 不需要在遠程主機上安裝 client/agents,因為它們是基於 SSH 來和遠程主機通訊的。
Ansible 目前已經已經被紅帽官方收購,是自動化運維工具中大家認可度最高的,並且上手容易,學習簡單。是每位運維工程師必須掌握的技能之一。
1、批量執行遠程命令:可以對 N 台主機同時進行命令的執行;
2、批量配置軟體服務:可以用自動化的方式管理配置和服務;
3、實現軟體開發功能:例如 jumpserver 底層使用 Ansible 來實現自動化管理;
4、編排高級的 IT 任務:Ansible 的 Playbooks 是一門編程語言,可以用來描繪一套 IT 架構。
1、部署簡單,只需在主控端部署 Ansible 環境,被控端無需做任何操作;
2、安全可靠,默認使用 SSH 協議對被控端進行管理;
3、有大量的常規運維操作模塊,可實現日常絕大部分操作;
4、配置簡單、功能強大、擴展性強;
5、支持 API 及自定義模塊,可通過 Python 輕松擴展;
6、通過 Playbooks 來定製強大的配置、狀態管理;
7、輕量級,無需在客戶端安裝 Agent,更新時只需在操作機上進行一次更新即可。
模塊說明如下:
Ansible:Ansible 核心程序。
Host Inventory:記錄由 Ansible 管理的主機信息清單,包括埠、密碼、IP 等。
Playbooks:「劇本」 YAML 格式文件,多個任務定義在一個文件中,定義主機需要調用哪些模塊來完成的功能。
Core Moles:核心模塊,主要操作是通過調用核心模塊來完成管理任務。
Custom Moles:自定義模塊,完成核心模塊無法完成的功能,支持多種語言。
Connection Plugins:連接插件,Ansible 和 Host 通信使用
Ansible 控制主機對被管節點的操作方式可分為兩類,即 ad-hoc 和 playbook:
ad-hoc 模式(點對點模式)
使用單個模塊,支持批量執行單條命令。ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來的命令。 就相當於 bash 中的一句 shell。
playbook 模式(劇本模式)
是 Ansible 主要管理方式,也是 Ansible 功能強大的關鍵所在。 playbook 通過多個 tasks 集合完成一類功能 ,如 Web 服務的安裝部署、資料庫伺服器的批量備份等。可以簡單地把 playbook 理解為通過組合多條 ad-hoc 操作的配置文件。
簡單理解就是:Ansible 在運行時,首先讀取 ansible.cfg 中的配置,根據規則獲取 Inventory 中的管理主機列表,並行的在這些主機中執行配置的任務,最後等待執行返回的結果。
1、載入自己的配置文件,默認 /etc/ansible/ansible.cfg;
2、查找對應的主機配置文件,找到要執行的主機或者組;
3、載入自己對應的模塊文件,如 command;
4、通過 Ansible 將模塊或命令生成對應的臨時py文件(python腳本),並將該文件傳輸至遠程伺服器;
5、對應執行用戶的家目錄的 .ansible/tmp/XXX/XXX.PY文件;
6、給文件 +x 執行許可權;
7、執行並返回結果;
8、刪除臨時py文件,sleep 0退出;
E. ansible總結
ansible是一種自動化運維工具,基於paramiko開發的,並且基於模塊化工作,Ansible是一種集成IT系統的配置管理、應用部署、執行特定任務的開源平台,它是基於python語言,由Paramiko和PyYAML兩個關鍵模塊構建。集合了眾多運維工具的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能.ansible是基於模塊工作的,本身沒有批量部署的能力.真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架.ansible不需要在遠程主機上安裝client/agents,因為它們是基於ssh來和遠程主機通訊的.
ansible被定義為配置管理工具,配置管理工具通常具有以下功能:
常用的自動化運維工具技術特性比較:
ansible系統由控制主機和被管理主機組成,控制主機不支持windows平台
部署簡單, 只需要在控制主機上部署ansible環境,被控制端上只要求安裝ssh和python 2.5以上版本,這個對於類unix系統來說相當與無需配置.
Ansible任務執行模式分為以下兩種:
ansible配置文件查找順序
ansible配置文件
ansible 有許多參數,下面我們列出一些常見的參數:
ansible的主要功用在於批量主機操作,為了便捷地使用其中的部分主機,可以在inventory file中將其分組命名。默認的inventory file為/etc/ansible/hosts。
inventory file可以有多個,且也可以通過Dynamic Inventory來動態生成。
Inventory文件格式:
inventory其他的參數
ansible通過ssh實現配置管理、應用部署、任務執行等功能,因此,需要事先配置ansible端能基於密鑰認證的方式聯系各被管理節點。
ansible命令使用語法:
例如:
可以通過 ansible-doc -l 列出所有可用的mole,常用的mole有:
ansible -s <mole-name> 可以查看指定mole的用法,或者參看 官方幫助文檔 :
playbook是由一個或多個「play」組成的列表。play的主要功能在於將事先歸並為一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來講,所謂task無非是調用ansible的一個mole。將多個play組織在一個playbook中,即可以讓它們聯同起來按事先編排的機制同唱一台大戲。
下面是一個簡單示例:
playbooks的組成部分
執行過程:
playbook安裝配置apache實戰
ansilbe自1.2版本引入的新特性,用於層次性、結構化地組織playbook。roles能夠根據層次型結構自動裝載變數文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變數、文件、任務、模塊及處理器放置於單獨的目錄中,並可以便捷地include它們的一種機制。角色一般用於基於主機構建服務的場景中,但也可以是用於構建守護進程等場景中。
一個roles的案例如下所示:
在playbook中,可以這樣使用roles:
也可以向roles傳遞參數:
也可以用條件來使用roles:
ansible運行playbook時會啟動很多ssh連接來執行復制文件,運行命令這樣的操作.openssh支持這樣一個優化,叫做ssh Multiplexing,當使用這個ssh Multiplexing的時候,多個連接到相同主機的ssh回話會共享相同的TCP連接,這樣就只有第一次連接的時候需要進行TCP三次握手.
ansible會默認使用ssh Multiplexing特性,一般不需要更改配置,相關的配置項為:
ansible執行過程中,他會基於調用的模塊生成一個python腳本,然後將python腳本復制到主機上,最後執行腳本.ansible支持一個優化,叫做pipelining,在這個模式下ansible執行腳本時並不會去復制它,而是通過管道傳遞給ssh會話,這會讓ansible的ssh會話從2個減少到1個,從而節省時間.
pipelining默認是關閉的, 因為他需要確認被管理主機上的/etc/sudoers文件中的 requiretty 沒有啟用, 格式如下:
ansible開啟pipelining方法, 修改ansible.cfg配置文件:
ansible playbook會默認先收集fact信息,如果不需要fact數據可以在playbook中禁用fact採集:
也可以全局禁用fact採集:
另一種解決方案就是使用fact緩存,目前ansible支持下面幾種fact緩存:
jsON文件做fact緩存示例
ansible把採集到的fact寫入控制主機的json文件中,如果文件已經存在,那麼ansible不會再去主機上採集fact
啟用JSON文件緩存,修改ansible.cfg文件:
ansible默認並發數是5,可以用下面兩種方法修改並發數:
ansible內置多種雲計算相關模塊,如aws,openstack,docker等,下圖是ansible與docker相關的模塊:
通過playbook和dockerfile相結合的方式生成鏡像, 示例如下:
ansible可以通過docker模塊來操作容器,示例如下: