第2章 Ansible入門

2.1 安裝Ansible

以CentOS為例:

2.1.1 在管理員的電腦安裝

  1. 安裝Ansible軟件
yum install epel-release -y
yum install ansible -y
  1. 配置Ansible管理節(jié)點到主機的連接
#生成密鑰
ssh-keygen
#復制密鑰的遠程主機上
ssh-copy-id remoteuser@remoteserver
#SSH的時候不會提示是否保存密鑰
ssh-keyscan remote_servers >> ~/.ssh/known_hosts

2.1.2 被管理的遠程主機

啥也不用做底循,只需要保證SSH服務是啟動的,并且Python版本大于2.4即可。

2.2 Ansible管理哪些主機

2.2.1 什么是主機目錄

主機目錄(Host Inventory骡送,又稱為主機清單)是配置文件饼暑,用來告訴Ansible需要管理哪些主機司抱,并且把這些主機按需分類余境。

2.2.2 主機目錄配置文件

默認的文件是: /etc/ansible/hosts .可以修改為其他文件

2.3 Ansible用命令管理主機

Ansible提供了一個命令行工具钓账,官方叫做 Ad-Hoc Commands陕悬。

  1. Ansible命令的格式
ansible <host-pattern> [options]
  1. 示例
#檢查所有的遠程主機题暖,是否以 "pangcm" 用戶創(chuàng)建了Ansible管理主機可以訪問的環(huán)境
ansible all -m ping -u pangcm

#執(zhí)行命令
ansible all -a "/bin/echo hello"

#復制文件
ansible web -m copy -a "src=/etc/hosts dest=/tmp/hosts"

#安裝包
ansible web -m yum -a "name=acme state=present"

#添加用戶
ansible all -m user -a "name=foo password=<crypted passowrd here>"

#并行執(zhí)行
ansible lb -a "/sbin/reboot" -f 10

#查看遠程主機的全部系統(tǒng)信息
ansible all -m setup

2.4 Ansible用腳本管理主機

為了避免重復輸入命令,Ansible提供了腳本功能。Ansible腳本的名字叫做Playboo芙委,使用的YAML格式逞敷,文件以yml活yaml為后綴。

2.4.1 執(zhí)行腳本Playboook的方法

ansible-playbook deploy.yml

2.4.2 Playbook 的例子

Playbook 包含了幾個關鍵字灌侣,每個關鍵字的含義如下推捐。

  • hosts: 某主機的IP,或者主機名侧啼,或者關鍵字 all.
  • remote_user: 以某個用戶身份執(zhí)行牛柒。
  • vars: 變量
  • tasks: Playbook的核心,定義順序執(zhí)行的動作Action痊乾。每個Action調(diào)用一個Ansible模塊皮壁。
    • action 語法:
    module: module_parameter=module_value
    
    • 常用的模塊有 yum、copy哪审、template等蛾魄,模塊在Ansible中的作用,相當與bash腳本中的yum湿滓、copy這樣命令的作用滴须。
  • handers: Playbook的Even處理操作,有且僅有被Action觸發(fā)時才會執(zhí)行叽奥。但是多次出發(fā)只執(zhí)行一次扔水,并按照聲明的順序執(zhí)行。下面是一個安裝Apache的示例:
---
- hosts: web
  vars:
    http_port:80
  remote_user: root
  tasks:
  - name: ensure apache is at the lastest version
    yum: pkg=httpd state=latest

  - name: Write the configuration file
    template: src=template/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
    notify:
    - restart apache

  - name: ensure apache is running
    service: name=httpd state=started

  handlers:
  - name: restart apache
    service: name=httpd state=restarted

2.4.3 Play和Playbook

在一個Playbook文件中朝氓,針對每一組主機的所有操作就是一個Play魔市,一般情況下一個Playbook只包含一個Play,但是也而已包含多個赵哲。

2.5 Ansible模塊

2.5.1 什么是Ansible模塊

類別于shell待德,Ansible中的模塊就好比shell中的命令。shell中的命令可以帶參數(shù)枫夺,Ansible中的模塊也可以帶參數(shù)磅网。

2.5.2 在命令行中使用模塊

在命令行中:

  • -m 后面接調(diào)用模塊的名字
  • -n 后面接調(diào)用模塊的參數(shù)

如:

ansible all -m copy -a "src=/etc/hosts dest=/tmp/hosts"

2.5.3 在Playbook中使用模塊

在Playbook腳本中,tasks中每一個Action都是對模塊的一次調(diào)用筷屡。在每個Action中:

  • 冒號前面的是模塊的名字
  • 冒號后面是調(diào)用模塊的參數(shù)

2.5.4 Ansible模塊的特點

  • 像Linux中的命令一樣涧偷,Ansible的模塊既可以在命令行中調(diào)用,也可以在Ansible腳本Playbook中調(diào)用毙死。
  • 每個模塊的參數(shù)和狀態(tài)判斷燎潮,都取決于該模塊的具體實現(xiàn),所以在使用它們之前需要查閱該模塊的文檔扼倘。
  • 可以通過文檔查看具體的用法
  • 通過命令 ansible-doc 也可以查看模塊的用法
  • Ansible提供一些常用功能的模塊确封,同時Ansible也提供API除呵,讓用戶可以自己寫模塊,使用的編程語言是Python爪喘。

