ansible安裝及使用

1、ansible介紹javascript

一、ansible簡介java

      官方的title是「Ansible is Simple IT Automation」——簡單的自動化IT工具。node

  Ansible跟其餘IT自動化技術的區別在於其關注點並不是配置管理、應用部署或IT流程工做流,而是提供一個統一的界面來協調全部的IT自動化功能,所以Ansible的系統更加易用,部署更快。python

  Ansible可讓用戶避免編寫腳本或代碼來管理應用,同時還能搭建工做流實現IT任務的自動化執行。IT自動化能夠下降技術門檻及對傳統IT的依賴,從而加快項目的交付速度。linux

二、ansible優缺點nginx

  優勢:web

  • 輕量級,他不須要去客戶端安裝agent,更新時,只須要在操做機上進行一次更新便可
  • 批量任務執行能夠寫成腳本,並且不用分發到遠程就能夠執行
  • 使用python編寫的,維護更簡單
  • 支持sudo

      缺點docker

  • 對於幾千臺、上萬臺機器的操做,還不清楚性能、效率狀況如何,須要進一步瞭解。

三、ansible架構及工做原理shell

     andible基本架構以下圖所示數據庫

 

  ansible core ansible 自身核心模塊

  host inventory: 主機庫,定義可管控的主機列表

  connection plugins: 鏈接插件,通常默認基於 ssh 協議鏈接

  modulescore modules ( 自帶模塊 ) custom modules ( 自定義模塊 )

  playbooks :劇本,按照所設定編排的順序執行完成安排任務 

 Ansible工做原理以下圖:

 

  一、管理端支持local sshzeromq 三種方式鏈接被管理端,默認使用基於ssh的鏈接---這部分對應基本架構圖中的鏈接模塊;

  2、能夠按應用類型等方式進行Host Inventory(主機羣)分類,管理節點經過各種模塊實現相應的操做---單個模塊,單條命令的批量執行,咱們能夠稱之爲     ad-hoc

  3、管理節點能夠經過playbooks 實現多個task的集合實現一類功能,如web服務的安裝部署、數據庫服務器的批量備份等。playbooks咱們能夠簡單的理解爲,系      統經過組合多條ad-hoc操做的配置文件 。

Ansible默認是經過SSH通道來管理的,也就是它所說的免客戶端方式管理, 它底層是經過 paramiko 來實現的。  

ansible執行過程大致過程以下圖,其中暖色調的表明已經模塊化。

2、部署安裝

名稱

IP

操做系統

用途

ansible-server

192.168.95.10/24

CentOS7.1

管理端

client-1

192.168.95.11/24

CentOS7.1

 

client-2

192.168.95.12/24

CentOS7.1

 

 

 

 

 

 

 一、ansible安裝方式有、源碼、pip、yum。

 1.1 源碼安裝

      源碼安裝須要python2.6以上版本,其依賴模塊paramikoPyYAMLJinja2httplib2simplejsonpycrypto模塊,以上模塊能夠經過pipeasy_install 進行安裝

 

   1.2pip安裝

        pip是專門用來管理Python模塊的工具,Ansible會將每次正式發佈都更新到pip倉庫中。因此經過pip安裝或更新Ansible,會比較穩妥的拿到最新穩定版。

 1.3 yum安裝

  1)安裝epel源

yum install http://mirrors.163.com/centos/7.4.1708/extras/x86_64/Packages/epel-release-7-9.noarch.rpm

  2)查看epel源並安裝ansible

[root@node2 ~]ll /etc/yum.repos.d/epel*

[root@node2 ~]yum install ansible -y

  3)查看ansible版本

ansible --version

2 ansible組成介紹

tree /etc/ansible/

/etc/ansible/

├── ansible.cfg  # ansible的配置文件

├── hosts  # ansible的主倉庫 用來存儲須要管理的遠程主機的相關信息

└── roles

三、ansible七個命令

ansible 

經常使用參數:-m 模塊

      -i PATH, --inventory=PATH 指定庫存主機文件的路徑,默認爲/etc/ansible/hosts.

                       -a  (arguments) 命令行參數

 

 示例:ansible test1 -m copy -a "src=/tmp/test.txt dest=/tmp/test.txt "

ansible-doc

//列出全部已安裝的模塊

# ansible-doc  -l

//查看具體某模塊的用法,這裏如查看command模塊

 

# ansible-doc -s command

absible-galaxy

