Ansible自動(dòng)化部署入門(mén)

  • 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'
默認(rèn)為command模塊
  • 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"' 
執(zhí)行結(jié)果
# 到主機(jī)中查看:
crontab -l
查看
# 移除定時(shí)任務(wù)
ansible local -m cron -a 'minute="*/10" job="/bin/echo hello" name="test ansible-cron" state=absent' 
移除定時(shí)任務(wù)

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)

ansible項(xiàng)目結(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卵贱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子侣集,更是在濱河造成了極大的恐慌,老刑警劉巖世分,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件编振,死亡現(xiàn)場(chǎng)離奇詭異臭埋,居然都是意外死亡镐牺,警方通過(guò)查閱死者的電腦和手機(jī)痹束,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)论巍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人焙矛,你說(shuō)我怎么就攤上這事⌒劣眩” “怎么了薄扁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)废累。 經(jīng)常有香客問(wèn)我邓梅,道長(zhǎng),這世上最難降的妖魔是什么邑滨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任日缨,我火速辦了婚禮,結(jié)果婚禮上掖看,老公的妹妹穿的比我還像新娘匣距。我一直安慰自己,他們只是感情好哎壳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布毅待。 她就那樣靜靜地躺著,像睡著了一般归榕。 火紅的嫁衣襯著肌膚如雪尸红。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天刹泄,我揣著相機(jī)與錄音外里,去河邊找鬼。 笑死特石,一個(gè)胖子當(dāng)著我的面吹牛盅蝗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播姆蘸,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼墩莫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芙委!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起贼穆,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤题山,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后故痊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體顶瞳,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年愕秫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慨菱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡戴甩,死狀恐怖符喝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甜孤,我是刑警寧澤协饲,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站缴川,受9級(jí)特大地震影響茉稠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜把夸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一而线、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恋日,春花似錦膀篮、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谈截,卻和暖如春烤黍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背傻盟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫂丙,地道東北人娘赴。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像跟啤,于是被迫代替她去往敵國(guó)和親诽表。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唉锌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容