- Ansible的特性:
- ansible基于Python實(shí)現(xiàn),有Paramiko脱吱、PyYAML帚呼、JinJia2主要模塊
- 使用SSH鏈接主機(jī),部署簡(jiǎn)單
- 可以使用自定義模塊阐斜,也可以使用其他語(yǔ)言編寫(xiě)的模塊衫冻,基于模塊可以完成各種任務(wù)。
0x00 Ansible 主機(jī)庫(kù)文件: hosts inventory
host inventory是主機(jī)庫(kù)文件谒出,里面存放的是要管理的主機(jī)列表隅俘,和一些主機(jī)參數(shù),另外也可以加入變量等自定義的參數(shù)笤喳。
一般來(lái)說(shuō)为居,常見(jiàn)的主機(jī)庫(kù)文件如下
# 單獨(dú)的主機(jī)域名
mail.example.com
#單獨(dú)的主機(jī)ip
8.8.8.8
[webservers] #主機(jī)組的名稱(chēng)
127.0.0.1 #主機(jī)1
bar.example.com #主機(jī)2
[dbservers] #新的主機(jī)組
one.example.com #主機(jī)1
two.example.com #主機(jī)2
three.example.com
https://micorochio.github.io/2017/05/31/ansible-learning-01/#0x02-host文件
上一次介紹了默認(rèn)的主機(jī)庫(kù),其實(shí)在運(yùn)行ansible 命令時(shí)杀狡,是可以指定inventory文件的
這里先不做介紹蒙畴。帶著下面問(wèn)題,繼續(xù)往下看
- hosts inventory的常用參數(shù)有哪些呜象?
- 如何針對(duì)不同的環(huán)境膳凝,使用不同的hosts inventory文件?
- hosts inventory如何定義變量恭陡?
0x01 入門(mén)級(jí)命令
上一次介紹了一個(gè)簡(jiǎn)單的ansible命令:ansible 打印 Hello World
- 命令的組成
這句話會(huì)找到指定的主機(jī)(127.0.0.1)在主機(jī)上蹬音,使用command,執(zhí)行echo hello world
如果默認(rèn)的?hosts文件中休玩,定義了主機(jī)組著淆,也可以將ip換成主機(jī)組的名字
# /etc/ansible/hosts 文件
[local]
127.0.0.1
執(zhí)行
aisible local -m command -a 'echo hello world'
local會(huì)去hosts文件中找到對(duì)應(yīng)的組,組下的每一臺(tái)機(jī)器都會(huì)運(yùn)行指令拴疤。
如果想讓所以主機(jī)全部執(zhí)行
aisible all -m command -a 'echo hello world'
command模塊意思是執(zhí)行Linux主機(jī)的command永部,模塊使用命令名稱(chēng)后跟一個(gè)列表空格分隔的參數(shù)。 給定的命令將全部執(zhí)行選定的節(jié)點(diǎn)遥赚。 因?yàn)椴粫?huì)通過(guò)shell進(jìn)行處理扬舒,所以“$ HOME”這樣的變量,像“”<“”凫佛,“”>“”讲坎,“”|“`“;”“和”“&”“將不起作用。
-那么 -m 指定模塊愧薛,除了command晨炕,一定還有其他模塊,那么在沒(méi)有文檔的情況下毫炉,
- 怎么知道其他模塊瓮栗,和?模塊指令的用法呢?
# 查詢所有模塊
ansible-doc -l
# 查看command模塊
ansible-doc command
# 查看shell 模塊
ansible-doc shell
使用ansible-doc,可以幫助快速了解模塊的作用和用法,ansible 還有其他參數(shù)费奸,如下:
用法:ansible-doc [options] [module ...]
選項(xiàng):
-a弥激,--all顯示所有模塊的文檔
-h,--help顯示此幫助消息并退出
-l愿阐,--list列出可用的模塊
-M MODULE_PATH微服,--module-path = MODULE_PATH
指定模塊庫(kù)的路徑(默認(rèn)=無(wú))
-s,--snippet顯示指定模塊的播放列表片段
-v缨历,--verbose詳細(xì)模式(-vvv為更多以蕴,-vvvv啟用
連接調(diào)試)
--version顯示程序的版本號(hào)并退出
接下來(lái)介紹幾個(gè)常用的模塊
0x02 ansible常用模塊介紹
- command:這是個(gè)默認(rèn)模塊,不寫(xiě)-m xx模塊的時(shí)候辛孵,默認(rèn)會(huì)當(dāng)成command模塊丛肮,表示執(zhí)行主機(jī)指令
ansible local -a 'whoami'
- cron:定時(shí)任務(wù)模塊,可以指定一個(gè)時(shí)間去執(zhí)行某個(gè)任務(wù)
有以下參數(shù)可供選擇
- name: Manage cron.d and crontab entries.
action: cron
backup # 如果設(shè)置魄缚,在修改之前會(huì)創(chuàng)建crontab的備份宝与。 備份的位置由此模塊在`backup_file'變量中返回。
cron_file # 如果指定冶匹,則使用此文件而不是單個(gè)用戶的crontab伴鳖。 如果這是一個(gè)相對(duì)路徑,它將被解釋為/etc/cron.d徙硅。 (如果是絕對(duì)的,它通常是/ etc / crontab)搞疗。 要使用`cron_file'參數(shù)嗓蘑,你也必須指定'user'。
day # 每個(gè)月中的某天 ( 1-31, *, */2, etc )
disabled # 當(dāng)state = present的時(shí)候匿乃,可以在cron中禁用當(dāng)前job桩皿。
env # 管理crontab的環(huán)境變量,新變量會(huì)從crontab頂部添加
hour # 任務(wù)執(zhí)行時(shí)間:時(shí) ( 0-23, *, */2, etc )
insertafter # 與'state = present'和'env'一起使用幢炸。 如果指定泄隔,新的環(huán)境變量將在聲明指定的環(huán)境變量后插入。
insertbefore # 與'state = present'和'env'一起使用宛徊。 如果指定佛嬉,新的環(huán)境變量將在聲明指定的環(huán)境變量前插入
job # 要執(zhí)行的命令,或者如果設(shè)置了env闸天,則為環(huán)境變量的值暖呕。 state =present則為必需聲明job。
minute # 任務(wù)執(zhí)行時(shí)間:分鐘( 0-59, *, */2, etc )
month # 任務(wù)執(zhí)行時(shí)間:月 ( 1-12, *, */2, etc )
name # crontab條目的描述苞氮,或者如果設(shè)置了env湾揽,則為環(huán)境變量的名稱(chēng)。 如果state=absent則必配置。 請(qǐng)注意库物,如果名稱(chēng)未設(shè)置且state=present霸旗,則將放棄已有條目,始終創(chuàng)建一個(gè)新的crontab條目戚揭。
reboot # 棄用了诱告,?使用special_time更好,表示重啟后執(zhí)行
special_time # 特殊時(shí)間規(guī)格昵稱(chēng)毫目。
state # 是否確保工作或環(huán)境變量存在或不存在蔬啡。
user # crontab應(yīng)該修改的具體用戶。
weekday # 任務(wù)執(zhí)行時(shí)間:周幾 ( 0-6 for Sunday-Saturday, *, etc )
?舉個(gè)栗子:
每10分鐘輸出一次 hello
ansible local -m cron -a 'minute="*/10" job="/bin/echo hello" name="test ansible-cron"'
# 到主機(jī)中查看:
crontab -l
# 移除定時(shí)任務(wù)
ansible local -m cron -a 'minute="*/10" job="/bin/echo hello" name="test ansible-cron" state=absent'
cron 我是直接翻譯了文檔镀虐,之后?可以使用ansible-doc -s
命令自己查看.后面也不再詳細(xì)翻譯
- user 操作用戶
# 創(chuàng)建用戶
ansible local -m user -a 'name="zing1" password="自定義的密碼" groups="root,system,sys" home="/home/zing1" '
# 刪除用戶
ansible local -m user -a 'name="zing1" state=absent fource=yes'
- group 操作用戶組
# 創(chuàng)建組
ansible local -m group -a 'name="mysql" gid=306 system=yes '
#? 刪除同user
- copy 復(fù)制文件
# 將本機(jī) 源.txt 文件拷貝到遠(yuǎn)程主機(jī)上成為 目標(biāo).txt
ansible webserverhost -m copy -a 'src="/home/zing/Documents/源.txt" dest="/home/xxserver/目標(biāo).txt" owner="root" mode=640'
src=本地目標(biāo)(可以是文件夾)
dest=遠(yuǎn)程目標(biāo)(可以是文件夾)
src可以用content替換
content:可以取代src箱蟆,表示信息直接?生成文件,與src不能同時(shí)使用刮便。
- file 操作文件
ansible local -m file -a 'ower="mysql" mode=644 src="/home/zing/Documents/from_mysql.link" path="/home/mysql/xxx.link" state="link" '
- service 指定服務(wù)的運(yùn)行狀態(tài)
ansible local -m service -a 'name="httpd" enabled=true state=started '
#enable表示是否開(kāi)機(jī)啟動(dòng)
#state 參數(shù)有started stopped restarted
shell空猜,指定執(zhí)行shell命令,與command類(lèi)似恨旱,在用到pipline辈毯,等復(fù)雜命令時(shí),使用shell更加合適,這里不舉例了
script 在遠(yuǎn)程主機(jī)上運(yùn)行本機(jī)?腳本搜贤,只支持用相對(duì)路徑
ansible serverhost -m script -a 'test.sh'
- setup 查看主機(jī)狀態(tài)信息
ansible all -m setup
0x03 yaml和playbook
是一個(gè)可讀性高谆沃,用來(lái)表達(dá)數(shù)據(jù)序列的格式。YAML參考了其他多種語(yǔ)言仪芒,包括:C語(yǔ)言唁影、Python、Perl掂名,并從XML据沈、電子郵件的數(shù)據(jù)格式(RFC 2822)中獲得靈感。目前已經(jīng)有數(shù)種編程語(yǔ)言或腳本語(yǔ)言支持(或者說(shuō)解析)這種語(yǔ)言饺蔑。
YAML的語(yǔ)法和其他高級(jí)語(yǔ)言類(lèi)似锌介,并且可以簡(jiǎn)單表達(dá)清單、散列表猾警,標(biāo)量等數(shù)據(jù)形態(tài)孔祸。[4]它使用空白符號(hào)縮進(jìn)和大量依賴外觀的特色,特別適合用來(lái)表達(dá)或編輯數(shù)據(jù)結(jié)構(gòu)肿嘲、各種配置文件融击、傾印除錯(cuò)內(nèi)容、文件大綱(例如:許多電子郵件標(biāo)題格式和YAML非常接近)雳窟。盡管它比較適合用來(lái)表達(dá)層次結(jié)構(gòu)式(hierarchical model)的數(shù)據(jù)結(jié)構(gòu)尊浪,不過(guò)也有精致的語(yǔ)法可以表示關(guān)系性(relational model)的數(shù)據(jù)匣屡。[5]由于YAML使用空白字符和分行來(lái)分隔數(shù)據(jù),使得它特別適合用grep/Python/Perl/Ruby操作拇涤。其讓人最容易上手的特色是巧妙避開(kāi)各種封閉符號(hào)捣作,如:引號(hào)、各種括號(hào)等鹅士,這些符號(hào)在嵌套結(jié)構(gòu)時(shí)會(huì)變得復(fù)雜而難以辨認(rèn)券躁。
想細(xì)致學(xué)習(xí)YAML的可以去阮一峰大神的博客看看:
http://www.ruanyifeng.com/blog/2016/07/yaml.html
那么Ansible中的Yaml文件是干啥的,其實(shí)就是指定掉盅,什么主機(jī)也拜,執(zhí)行什么任務(wù)的一個(gè)列表
- hosts: local
remote_user: root
tasks:
- name: git clone
git: repo=git@github.com:yourproject.git
dest=/home/yourhome/git/
accept_hostkey=yes
force=yes
recursive=no
key_file=/home/user/.ssh/id_rsa.github-{{ item.repo }}
上面的一串yml配置就是讓local主機(jī)以?root身份去git上獲取代碼放到本地
很簡(jiǎn)單明了。
那么playbook怎么理解呢趾痘?
playbook本身是劇本的意思慢哈,ansible playbook中,包含了:
- Inventory 主機(jī)庫(kù)文件
- modules 調(diào)用模塊
- Ad Hoc Commands 指定主機(jī)運(yùn)行的命令
- Playbooks 劇本文件
- tasks 任務(wù)永票,調(diào)用模塊執(zhí)行某些命令
- varable 變量
- Template 模板
- Handlers 處理器 由某些事件觸發(fā)某些行為
- Roles 角色
playbook的主要文件是用來(lái)指定tasks,下面舉些例子
# webservice 服務(wù)?運(yùn)行
tasks:
- name: make server running
service: name="webservice" state="ruuning"
# 執(zhí)行某個(gè)命令
tasks:
- name: kill services
shell: kill -9 {{service_PID}}
# 執(zhí)行某個(gè)命令
tasks:
- name: kill services
shell: kill -9 {{service_PID}}
# 忽略腳本返回值
tasks:
- name: some shell running
shell: xxxxx.sh || /bin/true
# 忽略錯(cuò)誤信息
tasks:
- name: ignore errors
shell: /tomcatpath/bin/startup.sh
ignore_errors: True
?執(zhí)行playbook也很簡(jiǎn)單
ansible-playbook xxxxx.yml
指定hosts inventory文件
ansible-playbook xxxxx.yml -i? hostsInventory文件PATH
0x04 從git開(kāi)始到項(xiàng)目發(fā)布并啟動(dòng)
1.定義hosts inventory
test_evn_hosts文件
[local]
127.0.0.1 ansible_ssh_port=22222 ansible_user=zing
[server]
yourside.example.com ansible_user=root
[all:vars]
#application.prpperties
SPRING_DATASOURCE_URL="jdbc:mysql://127.0.0.1:3306/yordatabase"
SPRING_DATASOURCE_USERNAME="yourname"
SPRING_DATASOURCE_PASSWORD="your_password"
SPRING_DATASOURCE_DRIVER_CLASS_NAME="org.mysql.Driver"
2.編寫(xiě)playbook YAML 文件
side.yml文件
- hosts: local
remote_user: zing
environment:
JAVA_HOME: /application/jdk8/
JRE_HOME: /application/jdk8/jre/
M2_HOME: /application/maven/bin/
roles:
- local
- hosts: server
remote_user: root
roles:
- server
3.編寫(xiě)配置文件
application.properties.j2 模板文件
spring.datasource.url = {{SPRING_DATASOURCE_URL}}
spring.datasource.username = {{SPRING_DATASOURCE_USERNAME}}
spring.datasource.password = {{SPRING_DATASOURCE_PASSWORD}}
spring.datasource.driver-class-name = {{SPRING_DATASOURCE_DRIVER_CLASS_NAME}}
4.編寫(xiě)腳本
git_clone.sh文件
#!/bin/bash
cd /home/zing/Documents/ansible/xxx/src
rm -rf xxx
git clone git@gitlabhost.com:xxx/xxx.git
5.編寫(xiě)task yaml
- name: git clone your xxx project
shell: /home/zing/Documents/ansible/xxx/roles/local/files/git_clone.sh
- name: transfom template
template: src={{item.file_src}} dest={{item.target_file_path}}
with_items:
- {file_src: '/home/zing/Documents/ansible/xxx/roles/local/template/application.j2', target_file_path: '/home/zing/Documents/ansible/xxx/src/xxx/src/main/resources/application.properties'}
- {file_src: '/home/zing/Documents/ansible/xxx/roles/local/template/config.j2', target_file_path: '/home/zing/Documents/ansible/xxx/src/xxx/src/main/resources/config.properties'}
6.playbook 執(zhí)行
ansible-playbook side.yml -i test_evn_hosts文件路徑
整體結(jié)構(gòu)
參考
http://ansible-tran.readthedocs.io/en/latest/docs/intro_inventory.html#inventoryformat
轉(zhuǎn)載請(qǐng)注明來(lái)自MaxZing : http://www.reibang.com/p/dd9e8ba5ec65