您好,登錄后才能下訂單哦!
ansible作為輕量級的運維管理工具,目前已被廣泛使用,其已被redhat收購,
未來極為可能裝入base倉庫。
ansible的安裝
目前由于ansible位于epel倉庫,我們需要創建epel源。方法如下: 1.wget https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/e/epel-release-7-9.noarch.rpm(此地址每隔一段時間會發生變化,如果以后發現該地址不正確,進入https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/e/去查找相應的資源)
2.rpm -ivh epel-release-7-9.noarch.rpm
3.yum clean all
4.yum -y install ansible安裝成功
基本信息查看
1.yum info ansible 查看ansible基本介紹
2.rpm -qi ansible 查看程序包的信息
3.rpm -ql ansible|less 查看支持的模塊
配置文件解讀
/etc/ansible/ansible.cfg 主配置文件,配置ansible程序的工作特性
/etc/ansible/hosts 主機清單,各主機的分類的及IP地址等信息
/etc/ansible/roles 存放角色的目錄
/usr/bin/ansible 主程序
/usr/bin/ansible-doc 查看配置文檔
/usr/bin/ansible-galaxy
/usr/bin/ansible-playbook 輔助工具:劇本
/usr/bin/ansible-pull 取配置
支持的模塊的介紹
command模塊----在被管理遠程主機上執行的命令
shell模塊------在被管理遠程主機上執行的命令,但是為了調用shell進程,然后把命令在子進程中運行;在執行的命令中可使用管道符;
copy模塊-------用來復制文件到遠程主機
cron模塊-------用來在遠程主機定義計劃任務
ping模塊-------用來探測主機存活性
filesystem模塊-制作文件系統,格式化分區
known_hosts模塊-管理ssh的hosts文件
mysql_db模塊----在遠程管理數據庫
mysql_user模塊--在遠程管理數據庫中的用戶
setup模塊-------收集遠程指定主機的變量
......
如果沒有需要的模塊,可自行編寫模塊,使用任何語言;
所以,要想使用ansible管理遠程主機,就必須了解其中的模塊,但前提是要把被管理主機納入到管理列表中來;
ansible在哪個目錄查找模塊,在配置文件中/etc/ansible/ansible.cfg中定義。
]# vim /etc/ansible/ansible.cfg
顯示部分內容:
inventory = /etc/ansible/hosts 定義主機清單;
pattern = * 默認匹配所有被管理主機;
forks = 5 默認對遠程主機執行命令時,5臺主機一批,一批批的執行命令;
module_lang = C 模塊默認編程語言;
ansible的使用
一、工作模式
運維工具大體有兩種模式
1、agent模式:基于ssl實現。代理工作在被監控端。如:puppet
2、agentless模式:基于ssh實現工作在被監控端。監控端是ssh的客戶端。
ansible是工作在agentless模式下具有冪等性。ansible在控制端只需要告訴監控端的期望狀態就可以實現批量部署。
二、基于密鑰認證
現在有三臺機器作為被管理服務器,其中兩臺為centos6(IP分別為172.20.52.199、172.20.53.21),一臺為centos7(172.20.52.185).管理機也為centos7.(IP:172.20.52.160)
實現步驟:
1.在管理主機上使用命令: ssh-keygen -t rsa -P '' 直接回車即可生成。
2.把當前公鑰復制到遠程主機root用戶的家目錄下
ssh-copy-id -i .ssh/id_rsa.pub root@172.20.52.199
ssh-copy-id -i .ssh/id_rsa.pub root@172.20.52.185
ssh-copy-id -i .ssh/id_rsa.pub root@172.20.53.21
3.完成后最好使用ssh root@主機IP進行驗證一下。
三、命令使用
1、通用格式 ansible <host-pattern> [options]
host-pattern:指明對哪些主機執行命令
options:多為要執行的管理命令
-a MODULE_ARGS指明模塊參數
例如:ansible all -m ping 對所有管理主機發起ping模塊命令
ansible-doc -s ping 查看ping模塊使用參數,但ping沒有參數;
運行結果:
[root@centos7 yum.repos.d]# ansible all -m ping
172.20.52.199 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.20.52.185 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.20.53.21 | SUCCESS => {
"changed": false,
"ping": "pong"
}
2、command模塊
(1)ansible websrvs -m command -a 'ls /var'
(2)注意:ansible websrvs -a 'ls /var' 省略模塊時,默認為command模塊;
部分結果如下:
172.20.52.185 | SUCCESS | rc=0 >>
account
adm
cache
crash
db
empty
games
gopher
kerberos
lib
local
lock
log
nis
opt
preserve
run
(3) ansible websrvs -a 'useradd user1' 在websrvs主機組中執行命令添加user1用戶;
(4)執行的命令中有管道符'|'時,發生如下報錯
[root@centos7 ~]# ansible websrvs -m command -a 'ifconfig |head -3'
172.20.52.199 | FAILED | rc=1 >>
-3: Unknown host
ifconfig: `--help' gives usage information.
172.20.52.185 | FAILED | rc=1 >>
-3: Unknown host
ifconfig: `--help' gives usage information.
3、shell模塊
在遠程主機的shell進程下運行命令,支持shell特性,如管道,重定向等;
上述的(4)問題,即可利用shell模塊來解決。
ansible websrvs -m shell -a 'echo user1 | passwd --stdin user1' 使用shell模塊,在執行命令中能使用管道符;
4、copy模塊
實現復制文件至遠程主機
2種用法:
(1)src= dest=
(2)content= dest=
owner,group,mode 可同時指明文件的屬主、組及權限;
一般有=號的選項為必有選項;
src=為本地文件或目錄;
dest=為遠程被管理主機文件或目錄;
content=表示把此處的內容直接當做源文件;
(3)ansible dbsrvs -m copy "src=/etc/passwd dest=/tmp"
(4)ansible all -m copy -a "content='hello there\n' mode=600 owner=user1 dest=/tmp/testfile1"
指明了權限、屬主及換行符;默認復制后的權限為644;
5、cron模塊
管理計劃任務
minute= 幾分鐘,范圍0-59;
day= 一個月的那一天,范圍1-31,例如,1-5,*,*/2等
month= 哪個月,范圍1-12;
hour= 哪個小時,范圍0-23;
weekday= 星期幾,范圍0-6;
job= 表示state為present時,要執行的命令;
*name= 必須指定計劃任務條目;
state=
present:創建cron計劃任務;默認;
absent:刪除cron計劃任務;
如:ansible all -m cron -a "minute=*/5 job='/sbin/ntpdate 172.20.52.160 &> /dev/null'name=synctime"
沒有指明的時間默認為*,沒有指明state默認為創建present;
表示每5分鐘執行一次時間同步任務,任務名為synctime;
可在被管理主機查看計劃任務;
再如:ansible all -m cron -a "state=absent name=synctime" 刪除計劃任務
6、fetch模塊
從遠程主機拉取文件到本地
src= 一般是目錄
dest=只能是文件
7、file模塊
設定文件特性(修改屬主、組等屬性)
用法:
(1)創建鏈接文件
*path=指明操作的文件
src=要鏈接的源文件
state-link
(2)修改屬性
path= owner= mode= group=
(3) 創建目錄:
path= state=directory
舉例:ansible dbsrvs -m file -a "path=/tmp/ansible_tmp state=directory"
ansible all -m file -a "src=/tmp/fstab path=/tmp/fstab.link state=link"
8、hostname模塊
設定遠程主機名
name=
要使用變量方式,寫個循環實現批量更改遠程主機主機名;
9、pip模塊
管理Python模塊;即使用pip安裝依賴Python依賴到的模塊;
10、yum模塊
name=指定程序包名稱,可以帶版本號,默認最新版本
state=
present,latest(最新版)安裝程序;
absent卸載程序;
disablerepo 安裝時,指定臨時禁用的倉庫;
enablerepo 安裝時,指定臨時啟用的倉庫。
conf_file 表示yum運行時,指定(臨時)使用的配置文件,而不是默認的配置文件。
例如:ansible all -m yum -a "name=httpd state=latest" 在被管理上安裝httpd程序
ansible all -m yum -a "name=httpd state=absent"在被管理上卸載httpd程序
使用了安裝命令后,如果之前該系統為安裝過,運行結果顯示為×××字體。如果已經安裝過了,則顯示為綠色。都會顯示成功安裝。由于冪等性的原因(),一個程序在成功安裝過后再次使用安裝命令不會再次安裝。
11、service模塊
管理遠程主機的服務
*name=指定管理的服務
state=
started 啟動服務
stopped停止服務
restarted重啟服務
enabled=開機自動啟動;1或0;
runlevel=在指定級別下為開機自動啟動;默認為2345,或345級別;
舉例:ansible all -m shell -a "ss -ntl|grep :80" 查看被管理主機是否啟動web服務
ansible all -m service -a "name=httpd state=started" 啟動被管理主機web服務
12、uri模塊
直接向被管理主機請求一個url;
url=
method指明請求的方法
body如果請求方法是post,指明該body;
user請求的url要求輸入的用戶名;
password請求的url要求輸入的密碼;
HEADER_發送請求的header;
13、user模塊
管理用戶、組賬號
*name=指定要管理的用戶
state=為present|absent
system=是否創建系統賬號
uid=指定UID
shell=默認shell類型
group=基本組
groups=額外(附加)組
comment=注釋信息
home=用戶家目錄
move_home=移動已經存在用戶的家目錄
password添加密碼,應該指定的是openssl加密后的密碼;
remove當state=absent時,刪除用戶時同時刪除家目錄
舉例:
ansible all -m user -a "name=user2 system=yes state=presnet uid=306"
在被管理機上添加用戶user2,為系統用戶,UID為306;系統用戶不應該有家目錄,但此模塊也創建了;
14、setup模塊
獲取facts,即收集遠程主機的變量
ansible 192.168.255.3 -m setup 手動收集指定遠程主機的變量;
15、group模塊
添加或者刪除組
name=組名,必有參數
state={present|absent}
system=
gid=
16、script模塊
一般為本地腳本,會自動復制到遠程主機并執行;
命令行使用:-a "/PATH/TO/SCRIPT_FILE"
注意:是本地文件路徑
removes如果腳本依賴的文件不存在,腳本不會運行
17、templates模塊
就是文本文件,內部嵌套有腳本(這個腳本使用模板編程語言編寫)
基于模板方式生成一個文件符合到遠程主機
src=指定本地jinja2的模板文件路徑
dest=遠程主機
owner=
group=
mode=
python只有在實現web框架時進行嵌入,將自己基于模板編程語言嵌入到其它文本中的機制,它的模板編程語言叫jinja2嵌入式的編程語言;類似于playbook,在python中叫resource資源和清單facts;在清單中定義資源時或定義使用的模板時會用到rubby的模板編程語言;
jinja2模板編程語言所實現的功能是,可以在文本文件中,使用一個所謂的嵌入的標記語法,引入一段模板編程語言所編寫的腳本;而這種腳本無法就是支持比較簡單的編程元素,如條件判斷、(迭代)循環、變量;
舉例:演示模板應用
使用ansible在三臺主機上,安裝nginx,提供配置文件,但其中的worker_processores的值要與主機的cpu核心數相同;此時,就可以把配置文件基于模板方式提供,而這個worker_processores的值,放的就是jinja2所支持的變量,直接使用變量的方式放在那個位置,而本機的template模板會自動套用這里面變量的值,給ansible facts所報告的結果,并把它生成在這個文件中,而后復制到目標主機上去。這就是模板的作用。
能夠把里面嵌入的代碼執行完以后,把執行后生成的結果放在代碼所在處并且生成內容作為文本流輸出給目標主機;
編輯epel源復制到遠程主機:
]# vim files/epel.repo
[epel]
name=fedora epel
baseurl=http://mirrors.aliyun.com/epel/$releasever/$basearch
enabled=1
gpgcheck=1
]# ansible all -m copy -a "src=files/epel.repo dest=/etc/yum.repos.d" --check 如果有epel源,可省略此步驟;
]# ansible all -m yum -a "name=nginx state=present" --check 測試安裝
]# ansible all -m yum -a "name=nginx state=present" 安裝nginx
]# cp /etc/nginx/nginx.conf files/nginx.conf.j2
]# vim files/nginx.conf.j2
修改:
worker_processes ` ansible_processor_vcpus `;
注意:template模板不能在命令行中使用,只能編寫yaml文件;
]# vim nginx.yaml
- hosts: websrvs
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=present
- name: install conf file
template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
tags: instconf
- name: start nginx service
service: name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted
ansible-playbook --check nginx.yaml 測試執行
]# ansible-playbook nginx.yaml 執行
可觀察兩臺主機上的worker進程個數均為該主機的cpu核心數;即開啟了2個worker進程;
還可使用主機變量,讓不同主機監聽不同端口:
]# vim files/nginx.conf.j2
修改:
listen ` http_port `; 調用主機變量
]# vim /etc/ansible/hosts
[websrvs]
192.168.255.3 http_port=80 定義主機變量
192.168.255.4 http_port=8080
]# ansible-playbook --check nginx.yaml 測試執行
]# ansible-playbook nginx.yaml 執行
可在兩臺遠程主機驗證,一個監聽在80端口,另一個監聽在8080端口;
對變量還可使用算術運算:
例如:
]# vim files/nginx.conf.j2
修改:
worker_processes ` ansible_processor_vcpus-1 `; 變量參與了算術運算
]# ansible-playbook --check nginx.yaml 測試執行
]# ansible-playbook nginx.yaml 執行
可在兩臺遠程主機驗證,worker進程個數均減少了1個;
18、playbook
(1)核心元素
Hosts:
Tasks:任務
Variables:變量;可調用ansible的變量或自定義的變量
Templates:包含了模板語法的文本文件;提供配置文件的辦法,可在文件中使用變量;該變量時與目標主機相關的值;
Handlers:任務處理器,由特定條件觸發的任務;本質還是tasks;
Roles:就是由以上元素組成;把主機列表分出來,用到哪個主機時,就放在哪個主機上執行,這就是roles;
其實還有users,指明在目標主機上,使用哪個用戶的身份運行命令;不指明則默認為root,但是通常用sudo的方式進行指定,因此,必要時,要指明遠程主機運行此任務的用戶身份;
playbook的主要作用:
就是能夠把多個相關聯的任務,通過讀取YAML格式的配置文件一次編完;要把任務、變量、模板、處理器放在一個YAML格式文件中進行指定,然后任務就可一次批量執行;
其他組件
ansible facts可使用stup模塊獲取;收集遠程主機變量;
ansible-playbook -e "var=value"自定義變量
host variable:host iventory主機變量
group variable(主機組上的變量)
[groupname:vars]
var=value
roles
變量調用方法:` variable `
(2)舉例:playbook的基礎組件hosts和tasks
vim first.yaml
- hosts: all
remote_user: root
tasks:
- name: create a user3
user: name=user3 system=true uid=307
- name: create a user4
user: name=user4 system=true uid=308
在遠程三臺主機,以root身份執行2個任務,添加兩個用戶指定用戶名、uid且為系統用戶。
ansible-playbook --check first.yaml測試執行
[root@centos7 ~]# vim first.yaml
[root@centos7 ~]# ansible-playbook --check first.yaml
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [172.20.53.21]
ok: [172.20.52.185]
TASK [create a user3] **********************************************************
changed: [172.20.53.21]
changed: [172.20.52.185]
TASK [create a user4] **********************************************************
changed: [172.20.53.21]
changed: [172.20.52.185]
PLAY RECAP *********************************************************************
172.20.52.185 : ok=3 changed=2 unreachable=0 failed=0
172.20.53.21 : ok=3 changed=2 unreachable=0 failed=0
PLAY RECAP 返回的報告
172.20.52.185 : ok=3 changed=2 unreachable=0 failed=0 表示3個任務ok,其中2個是修改以后
ok,unreachable表示聯系不到執行不了, failed表示執行失敗;
172.20.53.21 : ok=3 changed=2 unreachable=0 failed=0
ansible-playbook --list-hosts first.yaml 查看這個playbook運行在哪些主機上;
ansible-playbook first.yaml 真正執行
(3)playbook實際運用舉例
mkdir working
cd working
mkdir files
cp /etc/httpd/conf/httpd.conf files/
vim files/httpd.conf
修改其中的Listen 8080
vim web.yaml
- hosts:websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=present
- name: install configure file
copy:src= files/httpd.conf dest= /etc/httpd/conf
- name: start httpd service
service: name=httpd state=started
- name: execute ss command
shell: ss-ntl|grep :8080
ansible all -m yum -a "name=httpd state=absent" 把所有主機的文本服務停掉;
ansible-playbook --check web.yaml 測試
ansible-playbook web.yaml 執行
ansible websrvs -m shell -a "ss -tnl|grep 8080" 查看遠程主機是否監聽了8080端口;注意:在ansible中執行ss -tnl | grep :8080,這種查詢是不顯示結果的,所以,一般不在ansible里執行有關查詢顯示的命令;
(4)演示handlers,觸發執行
如果把監聽端改為808,再執行,則不會生效,因為,服務已經啟動了,除非重啟服務,這時,就應該用到handlers處理器;
vim web-2.yaml
- hosts:websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=present
- name: install configure file
copy: src=files/httpd.conf dest=/etc/httpd/conf/
notify: restart httpd ##定義觸發,調用處理器的名字
- name: started httpd service
service: name=httpd state=started
handlers: ## 觸發后處理器執行的命令
- name: restart httpd ##必須與notify調用名保持一致;
service: name=httpd state=restarted
vim files/httpd.conf(管理機)
Listen 808
ansible-playbook --check web-2.yaml 只有觸發時,才執行handlers里面定義的命令;
ansible-playbook web-2.yaml 直接運行
(5)演示tag,調取標簽執行指定任務
根據上例,如果僅修改了配置文件,卻還要從第一步,執行安裝程序包,這樣是沒必要的,所以,可使用tag,給任務加標簽,不指定標簽時,執行所有任務,加標簽時,只執行標簽所在的任務;
vim web-3.yaml
- hosts:websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=present
tags: insthttpd
- name: install configure file
copy: src=files/httpd.conf dest=/etc/httpd/conf/
tags: instconf
notify: restart httpd
- name: started httpd service
service: name=httpd state=started
tags: starthttpd
handlers:
- name: restart httpd
service: name=httpd state=restarted
vim files/httpd.conf
Listen 80
ansible-playbook -t instconf --check web-3.yaml 指定執行標簽上的任務.
ansible-playbook -t insthttpd --check web-3.yaml 則發現只運行了一個任務;
還可為讓兩個任務標簽相同。添加后--- ansible-playbook -t insthttpd --check web-3.yaml 發現,會運行兩個任務;這就叫標簽;
ansible-playbook -t instconf,insthttpd --check web-3.yaml 調用多個標簽;
(6)演示在ansible-playbook命令行調用變量
vim forth.yaml
- hosts:websrvs
remote_user:root
tasks:
- name: install ` pkname `必須使用雙花括號,調用變量
yum: name=` pkname ` state=present
舉例1:ansible-playbook -e pkname=memcached forth.yaml安裝memcached,用變量傳遞。
舉例2:
vim /etc/ansible/hosts
[websrvs]
172.20.52.185 hname=www1
172.20.53.21 hname=www2
vim hostname.yaml
- hosts:websrvs
remote_user:root
tasks:
- name: set hostname
hostname: name=` hname `
ansible-playbook --check hostname.yaml 測試執行;
舉例3:向主機組中的主機傳遞相同的變量
[websrvs]
172.20.52.185 hname=baby1
172.20.53.21 hname=baby2
[websrvs:vars]
http_port=8080
[dbsrvs]
172.20.53.21
variables:變量
(1)facts:任何facts變量都由正在通信的目標主機發回的信息,ansible自動獲取變量,可直接調用;在setup模塊
中查看變量;
(2)ansible-playbook命令的命令行中的自定義變量;
-e VARS, --extra-vars=VARS
(3)通過roles傳遞變量;
(4)Host Inventory
(a)向不同的主機傳遞不同的變量;
IP/HOSTNAME varailble=value var2=value2
(b)向組中的主機傳遞相同的變量;
[groupname:vars]
variable=value
注意:invertory參數:
用于定義ansible遠程路徑目標主機時使用的參數,而非傳遞給playbook的變量;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
...
通常ansible中的inventory還有專門參數,不叫變量,因為它不是傳遞給playbook使用的,而是通過ansible連接每個被管理主機時使用的;
例如:
連接遠程主機時,如果不使用密鑰方式,需要輸入賬號、密碼;還可編輯hosts文件:
]# vim /etc/ansible/hosts
[dbsrvs]
192.168.255.4
192.168.255.60 ansible_ssh_user=root ansible_ssh_pass=root
可以在模板中調用變量,為不同的主機生成不同的配置,雖然看上去是同一個配置文件,不同主機拿到的配置文件可以不一樣;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。