2.5.5 常用的模塊

下面介紹一些常用的模塊

  1. 調(diào)試和測試類的模塊

    • ping: ping遠程主機颜曾,如果返回pong,則意味著能夠通過Ansible連接
    • debug: 用于調(diào)試的模塊秉剑,只是打印一些消息泛豪,類比Linux的ehco。
  2. 文件類的模塊

    • copy: 從本地復制文件到遠程節(jié)點
    • template: 從本地復制文件到遠程節(jié)點侦鹏,并進行變量的替換
    • file: 設置文件屬性
  3. Linux 上常用的操作

    • user: 管理用戶賬戶
    • yum: Red Hat 系Linux上的包管理
    • service: 管理服務
    • firewall: 管理防火墻中的服務和端口
  4. 執(zhí)行shell命令

    • shell:在節(jié)點上執(zhí)行shell命令诡曙,支持 $HOME、 "|" 和 "&" 等略水。
    • command: 在節(jié)點上執(zhí)行shell命令价卤,不支持 $HOME、 "|" 和 "&" 等渊涝。

針對上面提到的常用模塊慎璧,下面針對幾個做下具體的介紹

  1. debug 模塊
    • 通過參數(shù) msg 定義打印的字符串,當然也可以打印變量
    - debug:
      msg: "I can echo vars {{ inventory_hostname }}"
    
    • 通過參數(shù) var 定義需要打印的變量跨释,后面直接跟變量的名稱
    - debug:
      var: inventory_hostname
    

msg 和 var 都能輸出變量胸私,但是 msg輸出變量時需要顯式地表示變量才行,也就是使用 "{{}}" 標注煤傍,如果shell中的 "$()" 盖文。而var則不需要嘱蛋。

  1. copy 模塊
    需要注意的是蚯姆,copy模塊在復制前會先比較文件的 checksum,如果相同則不復制洒敏,返回狀態(tài)OK龄恋;如果不同才復制,返回狀態(tài) changed.

    • 設置文件權限
      利用mode 設置權限可以是數(shù)字凶伙,也可以時符號的形式郭毕,如"u=rw,g=r,o=r"
    - copy: "src=/etc/hosts dest=/tmp/hosts owner=foo group:foo mode=0644"
    
    • 備份節(jié)點上原來的文件
      當backup參數(shù)為yes的時候,如果發(fā)生了復制操作函荣,那么會先復制目標節(jié)點上的源文件显押。當兩個文件相同時,不再進行復制操作傻挂。
    - copy:  "src=/etc/hosts dest=/tmp/hosts backup=yes"
    
    • 復制后的驗證操作
      validate 參數(shù)接需要驗證的命令乘碑。一般需要驗證復制后的文件,所以 %s 都可以指代復制后的文件金拒。當copy模塊中加入 validate 參數(shù)后兽肤,不僅需要成功復制文件,還需要 validate命令返回成功的狀態(tài),整個模塊的執(zhí)行才算成功资铡。常見的場景如 visudo电禀。
    - copy:
      src: /tmp/sudoers
      dest: /etc/sudoders
      validate: 'visudo -cf %s'
    
  2. template 模塊
    使用的方法和copy幾乎一模一樣,不同的是template可以攜帶變量笤休。也就是說能夠進行變量的替換尖飞,起到模版的用途。這里只需要知道變量的使用需要使用 "{{}}" 即可宛官,后面會介紹jinja2的具體用法葫松。常見的場景如nginx配置文件的復制替換。

  1. file模塊
    file模塊可以用來設置遠程主機的文件底洗、軟連接和文件夾的權限腋么,也可以用來創(chuàng)建和刪除他們。如下所示
- name: "改變文件的權限"
  file: path=/etc/foo.conf mode=0644

- name: "創(chuàng)建文件的軟鏈接"
  file: src=/tmp/hosts dest=/tmp/hosts_symlink state=link

- name: "創(chuàng)建一個新文件"
  file:
    path: /etc/foo.conf
    state: touch
    mode: 0644
 
- name: "創(chuàng)建一個目錄"
  file:
    path: /tmp/test
    state: directory
    mode: 0755
  1. user 模塊
    user 模塊可以增亥揖、刪珊擂、改Linux遠程節(jié)點的用戶賬戶,并為其設置賬戶的屬性费变。如下
---

- hosts: remote_host
  tasks:
  - names: "增加用戶"
    user: "name=johnd comment='John Doe' uid=1040 group=admin"
  
  - name: "創(chuàng)建用戶james摧扇,并將其添加到兩個group中"
    user: "name=james shell=/bin/bash groups=admin,developers append=yes"

  - name: "刪除賬戶"
    user: "name=johnd state=absent remove=yes"

  - name: "修改賬戶的屬性,創(chuàng)建SSH密鑰,并放在 ~/.ssh/id_rsa 中 "
    user:
      name: jsmith
      generate_ssh_key: yes
      ssh_key_file: .ssh/id_rsa
  1. yum 模塊
    yum模塊用來管理RedHat系的安裝包的挚歧,Red Hat8使用了dnf來管理包扛稽,如果遠程主機是版本8的話,則需要使用dnf模塊滑负。