ansible-galaxy 指令用於方便的從https://galaxy.ansible.com/ 站點下載第三方擴展模塊,咱們能夠形象的理解其相似於centos下的yumpython下的pipeasy_install 。以下示例:

ansible-galaxy install aeriscloud.docker

 

ansible-link

ansible-lint是對playbook的語法進行檢查的一個工具。用法是ansible-lint playbook.yml

 

ansible-playbook

 

該指令是使用最多的指令,其經過讀取playbook 文件後,執行相應的動做。

 

ansible-pull

 

適用於如下場景:你有數量巨大的機器須要配置,即便使用很是高的線程仍是要花費不少時間;你要在一個沒有網絡鏈接的機器上運行Anisble,好比在啓動以後安裝。

 

ansible-vault

 

注意:重點是ansibleansible-playbook

 

四、主機組(在hosts文件內配置)

[hangzhou]

host1

host2

[jiaxing]

host3

 

host4

五、ansible默認配置文件

 

Ansible默認安裝好後有一個配置文件/etc/ansible/ansible.cfg

ansible簡單使用

[root@test ansible]# ansible test1 -m ping -k

SSH password:

 

192.168.147.101 | FAILED => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.

報錯處理辦法:

ansible.cfg配置文件中,也會找到以下部分:

# uncomment this to disable SSH key host checking

host_key_checking = False  

默認host_key_checking部分是註釋的,經過找開該行的註釋,一樣也能夠實現跳過 ssh 首次鏈接提示驗證部分。

    可見採用密碼方式比較麻煩,實際應用中採用ssh 互信方式。

 

配置ssh 互信時,只須要管理主機能ssh被管理機器不須要輸入密碼便可。

3、ansible經常使用模塊

3.一、ping

ansible test1 -m ping

3.二、setuop

         setup模塊,主要用於獲取主機信息,在playbooks裏常常會用到的一個參數gather_facts就與該模塊相關。setup模塊下常用的一個參數是filter參數,具體使用示例以下:

 #查看主機內存信息

[root@test ~]# ansible test1 -m setup -a 'filter=ansible_*_mb'

 

#查看網卡信息

[root@test ~]# ansible test1 -m setup -a 'filter=ansible_eth0'

#將全部主機的信息輸入到/tmp/facts目錄下,每臺主機的信息輸入到主機名文件中(/etc/ansible/hosts裏的主機名)

[root@test ~]# ansible all -m setup --tree /tmp/facts

3.3 file 模塊

file模塊主要用於遠程主機上的文件操做。

(group、mode、owner):定義文件/目錄

path:定義文件路徑

recurse:遞歸的設置,只對目錄有效。

src:要被連接的源文件路徑,只應用於state=link的狀況

dest:被鏈接的路徑,只應用於state=link的狀況

state:directory:若是目錄不存在,建立目錄

file:即便文件不存在,也不會建立

link:建立軟鏈接

hard:建立硬連接

touch:文件不存在,則會建立。若是存在則會,則更新最後修改的時間。

absent:刪除目錄、文件或取消連接。

 

示例:

 

[root@test ~]# ansible test1 -m file -a "src=/etc/fstab dest=/tmp/fstab state=link"

[root@test ~]# ansible test1 -m file -a "path=/tmp/fstab state=absent"

 

 [root@test ~]# ansible test1 -m file -a "path=/tmp/fstab state=touch"

 3.4 cop模塊

     backup:在覆蓋以前將原文件備份,備份文件包含時間信息。有兩個選項:yes|no

    content:用於替代"src",能夠直接設定指定文件的值 

 directory_mode:遞歸的設定目錄的權限,默認爲系統默認權限

     force:若是目標主機包含該文件,但內容不一樣,若是設置爲yes,則強制覆蓋,若是爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes

     others:全部的file模塊裏的選項均可以在這裏使用

     src:要複製到遠程主機的文件在本地的地址,能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,它將遞歸複製。在這種狀況下,若是路徑使用"/"來結尾,則只複製目錄裏的內容,若是沒有使用"/"來結尾,則包含目錄在內的整個內容所有複製,相似於rsync。 

示例:

[root@test ~]# ansible test1 -m copy -a "src=/tmp/test.txt dest=/tmp/test.txt owner=foo group=foo mode=0644"

3.5 command 模塊

  • creates:一個文件名,當該文件存在,則該命令不執行
  • free_form:要執行的linux指令
  • chdir:在執行指令以前,先切換到該指定的目錄
  • removes:一個文件名,當該文件不存在,則該選項不執行
  • executable:切換shell來執行指令,該執行路徑必須是一個絕對路徑

 

