一、ansible簡(jiǎn)介
1贾费、ansible是新出現(xiàn)的自動(dòng)化運(yùn)維工具钦购,基于Python開發(fā),集合了眾多運(yùn)維工具(puppet褂萧、cfengine押桃、chef、func导犹、fabric)的優(yōu)點(diǎn)唱凯,實(shí)現(xiàn)了批量系統(tǒng)配置、批量程序部署谎痢、批量運(yùn)行命令等功能磕昼。
-
2、ansible是基于模塊工作的节猿,本身沒有批量部署的能力票从。真正具有批量部署的是ansible所運(yùn)行的模塊,ansible只是提供一種框架滨嘱。
-
主要包括:
(1)峰鄙、連接插件connection plugins:負(fù)責(zé)和被監(jiān)控端實(shí)現(xiàn)通信;
(2)太雨、host inventory:指定操作的主機(jī)吟榴,是一個(gè)配置文件里面定義監(jiān)控的主機(jī);
(3)躺彬、各種模塊核心模塊煤墙、command模塊、自定義模塊宪拥;
(4)仿野、借助于插件完成記錄日志郵件等功能;
(5)她君、playbook:劇本執(zhí)行多個(gè)任務(wù)時(shí)脚作,非必需可以讓節(jié)點(diǎn)一次性運(yùn)行多個(gè)任務(wù)。
3缔刹、ansible的安裝
ansible依賴于Python 2.6或更高的版本球涛、paramiko、PyYAML及Jinja2校镐。
(1)亿扁、編譯安裝
解決依賴關(guān)系
# 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
(2) 、rpm包安裝
# yum install ansible
注意:不同版本的ansible的功能差異可能較大鸟廓。
二从祝、ansible中的模塊使用和簡(jiǎn)單的格式執(zhí)行
ansible -m MOD_nAME指明模塊
-a MOD_ARGS 向模塊傳遞參數(shù)
-f FORKS 一次可管理多少主機(jī)
-C 預(yù)運(yùn)行襟己,不真正運(yùn)行
--list -host 列出主機(jī)
-u USERNAME 指明用戶名
-c 指明連接方式,默認(rèn)smart
這些命令使用ansible簡(jiǎn)單的格式執(zhí)行
1牍陌、生成安全連接秘鑰
ansible通過ssh實(shí)現(xiàn)配置管理擎浴、應(yīng)用部署、任務(wù)執(zhí)行等功能毒涧,因此贮预,需要事先配置ansible端能基于密鑰認(rèn)證的方式聯(lián)系各被管理節(jié)點(diǎn)。
ansible和目標(biāo)主機(jī)命令執(zhí)行要使用ssh契讲,所以第一步就要生成安全連接秘鑰仿吞。
[root@rs1 ~]# ssh-keygen -t rsa -P "" #生成安全連接秘鑰
[root@rs1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.6 #使用安全連接秘鑰連接1號(hào)目標(biāo)主機(jī)
root@192.168.1.6's password: #輸入目標(biāo)主機(jī)密碼
[root@rs1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.12 #使用安全連接秘鑰連接2號(hào)目標(biāo)主機(jī)
root@192.168.1.12's password: #輸入目標(biāo)主機(jī)密碼
2、添加本地解析
[root@rs1 ~]# vim /etc/hosts 添加本地解析
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.6 vs
192.168.1.12 rs2
3捡偏、定義目標(biāo)主機(jī)組
/etc/ansible/hosts文件支持使用以下變量設(shè)置相關(guān)的遠(yuǎn)程主機(jī)信息:
ansible_ssh_host #用于指定被管理的主機(jī)的真實(shí)IP
ansible_ssh_port #用于指定連接到被管理主機(jī)的ssh端口號(hào)茫藏,默認(rèn)是22
ansible_ssh_user #ssh連接時(shí)默認(rèn)使用的用戶名
ansible_ssh_pass #ssh連接時(shí)的密碼
ansible_sudo_pass #使用sudo連接用戶時(shí)的密碼
ansible_sudo_exec #如果sudo命令不在默認(rèn)路徑,需要指定sudo命令路徑
ansible_ssh_private_key_file #秘鑰文件路徑霹琼,秘鑰文件如果不想使用ssh-agent管理時(shí)可以使用此選項(xiàng)
ansible_shell_type #目標(biāo)系統(tǒng)的shell的類型,默認(rèn)sh
ansible_connection #SSH 連接的類型: local , ssh , paramiko凉当,在 ansible 1.2 之前默認(rèn)是 paramiko 枣申,后來智能選擇,優(yōu)先使用基于 ControlPersist 的 ssh (支持的前提)
ansible_python_interpreter #用來指定python解釋器的路徑看杭,默認(rèn)為/usr/bin/python 同樣可以指定ruby 忠藤、perl 的路徑
ansible_*_interpreter #其他解釋器路徑,用法與ansible_python_interpreter類似楼雹,這里"*"可以是ruby或才perl等
目標(biāo)主機(jī)組:
[root@rs1 ~]# cd /etc/ansible
[root@rs1 ansible]# ls
ansible.cfg hosts roles
[root@rs1 ansible]# vim hosts#編輯文件
[websrvs]#添加web組
192.168.1.6
192.168.1.12
[dbsrvs] #定義db組
192.168.1.12
[root@rs1 ansible]# ansible all --list-hosts#列出目標(biāo)主機(jī)
hosts (2):
192.168.1.12
192.168.1.6
[root@rs1 ansible]# ansible all -m ping -C# 對(duì)所有目標(biāo)主機(jī)預(yù)運(yùn)行ping測(cè)試
192.168.1.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.6 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@rs1 ansible]# ansible all -m ping # 對(duì)所有目標(biāo)主機(jī)ping測(cè)試
192.168.1.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.6 | SUCCESS => {
"changed": false,
"ping": "pong"
}
4模孩、模塊文檔
[root@rs1 ansible]# ansible-doc -l #列出目標(biāo)主機(jī)模塊文檔
[root@rs1 ansible]# ansible-doc -s group 獲取設(shè)置組命令文檔
1、定義期望的目標(biāo)狀態(tài)
2贮缅、操作必須是冪等的榨咐,操作次數(shù)必須相等
5、group組模塊使用
對(duì)目標(biāo)主機(jī)創(chuàng)建組,并傳遞參數(shù)
[root@rs1 ansible]# ansible all -m group -a "gid=3000 name=mygrp state=present system=no" #對(duì)所有目標(biāo)主機(jī)創(chuàng)建組谴供,m是加載group模塊块茁,a是傳遞參數(shù),state是創(chuàng)建還是刪除
192.168.1.6 | SUCCESS => {
"changed": true,
"gid": 3000,
"name": "mygrp",
"state": "present",
"system": false
}
192.168.1.12 | SUCCESS => {
"changed": true,
"gid": 3000,
"name": "mygrp",
"state": "present",
"system": false
}
6桂肌、user用戶模塊使用
對(duì)目標(biāo)主機(jī)創(chuàng)建用戶,并傳遞參數(shù)
[root@rs1 ansible]# ansible all -m user -a "uid=5000 name=testuser state=present groups=mygrp shell=/bin/tcsh"對(duì)所有目標(biāo)主機(jī)創(chuàng)建用戶数焊,m是加載user模塊,a是傳遞參數(shù)崎场,state是創(chuàng)建還是刪除佩耳,groups是附加組,shell是默認(rèn)shell
192.168.1.6 | SUCCESS => {
"changed": true,
"comment": "",
"createhome": true,
"group": 5000,
"groups": "mygrp",
"home": "/home/testuser",
"name": "testuser",
"shell": "/bin/tcsh",
"state": "present",
"system": false,
"uid": 5000
}
192.168.1.12 | SUCCESS => {
"changed": true,
"comment": "",
"createhome": true,
"group": 5000,
"groups": "mygrp",
"home": "/home/testuser",
"name": "testuser",
"shell": "/bin/tcsh",
"state": "present",
"system": false,
"uid": 5000
}
7谭跨、copy復(fù)制模塊使用
對(duì)目標(biāo)主機(jī)拷貝本地文件,并傳遞參數(shù)干厚,指明src源文件位置和dest目標(biāo)文件位置
[root@rs1 ansible]# ansible-doc -s copy#查詢copy使用文檔
[root@rs1 ansible]# ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600"
對(duì)所有目標(biāo)主機(jī)拷貝本地文件李滴,m是使用copy模塊,a是傳遞參數(shù)萍诱,src源文件位置悬嗓,dest目標(biāo)文件位置,mode權(quán)限(加了'/'就是目錄)
192.168.1.6 | SUCCESS => {
"changed": true,
"checksum": "4367ba689c50b4ab956ce0704f048f4fb0cc1a28",
"dest": "/tmp/fstab.ansible",
"gid": 0,
"group": "root",
"md5sum": "c6ac458a97ee2f7ed913fdc8b17e9394",
"mode": "0600",
"owner": "root",
"size": 465,
"src": "/root/.ansible/tmp/ansible-tmp-1534522522.24-76431722279920/source",
"state": "file",
"uid": 0
}
192.168.1.12 | SUCCESS => {
"changed": true,
"checksum": "4367ba689c50b4ab956ce0704f048f4fb0cc1a28",
"dest": "/tmp/fstab.ansible",
"gid": 0,
"group": "root",
"md5sum": "c6ac458a97ee2f7ed913fdc8b17e9394",
"mode": "0600",
"owner": "root",
"size": 465,
"src": "/root/.ansible/tmp/ansible-tmp-1534522522.23-209859323698602/source",
"state": "file",
"uid": 0
}
copy模塊設(shè)置屬主屬組用法
[root@rs1 ansible]# ansible all -m copy -a "content='hi tere\n' dest=/tmp/hi.txt owner=testuser group=mygrp"#對(duì)所有目標(biāo)主機(jī)拷貝本地文件裕坊,m是使用copy模塊包竹,a是傳遞參數(shù),content創(chuàng)建文檔到dest目標(biāo)文件位置籍凝,設(shè)置屬主屬組
192.168.1.6 | SUCCESS => {
"changed": true,
"checksum": "50dbdebeaa8c0f1c3cccfcae54ef71fc2c0e4fa8",
"gid": 3000,
"group": "mygrp",
"mode": "0644",
"owner": "testuser",
"path": "/tmp/hi.txt",
"size": 8,
"state": "file",
"uid": 5000
}
192.168.1.12 | SUCCESS => {
"changed": true,
"checksum": "50dbdebeaa8c0f1c3cccfcae54ef71fc2c0e4fa8",
"gid": 3000,
"group": "mygrp",
"mode": "0644",
"owner": "testuser",
"path": "/tmp/hi.txt",
"size": 8,
"state": "file",
"uid": 5000
}
8周瞎、fetch復(fù)制模塊
從遠(yuǎn)程單一主機(jī)復(fù)制到本地主機(jī)
使用文檔:ansibile-doc -s fetch
9、command模塊執(zhí)行命令
對(duì)目標(biāo)主機(jī)執(zhí)行命令
[root@rs1 ansible]# ansible all -m command -a "ifconfig"#對(duì)所有目標(biāo)主機(jī)饵蒂,m使用模塊声诸,command命令模塊,a傳遞參數(shù) 執(zhí)行ifconfig命令
192.168.1.12 | SUCCESS | rc=0 >>
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
.............
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
.............
192.168.1.6 | SUCCESS | rc=0 >>
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
...............
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
...............
注意:command缺點(diǎn)是無法解析管道命令
10退盯、shell模塊使用
shell模塊解決了command模塊的缺點(diǎn)彼乌,對(duì)傳遞參數(shù)用shell解析并執(zhí)行
[root@rs1 ansible]# ansible all -m shell -a "echo 123 | passwd --stdin testuser"#對(duì)所有目標(biāo)主機(jī)使用shell解析傳遞參數(shù)中的管道命令
192.168.1.6 | SUCCESS | rc=0 >>
更改用戶 testuser 的密碼 。
passwd:所有的身份驗(yàn)證令牌已經(jīng)成功更新渊迁。
192.168.1.12 | SUCCESS | rc=0 >>
更改用戶 testuser 的密碼 慰照。
passwd:所有的身份驗(yàn)證令牌已經(jīng)成功更新。
11琉朽、file模塊文件屬性命令
對(duì)目標(biāo)主機(jī)毒租,傳遞參數(shù),創(chuàng)建文件箱叁、目錄和軟連接
[root@rs1 ansible]# ansible all -m file -a "path=/var/tmp/hello.dir state=directory"#對(duì)所有目標(biāo)主機(jī)使用file模塊創(chuàng)建hello.dir目錄
192.168.1.12 | SUCCESS => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/var/tmp/hello.dir",
"size": 6,
"state": "directory",
"uid": 0
}
192.168.1.6 | SUCCESS => {
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/var/tmp/hello.dir",
"size": 6,
"state": "directory",
"uid": 0
}
[root@rs1 ansible]# ansible all -m file -a"src=/etc/fstab path=/var/tmp/fstab.link state=link"#對(duì)所有目標(biāo)主機(jī)使用file模塊創(chuàng)建fstab文件的符號(hào)連接
192.168.1.12 | SUCCESS => {
"changed": true,
"dest": "/var/tmp/fstab.link",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"size": 10,
"src": "/etc/fstab",
"state": "link",
"uid": 0
}
192.168.1.6 | SUCCESS => {
"changed": true,
"dest": "/var/tmp/fstab.link",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"size": 10,
"src": "/etc/fstab",
"state": "link",
"uid": 0
}
12墅垮、cron模塊計(jì)劃任務(wù)
對(duì)目標(biāo)主機(jī),傳遞參數(shù)耕漱,設(shè)置計(jì)劃任務(wù)
[root@rs1 ansible]# ansible all -m crom -a "minute=*/3 job='/usr/sbin/update 192.168.1.1 &> /dev/null' name=none state=present"#對(duì)所有目標(biāo)主機(jī) 算色,m使用模塊,crom計(jì)劃任務(wù)孤个,創(chuàng)建任務(wù)每三分鐘同步時(shí)間
13剃允、yum模塊安裝軟件程序包
rpm軟件的安裝
[root@rs1 ansible]# ansible all -m yum -a "name=ngix state=instlled"#對(duì)所有主機(jī)安裝ngix
14、service模塊管理目標(biāo)服務(wù)
對(duì)目標(biāo)主機(jī)齐鲤,傳遞參數(shù)斥废,管理服務(wù)。
[root@rs1 ansible]# ansible all -m service -a"name=httpd state=started"#對(duì)所有主機(jī)啟動(dòng)httpd服務(wù)
[root@rs1 ansible]# ansible all -m service -a"name=httpd state=stoped"#對(duì)所有主機(jī)停止httpd服務(wù)
15给郊、script模塊腳本管理
[root@rs1 ansible]# vim /tmp/test.sh#編寫一個(gè)測(cè)試腳本
對(duì)目標(biāo)主機(jī)牡肉,傳遞參數(shù),執(zhí)行本地bash腳本
#!binbash
#
echo "ansible script" > /tmp/ansible.txt
[root@rs1 ansible]# ansible all -m script -a "/tmp/test.sh"#所有目標(biāo)主機(jī)執(zhí)行本地bash腳本
注意:ansible普通命令用法很難復(fù)用
三淆九、playbook
- playbook解決了ansible普通命令難以復(fù)用的缺點(diǎn)统锤,使用yaml格式保存毛俏,所有首先要了解YAML。
- playbook是由一個(gè)或多個(gè)“play”組成的列表饲窿。play的主要功能在于將事先歸并為一組的主機(jī)裝扮成事先通過ansible中的task定義好的角色煌寇。從根本上來講,所謂task無非是調(diào)用ansible的一個(gè)module逾雄。將多個(gè)play組織在一個(gè)playbook中阀溶,即可以讓它們聯(lián)同起來按事先編排的機(jī)制同唱一臺(tái)大戲。
1鸦泳、YAML介紹
YAML是一個(gè)可讀性高的用來表達(dá)資料序列的格式银锻。YAML參考了其他多種語言,包括:XML做鹰、C語言击纬、Python、Perl以及電子郵件格式RFC2822等钾麸。Clark Evans在2001年在首次發(fā)表了這種語言更振,另外Ingy d?t Net與Oren Ben-Kiki也是這語言的共同設(shè)計(jì)者。
YAML Ain't Markup Language饭尝,即YAML不是XML殃饿。不過,在開發(fā)的這種語言時(shí)芋肠,YAML的意思其實(shí)是:"Yet Another Markup Language"(仍是一種標(biāo)記語言)。其特性:
YAML的可讀性好
YAML和腳本語言的交互性好
YAML使用實(shí)現(xiàn)語言的數(shù)據(jù)類型
YAML有一個(gè)一致的信息模型
YAML易于實(shí)現(xiàn)
YAML可以基于流來處理
YAML表達(dá)能力強(qiáng)遵蚜,擴(kuò)展性好
2帖池、YAML語法
YAML的語法和其他高階語言類似,并且可以簡(jiǎn)單表達(dá)清單吭净、散列表睡汹、標(biāo)量等數(shù)據(jù)結(jié)構(gòu)。其結(jié)構(gòu)(Structure)通過空格來展示寂殉,序列(Sequence)里的項(xiàng)用"-"來代表囚巴,Map里的鍵值對(duì)用":"分隔。
- 服務(wù)安裝示例(redis服務(wù))
[root@rs1 ~]# mkdir playbooks#創(chuàng)建目錄
[root@rs1 ~]# cd playbooks
[root@rs1 playbooks]# ls
[root@rs1 playbooks]# vim first.yaml#創(chuàng)建一個(gè)新的以.yaml 結(jié)尾的playbooks
- hosts: all #定義目標(biāo)主機(jī)
remote_user: root#使用用戶
tasks: #任務(wù)
- name: install redis#將要執(zhí)行的第一個(gè)任務(wù)
yum: name=redis state=latest#執(zhí)行任務(wù)的設(shè)置
- name: name: start redis#將要執(zhí)行的第二個(gè)任務(wù)
service: name=redis state=started#執(zhí)行任務(wù)的設(shè)置
[root@rs1 playbooks]# ansible-playbook --syntax-check first.yaml#語法檢查
playbook: first.yaml
[root@rs1 playbooks]# ansible-playbook --list-hosts first.yaml#此playbooks涉及到那些主機(jī)
playbook: first.yaml
play #1 (all): all TAGS: []
pattern: [u'all']
hosts (2):
192.168.1.12
192.168.1.6
[root@rs1 playbooks]# ansible-playbook --list-hosts --list-tasks first.yaml#涉及到的主機(jī)上將要執(zhí)行的任務(wù)(標(biāo)簽為空)
playbook: first.yaml
play #1 (all): all TAGS: []
pattern: [u'all']
hosts (2):
192.168.1.12
192.168.1.6
tasks:
install redis TAGS: []
start redis TAGS: []
start redis TAGS: []
[root@rs1 playbooks]# ansible-playbook -C first.yaml #預(yù)執(zhí)行
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.1.6]
ok: [192.168.1.12]
TASK [install redis] ***********************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]
TASK [start redis] *************************************************************
changed: [192.168.1.6]
changed: [192.168.1.12]
PLAY RECAP *********************************************************************
192.168.1.12 : ok=3 changed=2 unreachable=0 failed=0
192.168.1.6 : ok=3 changed=2 unreachable=0 failed=0
[root@rs1 playbooks]# ansible-playbook first.yaml #執(zhí)行
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]
TASK [install redis] ***********************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]
TASK [start redis] *************************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]
PLAY RECAP *********************************************************************
192.168.1.12 : ok=3 changed=2 unreachable=0 failed=0
192.168.1.6 : ok=3 changed=2 unreachable=0 failed=0
- 配置文件傳遞示例(redis服務(wù)):
[root@rs1 playbooks]# cp 192.168.1.6/etc/redis.conf ./
[root@rs1 playbooks]# ls
192.168.1.6 first.yaml redis.conf
[root@rs1 playbooks]# ansible 192.168.1.6 -m fetch -a "src=/etc/redis.conf dest=./ " #復(fù)制目標(biāo)主機(jī)里面的redis配置文件到本機(jī)
[root@rs1 playbooks]# cp 192.168.1.6/etc/redis.conf ./#拷貝復(fù)制過來的配置文件到當(dāng)前目錄
[root@rs1 playbooks]# ls
192.168.1.6 first.yaml redis.conf
[root@rs1 playbooks]# vim redis.conf#編輯
......
bind 0.0.0.0#監(jiān)聽所有端口
.....
requirepass foobared#啟用密碼認(rèn)證功能友扰,密碼是foobared
.....
-
handlers:用特定條件觸發(fā)使用
用于當(dāng)關(guān)注的資源發(fā)生變化時(shí)采取一定的操作彤叉。“notify”這個(gè)action可用于在每個(gè)play的最后被觸發(fā),這樣可以避免多次有改變發(fā)生時(shí)每次都執(zhí)行指定的操作村怪,取而代之秽浇,僅在所有的變化發(fā)生完成后一次性地執(zhí)行指定操作。在notify中列出的操作稱為handler甚负,也即notify中調(diào)用handler中定義的操作柬焕。
[root@rs1 playbooks]# cp first.yaml second.yaml#備份一下
[root@rs1 playbooks]# vim second.yaml #編輯
- hosts: all
remote_user: root
tasks:
- name: install redis
yum: name=redis state=latest
- name: copy config file #任務(wù)2復(fù)制文件
copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=r
edis#復(fù)制文件到目標(biāo)主機(jī)目錄下
notify: restart redis#通知handlers觸發(fā)
- name: start redis
service: name=redis state=started
handlers:#定義觸發(fā)任務(wù)
- name: restart redis#觸發(fā)任務(wù)一
service: name=redis state=restarted#重新啟動(dòng)redis
[root@rs1 playbooks]# ansible-playbook --syntax-check second.yaml#語法檢查
playbook: second.yaml
[root@rs1 playbooks]# ansible-playbook second.yaml
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]
TASK [install redis] ***********************************************************
ok: [192.168.1.6]
ok: [192.168.1.12]
TASK [copy config file] ********************************************************
changed: [192.168.1.6]
changed: [192.168.1.12]
TASK [start redis] *************************************************************
ok: [192.168.1.6]
ok: [192.168.1.12]
RUNNING HANDLER [restart redis] ************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]
PLAY RECAP *********************************************************************
192.168.1.12 : ok=5 changed=2 unreachable=0 failed=0
192.168.1.6 : ok=5 changed=2 unreachable=0 failed=0
- tags標(biāo)簽的使用
只執(zhí)行標(biāo)簽里面的任務(wù)
[root@rs1 playbooks]# vim second.yaml
- hosts: all
remote_user: root
tasks:
- name: install redis
yum: name=redis state=latest
- name: copy config file
copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=redis
notify: restart redis
tags: configfile #添加任務(wù)標(biāo)簽
- name: start redis
service: name=redis state=started
handlers:
- name: restart redis
service: name=redis state=restarted
[root@rs1 playbooks]# ansible-playbook -t configfile second.yaml #只執(zhí)行標(biāo)簽里面的任務(wù)
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]
TASK [copy config file] ********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]
PLAY RECAP *********************************************************************
192.168.1.12 : ok=2 changed=0 unreachable=0 failed=0
192.168.1.6 : ok=2 changed=0 unreachable=0 failed=0
四审残、Ansible基礎(chǔ)元素
1、 變量variables
- 變量命名:變量名僅能由字母斑举、數(shù)字和下劃線組成搅轿,且只能以字母開頭。
(1)facts可直接調(diào)用
- facts是由正在通信的遠(yuǎn)程目標(biāo)主機(jī)發(fā)回的信息富玷,這些信息被保存在ansible變量中璧坟。要獲取指定的遠(yuǎn)程主機(jī)所支持的所有facts
[root@rs1 playbooks]# ansible 192.168.1.6 -m setup# setup模塊獲取目標(biāo)主機(jī)信息
[root@rs1 playbooks]# vim thir.yaml#編輯
- hosts: 192.168.1.6
remote_user: root
tasks:
- name: copy file
copy: content={{ansible_env}} dest=/tmp/ansible.env#指定變量保存到目標(biāo)主機(jī)目錄下
[root@rs1 playbooks]# ansible-playbook --syntax-check thir.yaml#語法檢查
[root@rs1 playbooks]# ansible-playbook thir.yaml
PLAY [192.168.1.6] *************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.1.6]
TASK [copy file] ***************************************************************
changed: [192.168.1.6]
PLAY RECAP *********************************************************************
192.168.1.6 : ok=2 changed=1 unreachable=0 failed=0
(2)ansible-playbook命令的命令行自定義變量
在運(yùn)行playbook的時(shí)候也可以傳遞一些變量供playbook使用
[root@rs1 playbooks]# vim forth.yaml
- hosts: all
remote_user: root
tesks:
- name: install package {{pkgname}} #定義安裝程序包任務(wù)
yum: name={{pkgname}} state=latest#安裝什么包,由自定義變量提供
[root@rs1 playbooks]# ansible-playbook --syntax-check forth.yaml 語法檢查
[root@rs1 playbooks]# ansible-playbook -e pkgname=memcached forth.yaml#指定安裝包安裝
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]
TASK [install package] *********************************************************
changed: [192.168.1.6]
changed: [192.168.1.12]
PLAY RECAP *********************************************************************
192.168.1.12 : ok=2 changed=1 unreachable=0 failed=0
192.168.1.6 : ok=2 changed=1 unreachable=0 failed=0
(3)Inventory主機(jī)文件清單
ansible的主要功用在于批量主機(jī)操作凌彬,為了便捷地使用其中的部分主機(jī)沸柔,可以在inventory file中將其分組命名。默認(rèn)的inventory file為/etc/ansible/hosts铲敛。
主機(jī)文件清單可以有多個(gè)褐澎,且也可以通過Dynamic Inventory來動(dòng)態(tài)生成。
inventory文件格式遵循INI文件風(fēng)格伐蒋,中括號(hào)中的字符為組名工三。可以將同一個(gè)主機(jī)同時(shí)歸并到多個(gè)不同的組中先鱼;此外俭正,當(dāng)如若目標(biāo)主機(jī)使用了非默認(rèn)的SSH端口,還可以在主機(jī)名稱之后使用冒號(hào)加端口號(hào)來標(biāo)明焙畔。
ntp.xxx.com
[webservers]
www1.xxx.com:2222
www2.xxx.com
[dbservers]
db1.xxx.com
db2.xxx.com
db3.xxx.com
如果主機(jī)名稱遵循相似的命名模式掸读,還可以使用列表的方式標(biāo)識(shí)各主機(jī),
例如:[webservers]
www[01:50].xxx.com
[databases]
db-[a:f].xxx.com
[root@rs1 ansible]# vim hosts
........
[websrvs]
www[1:7].hehe.com#定義主機(jī)清單
[root@rs1 ansible]# ansible websrvs --list-host
hosts (7):
www1.hehe.com
www2.hehe.com
www3.hehe.com
www4.hehe.com
www5.hehe.com
www6.hehe.com
www7.hehe.com
為目標(biāo)主機(jī)創(chuàng)建用戶
[root@rs1 playbooks]# vim fif.yaml #編輯文件
- hosts: all
remote_user: root
tasks:
- name: add user
user: name=test system=no state=present
- name: set password
shell: echo test | passwd --stdin test
[root@rs1 playbooks]# ansible-playbook --syntax-check fif.yaml#語法檢查
[root@rs1 playbooks]# ansible-playbook --syntax-check fif.yaml
playbook: fif.yaml
[root@rs1 playbooks]# ansible-playbook fif.yaml
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]
TASK [add user] ****************************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]
TASK [set password] ************************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]
PLAY RECAP *********************************************************************
192.168.1.12 : ok=3 changed=2 unreachable=0 failed=0
192.168.1.6 : ok=3 changed=2 unreachable=0 failed=0
(4)主機(jī)變量
可以在inventory中定義主機(jī)時(shí)為其添加主機(jī)變量以便于在playbook中使用宏多。
[root@rs1 playbooks]# vim /etc/ansible/hosts
[websrvs]
192.168.1.6 ansible_ssh_user=test ansible_ssh_pass=test
192.168.1.12 ansible_ssh_user=test ansible_ssh_pass=test
[root@rs1 playbooks]# ansible websrvs -m ping#對(duì)目標(biāo)主機(jī)ping測(cè)試
192.168.1.12 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.1.6 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@rs1 playbooks]# ansible websrvs -m command -a "whoami"#用戶名返回測(cè)試
192.168.1.12 | SUCCESS | rc=0 >>
test
192.168.1.6 | SUCCESS | rc=0 >>
test
注意: 一個(gè)組定義了指定用戶 儿惫,將會(huì)影響其他組指定用戶會(huì)變的
(5)組變量
組變量是指賦予給指定組內(nèi)所有主機(jī)上的在playboo中可用的變量。
自定義變量傳遞:
組變量定義方法一:
[websrvs]
192.168.1.6 http_port=8000
192.168.1.12 http_port=10080
組變量定義方法二:
[websrvs]
192.168.1.6
192.168.1.12
[websrvs:vars]
http_port=8080
[root@rs1 ~]# cd /root/playbooks/
[root@rs1 playbooks]# vim vars.yaml
- hosts: websrvs
remote_user: root
vars:
- pbvar: playbook variable testing #變量聲明
tasks:
- name: command line variables
copy: content={{ cmdvar }} dest=/tmp/cmd.var #命令行變量引用伸但,保存到指定文件
- name: playbook variables
copy: content={{ pbvar }} dest=/tmp/pb.var #變量引用肾请,保存到指定文件
- name: host iventory variables
copy: content={{ http_port }} dest=/tmp/hi.var #主機(jī)列表定義引用,保存到指定文件
[root@rs1 playbooks]# vim /etc/ansible/hosts
[root@rs1 playbooks]# ansible-playbook -e cmdvar="command line variable testing" vars.yaml #執(zhí)行命令測(cè)試
PLAY [websrvs] *****************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.1.12]
ok: [192.168.1.6]
TASK [command line variables] **************************************************
changed: [192.168.1.6]
changed: [192.168.1.12]
TASK [playbook variables] ******************************************************
changed: [192.168.1.12]
changed: [192.168.1.6]
TASK [host iventory variables] *************************************************
changed: [192.168.1.6]
changed: [192.168.1.12]
PLAY RECAP *********************************************************************
192.168.1.12 : ok=4 changed=3 unreachable=0 failed=0
192.168.1.6 : ok=4 changed=3 unreachable=0 failed=0
(6)組嵌套
inventory中更胖,組還可以包含其它的組铛铁,并且也可以向組中的主機(jī)指定變量。不過却妨,這些變量只能在ansible-playbook中使用饵逐,而ansible不支持。例如:
[apache]
httpd1.xxx.com
httpd2.xxx.com
[nginx]
ngx1.xxx.com
ngx2.xxx.com
[webservers:children]
apache
nginx
[webservers:vars]
ntp_server=ntp.xxx.com
2彪标、模板模塊template
文本文檔腳本梳毙,使用模板語言編寫,支持Jinja2表達(dá)式語法
[root@rs1 playbooks]# cp redis.conf redis.conf.j2
[root@rs1 playbooks]# vim redis.conf.j2 #編輯文件
....
bind {{ ansible_ens33.ipv4.address }} #編輯模板段變量
.....
[root@rs1 playbooks]# vim template.yaml #編輯playbook
- hosts: 192.168.1.6
remote_user: root
tasks:
- name: install config file
template: src=/root/playbooks/redis.conf.j2 dest=/tmp/redis.conf
[root@rs1 playbooks]# ansible-playbook template.yaml#執(zhí)行
PLAY [192.168.1.6] *************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.1.6]
TASK [install config file] *****************************************************
changed: [192.168.1.6]
PLAY RECAP *********************************************************************
192.168.1.6 : ok=2 changed=1 unreachable=0 failed=0
客戶端:
[root@vs ~]# vim /tmp/redis.conf
.......
bind 192.168.1.6 #已把客戶主機(jī)ip寫入redis里面了
........
示例二:
不同主機(jī)捐下,得到不同的配置
vim listen.conf
listen {{ http_port }}
vim httpd.yaml
- hosts:websrvs
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=latest
- name: install config file
template: src=/root/playbooks/mylisten.conf dest=/etc/httpd/conf.d/mylinsten.conf
- name: start httpd
service: name=httpd state=started
ansible-playbook --syntax-check httpd.yaml
ansible-playbook httpd.yaml
3账锹、when語句條件測(cè)試語句:
如果需要根據(jù)變量萌业、facts或此前任務(wù)的執(zhí)行結(jié)果來做為某task執(zhí)行與否的前提時(shí)要用到條件測(cè)試。
在task后添加when子句即可使用條件測(cè)試奸柬;when語句支持Jinja2表達(dá)式語法生年。
when:在task中使用,jinja2的語法格式
.- name: install conf file
template:src=files
when:什么時(shí)候執(zhí)行任務(wù)
判斷當(dāng)前系統(tǒng)是debian系統(tǒng)廓奕,就按照Apache2
示例:
vim os.yaml
- hosts: websrvs
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=latest
when:ansible_os_family ==" RedHat"#判斷是否是紅帽系統(tǒng)
- name: install apche2
apt: name=apache2 state=latest
when: ansible_os_family == "Debian"#判斷是否是debian系統(tǒng)
ansible-playbook -c os.yaml
when語句中還可以使用Jinja2的大多“filter”抱婉,例如要忽略此前某語句的錯(cuò)誤并基于其結(jié)果(failed或者sucess)運(yùn)行后面指定的語句,可使用類似如下形式:
tasks:
- command: /bin/false
register: result
ignore_errors: True
- command: /bin/something
when: result|failed
- command: /bin/something_else
when: result|success
- command: /bin/still/something_else
when: result|skipped
此外桌粉,when語句中還可以使用facts或playbook中定義的變量
4蒸绩、迭代
- 當(dāng)有需要重復(fù)性執(zhí)行的任務(wù)時(shí),可以使用迭代機(jī)制铃肯。其使用格式為將需要迭代的內(nèi)容定義為item變量引用患亿,并通過with_items語句來指明迭代的元素列表即可。
示例:安裝多個(gè)程序包
vim iter.yaml
- hosts: websrvs
remote_user: root
tasks:
- name: instsll {{ item }} package
yum: name= {{ item }} state=latest#安裝with_items里面的程序包
with_items:
- tomcat
- tomcat-webapps
- mariadb-server
ansible-playbook iter.yaml
5押逼、角色:roles
ansilbe自1.2版本引入的新特性步藕,用于層次性、結(jié)構(gòu)化地組織playbook挑格。roles能夠根據(jù)層次型結(jié)構(gòu)自動(dòng)裝載變量文件咙冗、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可漂彤。簡(jiǎn)單來講雾消,roles就是通過分別將變量、文件挫望、任務(wù)仪或、模板及處理器放置于單獨(dú)的目錄中,并可以便捷地include它們的一種機(jī)制士骤。角色一般用于基于主機(jī)構(gòu)建服務(wù)的場(chǎng)景中,但也可以是用于構(gòu)建守護(hù)進(jìn)程等場(chǎng)景中蕾域。
自包含的目錄拷肌,以特定的層級(jí)目錄結(jié)構(gòu)化組織
mkdir -pv /etc/ansible/roles/nginx/{files,templates,tasks,vars,handlers,meta,default}
示例:利用roles安裝nginx,并配置啟動(dòng)
cd /etc/ansible
vim roles/nginx/templates/vhost1.conf.j2 #編輯模板文件
server{
lisen 8080;
server_name {{ anible_fqdn }}; 獲取主機(jī)名
location / {
root "/ngxdata/vhost1";
}
}
vim roles/nginx/files/index.html#編輯測(cè)試頁
<h1>vhost</h1>
vim roles/nginx/handers/main.yml #編輯觸發(fā)文件
- name: restart nginx
service: name=nginx state=restarted
vim roles/nginx/vars/main.yml#編輯變量文件
ngxroot: /ngxdata/vhost1 #這里定義必須是字典模式旨巷,不加'-'
vim /etc/ansible/roles/nginx/tasks/main.yml
- name: install nginx
yum: name=nginx state=latest
when: ansible_os_family == "RedHat"#檢查是否是紅帽系統(tǒng)
- name: install conf
temlate: src=vhost1.conf.j2 dest=/etc/nginx/conf.d/vhost1.conf#傳遞模板文件
tags: conf 標(biāo)簽
notify: restart nginx
-name: install site home directory
file: path={{ ngxroot }} state=directory
-name: install index page
copy: src=index.html dist={{ ngxroot }}/#拷貝本地index測(cè)試頁到目標(biāo)主機(jī)的nginx根目錄
-name: start nginx
service:name=nginx state=started#啟動(dòng)nginx
cd
vim nginx.yml
- hosts: websrvs
remote_user: root
roles:
- nginx #調(diào)用角色
ansible-playbook -syntax-check nginx.yml #語法檢查
ansible-playbook nginx.yml #執(zhí)行
四巨缘、配置文件設(shè)置常用設(shè)置
配置文件設(shè)置
vim ansible.cfg
[defaults]
forks=5 一次管控多少主機(jī)
sudo_user=root 切換到那個(gè)管理員
ask_pass=true 切換時(shí)候是否需要密碼
remote_port =22 遠(yuǎn)程端口
roles_path 角色存放位置
module_name 不指明時(shí)候 調(diào)用默認(rèn)模塊
客戶端主機(jī)主動(dòng)到ansible服務(wù)器獲取配置用ansible-vcs第三方軟件來實(shí)現(xiàn),實(shí)際應(yīng)用中較少使用。