- name: "從yum源上安裝最新的httpd包在张,已經(jīng)有的話則會更新"
  yum: "name=httpd state=latest"

- name: "安裝指定版本的包"
  yum: "name=httpd-2.2.29-1.4.amzn1 state=present"

- name: "刪除httpd包"
  yum: "name=httpd state=absent"

- name: "安裝一組包"
  yum: 
    name: "@Development tools"
    state: present
    
- name: "本地安裝包"
  yum: "name=/tmp/httpd.rpm state=present"
  1. service 服務管理模塊
    改模塊用來管理遠程節(jié)點上的服務,比如httpd矮慕、sshd等帮匾。
- name: "開啟服務"
  service: "name=httpd state=started"

- name: "重啟服務"
  service: "name=httpd state=restarted"

- name: "設置開機啟動"
  service: "name=httpd enabled=yes"

- name: "啟動網(wǎng)絡服務下的接口 eth0"
  service: "name=network state=restarted args=eth0"
  1. firewalld 模塊
    firewalld 模塊為某服務和端口添加firewalld規(guī)則。firewalld中有正在運行的規(guī)則和永久規(guī)則痴鳄,firewalld模塊都支持瘟斜。
- name: "為服務添加firewalld規(guī)則"
  firewalld: "zone=dmz service=https permanent=true state=enabled"

- name: "為端口號添加firewalld規(guī)則"
  firewalld: "port=8081/tcp permanent=true state=disabled"

- name: "其他復雜的firewalld規(guī)則"
  firewalld: "source=192.168.2.0/24 zone=internal state=enabled"

- name: "其他復雜的firewalld規(guī)則"
  firewalld: "zone=trusted interface=eth2 permanent=true state=enabled"
  1. shell 模塊
    如果能通過其他的Ansible模塊實現(xiàn)的盡量不要使用shell模塊來實現(xiàn),原因是shell模塊不會對執(zhí)行的狀態(tài)進行判斷痪寻,也就是不存在該模塊不存在冪等性螺句。

shell模塊支持 $HOME、"<"橡类、">"蛇尚、"|"、";" 和 "&" 猫态。

- name: "test $home"
  shell: echo "test1" > ~/tmp/test1

- name: "test &&"
  shell: service jboss start && chkconfig jboss on

- name: "支持調(diào)用腳本"
  shell: "somescript.sh >> somelog.txt"

- name: "可以指定工作目錄"
  shell: "somescript.sh >> somelog.txt"
  args:
    chdir: somedir/

- name: "指定工作目錄佣蓉,并且僅在文件somelog.txt 不存在時執(zhí)行命令"
  shell: "somescript.sh >> somelog.txt"
  args:
    chdir: somedir/
  creates: somelog.txt 
  1. command 模塊
    功能和shell類似披摄,但是不支持 $HOME、"<"勇凭、">"疚膊、"|"、";" 和 "&" 等操作虾标。和shell不同的地方是能夠傳入?yún)?shù)寓盗。
- name: "比shell模塊多一個傳參的方式"
  command: /usr/bin/make_database.sh arg1 arg2 creates=/path/database
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市璧函,隨后出現(xiàn)的幾起案子傀蚌,更是在濱河造成了極大的恐慌,老刑警劉巖蘸吓,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件善炫,死亡現(xiàn)場離奇詭異,居然都是意外死亡库继,警方通過查閱死者的電腦和手機箩艺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宪萄,“玉大人艺谆,你說我怎么就攤上這事“萦ⅲ” “怎么了静汤?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長居凶。 經(jīng)常有香客問我虫给,道長,這世上最難降的妖魔是什么排监? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任狰右,我火速辦了婚禮杰捂,結果婚禮上舆床,老公的妹妹穿的比我還像新娘。我一直安慰自己嫁佳,他們只是感情好挨队,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒿往,像睡著了一般盛垦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓤漏,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天腾夯,我揣著相機與錄音颊埃,去河邊找鬼。 笑死蝶俱,一個胖子當著我的面吹牛班利,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榨呆,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼罗标,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了积蜻?” 一聲冷哼從身側響起闯割,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竿拆,沒想到半個月后宙拉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡丙笋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年鼓黔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片不见。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡澳化,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稳吮,到底是詐尸還是另有隱情缎谷,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布灶似,位于F島的核電站列林,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酪惭。R本人自食惡果不足惜希痴,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望春感。 院中可真熱鬧砌创,春花似錦、人聲如沸鲫懒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窥岩。三九已至甲献,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颂翼,已是汗流浹背晃洒。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工慨灭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人球及。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓缘挑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桶略。 傳聞我的和親對象是個殘疾皇子语淘,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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