注意:command模塊不是調用的shell的指令,因此沒有bash的環境變量,也不能使用shell的一些操做方式,其餘和shell沒有區別

示例:[root@test ansible]# ansible test1 -a 'df -h'

3.6 shell 模塊

  用法其本和command同樣,不過的是其是經過/bin/sh進行執行,因此shell 模塊能夠執行任何命令,就像在本機執行同樣。

示例:[root@test ansible]# ansible test1 -m shell -a 'ps -ef | grep sshd'

 

3.7 raw 模塊

用法和shell 模塊同樣 ,其也能夠執行任意命令,就像在本機執行同樣

 

注:raw模塊和comandshell 模塊不一樣的是其沒有chdircreatesremoves參數,chdir參數的做用就是先切到chdir指定的目錄後,再執行後面的命令,這在後面不少模塊裏都會有該參數 。

 

3.8 script 模塊

 

將管理端的shell 在被管理主機上執行,其原理是先將shell 複製到遠程主機,再在遠程主機上執行,原理相似於raw模塊。

3.9 service 模塊

 

  • arguments:給命令行提供一些選項
  • enabled:是否開機啓動 yes|no
  • name:必選項,服務名稱
  • pattern:定義一個模式,若是經過status指令來查看服務的狀態時,沒有響應,就會經過ps指令在進程中根據該模式進行查找,若是匹配到,則認爲該服務依然在運行
  • runlevel:運行級別
  • sleep:若是執行了restarted,在則stopstart之間沉睡幾秒鐘
  • state:對當前服務執行啓動,中止、重啓、從新加載等操做(started,stopped,restarted,reloaded

 

 

示例:[root@test ansible]# ansible test1 -m service -a "name=httpd state=started enabled=yes"

3.10 cron 模塊

  • backup:對遠程主機上的原任務計劃內容修改以前作備份
  • cron_file:若是指定該選項,則用該文件替換遠程主機上的cron.d目錄下的用戶的任務計劃
  • day:日(1-31**/2,……)
  • hour:小時(0-23**/2,……)  
  • minute:分鐘(0-59**/2,……)
  • month:月(1-12**/2,……)
  • weekday:周(0-7*,……)
  • job:要執行的任務,依賴於state=present
  • name:該任務的描述
  • special_time:指定何時執行,參數:reboot,yearly,annually,monthly,weekly,daily,hourly
  • state:確認該任務計劃是建立仍是刪除
  • user:以哪一個用戶的身份執行

示例:[root@test ansible]# ansible test1 -m cron -a 'name="check dirs" hour="5,2" job="ls -alh >/dev/null"'

3.11 filesystem 模塊

  • dev:目標塊設備
  • force:在一個已有文件系統的設備上強制建立
  • fstype:文件系統的類型
  • opts:傳遞給mkfs命令的選項

3.12 yum 模塊

 

  • config_fileyum的配置文件
  • disable_gpg_check:關閉gpg_check
  • disablerepo:不啓用某個源
  • enablerepo:啓用某個源
  • name:要進行操做的軟件包的名字,也能夠傳遞一個url或者一個本地的rpm包的路徑
  • state:狀態(presentabsentlatest

 

示例:[root@test ansible]# ansible test1 -m yum -a 'name=httpd state=latest'

3.13 user和group 模塊

user模塊是請求的是useradd, userdel, usermod三個指令,goup模塊請求的是groupadd, groupdel, groupmod 三個指令。

示例:

建立用戶:[root@test ~]# ansible test1 -m user -a 'createhome=yes home=/home/user1 password=123456 name=user1 shell=/bin/bash state=present'

 

 

刪除用戶:[root@test ~]# ansible test1 -m user -a 'remove=yes name=user1 state=absent'

3.14 synchronize 模塊

使用rsync同步文件

  • archive: 歸檔,至關於同時開啓recursive(遞歸)linkspermstimesownergroup-D選項都爲yes ,默認該項爲開啓
  • checksum: 跳過檢測sum值,默認關閉
  • compress:是否開啓壓縮
  • copy_links:複製連接文件,默認爲no ,注意後面還有一個links參數
  • delete: 刪除不存在的文件,默認no
  • dest:目錄路徑
  • dest_port:默認目錄主機上的端口 ,默認是22,走的ssh協議
  • dirs:傳速目錄不進行遞歸,默認爲no,即進行目錄遞歸
  • rsync_optsrsync參數部分
  • set_remote_user:主要用於/etc/ansible/hosts中定義或默認使用的用戶與rsync使用的用戶不一樣的狀況
  • mode: pushpull 模塊,push模的話,通常用於從本機向遠程主機上傳文件,pull 模式用於從遠程主機上取文件

示例:[root@test ansible]# ansible test1 -m synchronize -a 'src=/tmp/helloworld dest=/var/www'

3.15 mount 模塊

  • dump
  • fstype:必選項,掛載文件的類型
  • name:必選項,掛載點
  • opts:傳遞給mount命令的參數
  • src:必選項,要掛載的文件
  • state:必選項
  • present:只處理fstab中的配置
  • absent:刪除掛載點
  • mounted:自動建立掛載點並掛載之
  • umounted:卸載

示例:

#建立設備

[root@test ansible]# ansible test1 -a 'dd if=/dev/zero of=/disk.img bs=4k count=1024'

#/dev/loop1關聯

[root@test ansible]# ansible test1 -a 'losetup /dev/loop1 /disk.img'

#格式化

[root@test ansible]# ansible test1 -m filesystem -a 'fstype=ext3 force=yes opts=-F 

#掛載

[root@test ansible]# ansible test1 -m mount -a 'name=/mnt src=/dev/loop1 fstype=ext3 state=mounted opts=rw'

 

4、ansible-playbook

4.1 playbook 構成

  • Target section:   定義將要執行 playbook 的遠程主機組
  • Variable section:  定義 playbook 運行時須要使用的變量
  • Task section:     定義將要在遠程主機上執行的任務列表
  • Handler section:  定義 task 執行完成之後須要調用的任務

 

通常所需的目錄層有:(視狀況可變化) 

  • vars     變量層
  • tasks    任務層
  • handlers 觸發條件
  • files    文件
  • template 模板

 

4.2.1host和user

playbook中的每個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。

hosts 用於指定要執行指定任務的主機其能夠是一個或多個由冒號分隔主機組。

user 執行該任務組的用戶

remote_user 則用於指定遠程主機上的執行任務的用戶,與user相同。

sudo 若是設置爲yes,執行該任務組的用戶在執行任務時,獲取root權限。

 

 4.2.2 任務列表和action

 

 play的主體部分是task list

 

 示例:

tasks:

  - name: make sure apache is running

    service: name=httpd state=running

4.2.3 handlers

notify中列出的操做稱爲handler也即notify中調用 handler中定義的操做。 

注意:在 notify 中定義內容必定要和tasks中定義的 - name 內容同樣,這樣才能達到觸發的效果,不然會不生效。

4.2.4 tags

ansible中能夠對playroleincludetask打一個tag(標籤),而後:

  • 當命令ansible-playbook-t參數時,只會執行-t指定的tag
  • 當命令ansible-playbook--skip-tags參數時,則除了--skip-tags指定的tag外,執行其餘全部

 

 4.2.5 var

#變量定義在文件中

[root@test playbooks]# cat variables

port: 80

http: nginx

5、playbook經常使用模板

template

template模塊和copy相似,不一樣在於template會作變量替換。

 

經常使用參數:

 

backup:若是原目標文件存在,則先備份目標文件

 

dest:目標文件路徑

 

force:是否強制覆蓋,默認爲yes

 

group:目標文件屬組

 

mode:目標文件的權限

 

owner:目標文件屬主

 

src:源模板文件路徑

 

validate:在複製以前經過命令驗證目標文件,若是驗證經過則複製

 

示例:

 

- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode=0644 - template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode="u=rw,g=r,o=r"

 

set_face

set_fact模塊可讓你在遠程受管機器上去執行腳本的過程來計算咱們須要的值,這些值能夠被用在模板或者變量中。這些值有點相似setup模塊中的參數,只不過setup模塊是以單臺主機爲單位的。

示例:

tasks:

  -name: Calculate InnoDB buffer pool size

  set facl: innodb_buffer_pool_size_mb=」{{ ansible_mentotal_mb /2 }}」

pause

暫停模塊可讓咱們在playbooks中暫停一段時間,能夠知道一個時間段,或者提示用戶繼續。在命令行中沒生麼有,但在playbook中,頗有用處。

示例:

# Pause for 5 minutes to build app cache.

- pause: minutes=5

# Pause until you can verify updates to an application were successful.

- pause:

# A helpful reminder of what to look out for post-update.

- pause: prompt="Make sure org.foo.FooOverload exception is not present"

 

wait_for

wait_for模塊用來檢測一個tcp端口是否準備好接收遠程鏈接,這是由遠程主機來完成的。

示例:

# 10秒後在當前主機開始檢查8000端口,直到端口啓動後返回

- wait_for: port=8000 delay=10

# 檢查path=/tmp/foo直到文件存在後繼續

- wait_for: path=/tmp/foo

# 直到/var/lock/file.lock移除後繼續

- wait_for: path=/var/lock/file.lock state=absent

  -name: Wait for Tomcat to start

    wait_for: port=8080 state=started

 

assemble

assemble組裝模塊把多個受管主機的文件合併成一個文件,當配置文件不容許包含的時候,很是有用。特別在設置root用戶的authorized_keys文件的時候。

示例:

# Example from Ansible Playbooks

- assemble: src=/etc/someapp/fragments dest=/etc/someapp/someapp.conf

# When a delimiter is specified, it will be inserted in between each fragment

- assemble: src=/etc/someapp/fragments dest=/etc/someapp/someapp.conf delimiter='### START FRAGMENT ###'

 

add_host

add_host添加主機模塊是playbook中一個強大的模塊,它可讓你動態的添加受管主機到一個play中。

示例:

# add host to group 'just_created' with variable foo=42

- add_host: name={{ ip_from_ec2 }} groups=just_created foo=42

 

group_by

group_by模塊可讓咱們根據主機的真實特性進行分組,真實特性能夠經過add_fact來實現。Group_by模塊只接受一個參數,key,一樣組名的機器被分到一個組裏面。

示例:

# Create groups based on the machine architecture

-  group_by: key=machine_{{ ansible_machine }}

# Create groups like 'kvm-host'

-  group_by: key=virt_{{ ansible_virtualization_type }}_{{ ansible_virtualization_role }}

 

get_url

該模塊主要用於從httpftphttps服務器上下載文件(相似於wget),主要有以下選項:

  sha256sum:下載完成後進行sha256 check

  timeout:下載超時時間,默認10s

  url:下載的URL

  url_passwordurl_username:主要用於須要用戶名密碼進行驗證的狀況

  use_proxy:是事使用代理,代理需事先在環境變動中定義

示例:

- name: download foo.conf

  get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf mode=0440

- name: download file with sha256 check

  get_url: url=http://example.com/path/file.conf dest=/etc/foo.conf sha256sum=b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c

 

debug

調試模塊,用於在調試中輸出信息
經常使用參數:
msg:調試輸出的消息
var:將某個任務執行的輸出做爲變量傳遞給debug模塊,debug會直接將其打印輸出
verbosity:debug的級別(默認是0級,所有顯示)

fail

用於終止當前playbook的執行,一般與條件語句組合使用,當知足條件時,終止當前play的運行。能夠直接由failed_when取代。

選項只有一個:

msg:終止前打印出信息

示例:

- fail: msg="The system may not be provisioned according to the CMDB status."   when: cmdb_status != "to-be-staged"

6、playbook的roles和include

include

1、包含task文件 

---

# possibly saved as tasks/foo.yml

- name: placeholder foo

  command: /bin/foo

 

- name: placeholder bar

  command: /bin/bar

2、包含handle文件

 

---

 # this might be in a file like handlers/handlers.yml

 - name: restart apache

  service: name=apache state=restarted

 

play末尾包含上面的handler文件:

 handlers:

  - include: handlers/handlers.yml

3、直接包含playbook文件

 

roles(角色)

roles用來組織playbook結構,以多層目錄和文件將playbook更好的組織在一塊兒

 角色容許你將變量、文件、任務、模板、handlers放到一個文件夾中,而後包含它們。在創建好一個有效的依賴關係以後,還能夠在一個角色中包含另一個角色。

roles組織的playbook結構:

 

site.yml

webservers.yml

fooservers.yml

roles/

     common/    #下面的子目錄都不是必須提供的,沒有的目錄會自動忽略,不會出現問題,因此你能夠只有tasks/子目錄也沒問題

     files/

     templates/

     tasks/

     handlers/

     vars/

     meta/

     webservers/

 

而後在playbook文件中包含commonwebservers這兩個role

---

- hosts: user_group1

  roles:

     - common

     - webservers

相關文章
相關標籤/搜索