ansible部分功能詳解

一. 架構: 組成

    ansible core:

    modules:

    Core Module

    Custom Module

  Host Inventory: 主機清單

      File

      CMDB

  Playbooks : 定義對每個主機的操作任務, 定義了host和role的對應關系

    hosts:

    roles: 任務

  Connection plugin: 連接插件

二. 特性

    模塊化: 調用特定的模塊, 完成特定的任務;

    基于Python語言研發, 由paramiko,pyYAML和jinja2三個核心庫實現;

    部署簡單: agentless, 無代理;

    支持自定義模塊, 使用任意編程語言;

    強大的playbook機制;

    冪等性: 多次執行同一命令, 結果相同;

三. 安裝及程序環境

ansible: 主程序

ansible-playbook: 執行腳本文件程序

ansible-doc: 獲取幫助文檔

配置文件:

/etc/ansible/ansible.cfg

主機清單:

/etc/ansible/hosts

插件目錄:

/usr/share/ansible_plugins/: 連接插件

ansible命令:

ansible命令是以ssh通信連接的, 前提要在主機之間建立ssh公鑰認證;

ssh-keygen -t rsa -P ''  #生成公鑰;
ssh-copy-id -i .ssh/id_rsa.pub root@NODE  #將公鑰發送給客戶端;

為了手動完成管理功能

前提: 配置/etc/ansible/hosts

[GROUP_NAME]
HOST_IP_1
HOST_IP_2
...

基本語法:

ansible <host-pattern> [options]

host-pattern : 需要管理的主機

options:

-m MOD_NAME : 指明調用的模塊;

-a MODULE_ARGS: 指明模塊參數;

基本格式:

ansible GRP_NAME -m MOD_NAME -a MOD_ARGS "ARGS"

ansible 模塊:

ansible-doc [options] [module…]

-l, –list: 獲取模塊列表

-s MOD_NAME: 獲取模塊的簡單用法

四. 常用模塊 

1. ping : 嘗試連接主機, 驗證一個可用的python并且成功返回"pong";

ansible GRP_NAME -m ping

2. command : 在遠程節點上執行命令;

示例:

ansible websrv -m command -a "ifconfig"

注意: command模塊不能接受管道等符號, 若需要使用, 需要調用shell模塊;

3. shell : 在節點上啟動腳本執行命令, 支持shell的高級功能;

注意: command和shell模塊的核心參數直接為命令本身, 而其它模塊的參數通常為"key=value"格式;

示例: 

ansible websrv -m command -a "useradd centos"
ansible websrc -m shell -a "echo 'magedu' | passwd --stdin centos"

4. copy : 復制ansible上的文件到遠程主機上;

參數:

content: 直接給定內容, 保存在遠程主機上;

src= : 要復制到遠程服務器的文件的本地路徑, 可以是相對路徑, 也可以是絕對路徑. 所以, 在一般使用中, 會將需要的各種文件, 放置到同一的ansible的目錄下進行存放, 方便以后的命令的整體移動使用;

dest= : 指明遠程路徑, 必須為目錄;

mode : 指明目標文件的權限;

group : 指明目標文件的屬組;

owner : 指明目標文件的屬主;

示例:

ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible mode=600"
ansible all -m copy -a "content='hello\nworld\n' dest=/tmp/fstab mode=640"

5. file : 設置文件的屬性;

參數: 

group : 設置文件的屬組;

owner : 設置文件的屬主;

path= : 指明要修改哪個文件的屬性;

state : 定義目標文件屬性; 如果是directory, 不存在, 將被創建; 如果是file, 不存在, 不會創建, 請使用copy或template模塊; 如果是link, 將創建或更改符號鏈接; 硬鏈接使用hard; state默認為present;

示例:

ansible all -m file -a "path=/tmp/fstab.ans owner=centos" #修改文件屬主
ansible all -m file -a "path=/tmp/fstab.ans state=absent" #刪除文件, absent表示刪除;
ansible all -m file -a "path=/tmp/dir.ansible state=directory" #創建空目錄;
ansible all -m file -a "path=/tmp/test.ansible.link src=/tmp/test.ansible state=link" #創建符號鏈接文件, 其中path指明
#要創建的符號鏈接文件路徑, src指明符號鏈接的源文件, state指明創建的為符號鏈接;

6.fetch : 從遠程節點獲取文件, 通常從遠程某一臺主機上獲取文件, 同時從多臺遠程主機獲取文件, 會發生紊亂;

7. cron : 管理cron.d和crontab任務條目;

參數: 

    name= : crontab條目的描述, 如果設置了env,則為環境變量的名稱. 如果state=absent, 則為必須;

    job : 要執行的命令, 或者如果設置了env, 則為環境變量的值; 如果state=present, 則為必須;

    state : whether to ensure the job or environment variable is present or absent;

示例: 

ansible all -m cron -a "minute='*/5' job='/usr/sbin/ntpdate 10.1.0.1 &> /dev/null name='sync time'" 
#每5分鐘與服務器同步一次時間; 其中, name必須指定, 不能省略;
ansible all -m cron -a "name='sync time' state=absent" #刪除name指定的計劃任務;

crontab -l : 查看本機的計劃任務;

8. hostname :設定主機名稱;

參數:

name= : 指明要設置的主機名稱, 屬于必須給的選項;

9. yum : 使用yum管理軟件包;

參數:

state={present|installed|latest|absent|removed} : 

安裝 : present或installed或latest;

刪除 : absent或removed;

disable_gpg_check={true|false} : 安裝過程中禁止gpg密鑰檢查;

disablerepo= : 安裝過程中臨時禁用某個repo;

enablerepo= : 安裝過程中, 臨時啟用某個repositories;

示例:

ansible all -m yum -a "name=httpd" #安裝httpd;
ansible all -m yum -a "name=httpd state=absent" #刪除httpd;

10. service : 管理服務;

參數:

name= : 指明要管理的服務;

state={started|stopped|restarted|reloaded} : 指明服務的動作; 'started'/'stopped'是冪等動作,除非必要,否則不會運行命令; 'restarted'將始終退回服務; 'reloaded'將總是重新加載; *至少一個狀態和啟用.

enabled={true|false} : 是否開機自動啟動;

arguments= : 傳遞其他參數;

示例:

chkconfig –list httpd

ansible all -m service -a "name=httpd state=started enable=true" # 啟動httpd服務, 并且開機啟動;
systemctl is-enabled *.service #查看服務是否開機啟動;

11. group : 添加或刪除用戶組;

參數:

gid= : 指明組的gid

name= : 指明創建的組名

state={present|absent} : 添加或刪除組;

system=[yes] : 如果指明為yes則創建系統組;

12. user : 管理用戶賬戶;

參數:

name= : 指明要創建的用戶名;

groups= : 指明要添加到的組;

shell= : 指明默認shell;

uid= : 指明id號;

system= : 創建用戶是, 如果為'yes', 則會創建系統用戶;

createhome= : 如果指明為no, 則不創建家目錄;

comment= : 指明用戶的注釋信息;

expires= : 指明用戶的過期時間;

13. setup : 收集遠程主機的系統景況;

當需要用到一些系統的信息的時候, 需要首先收集主機的信息, 將其報告為ansible, 然后才能使用;

示例:

ansible 10.1.52.2 -m setup #此處的IP地址必須是/etc/ansible/hosts中定義了的主機IP地址; 未定義無法獲取;

部分獲取的主機信息參數:

ansible_distribution : 系統的發行版本;

ansible_distribution_major_version : 系統的主版本號;

ansible_hostname : 主機名;

ansible_processor_core : 每顆CPU的核心數;

ansible_processor_count : 共有幾顆CPU;

ansible_processor_vcpus: 虛擬CPU數量;

ansible_processor_threads_per_code : 每個CPU核心的線程數量;

YAML格式的存儲文件 : python常用的模板語言;

yum info PyYAML

序列化格式

數據格式:

鍵值對  key:value

列表 : 有序數組

– item1

– item2

字典 : 關聯數組

{name:jerry,age:21}

playbook :

語法結構:

tasks : 任務, 由模塊定義的操作列表;

variables : 變量

templates : 模板, 即使用模板語法的文本文件;

handlers : 由特定條件觸發的task;

roles : 角色;

五. playbook的基礎組件

  Hosts :       運行指定任務的目標主機;

  remote_user : 在遠程主機上以哪個用戶的身份執行; 建議使用root用戶; 非root賬戶, 要使用sudo_user

  tasks : 任務列表;

  模塊, 模塊參數

格式:

(1) action:module arguments

(2) module:arguments

1. tasks 基本語法格式 – 如何定義 tasks

示例一:

- name: deploy web server
  user: foouser
  sudo: true
  hosts: all

  tasks: 
  - name: install apache
    apt: pkg=apache2-mpm-prefork state=latest
   (其中apt指明使用的模塊)

示例二:

在hosts中的用戶上創建組, 創建用戶并指定組

首先創建的playbook腳本要以".yaml"結尾

- hosts: all
  remote_user: root
  tasks:
  - name: install a group
    group: name=mygrp system=true
  - name: install a user
    user: name=user1 group=mygrp system=true

- hosts:
  remote_user: root
  tasks:
  - name: install httpd
    yum: name=httpd
  - name: start httpd.service
    service: name=httpd state=started

ansible-playbook命令 – 運行.yml或.yaml腳本

語法:

ansible-playbook [options] PLAYBOOK.yml

options:

-C, –check: 測試模式, 不做任何更改, 而是嘗試運行, 進行檢查;

–list-hosts: 輸出匹配的主機列表, 不執行其他操作;

–list-tags : 列出所有可用的標簽

–list-tasks: 列出所有將要執行的任務;

-t TAGS, –tags=TAGS : 只運行tags標識的任務

–skip-tags=SKIP-TAGS : 只運行tags沒有標記的任務;

–syntax-check: 對劇本執行語法檢查, 但是不執行;

示例三:

要求: 在遠程主機上安裝httpd服務, 并且能夠監聽8080端口.

方法: 

(1) 安裝httpd;

(2) 提供配置文件;

(3) 啟動httpd服務;

playbook文件

- hosts: dbsrv
  remote_user: root
  tasks:
  - name: install httpd
    yum: name=httpd state=latest
  - name: install conf file
    copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
  - name: start httpd.service 
    service: name=httpd state=started

2. handlers : 

playbook文件 :

- hosts: dbsrv
  remote_user: root
  tasks:
  - name: install httpd
    yum: name=httpd state=latest
  - name: install conf file
    copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf

    notify: restart httpd service
 
  - name: start httpd.service 
    service: name=httpd state=started
 
  handlers:
  - name: restart httpd service
    service: name=httpd state=restarted

handlers: 由特定條件觸發的Tasks; 

在某個tasks中觸發, 當notify存在位置的上一個動作如果發生改變, 就會觸發handlers定義的動作; 使用notify來調用, 調用的為handlers中name定義的名字; 

此方法在服務類程序中使用較多, 當可以reload生效時, 可以使用command和shell進行定義;

handlers:

– name: reload httpd

 shell: systemctl reload httpd.service 

3. tags : 給指定的任務定義一個調用標識;

ansible-playbook -t TAGS PLAYBOOK.yaml

ansible-playbook –skip-tags TAGS PLAYBOOK.yaml

在 tasks 或 handlers 中定義, 必須放置在 – name: 段當中, 對存在 tags 的程序段進行操作; 其他全部不進行操作;

4. variables : 

類型 : 

內建 : 可直接調用

(1) facts : 可以使用 setup模塊獲取的變量

用戶自定義 : 

(1) 通過命令行傳遞

-e VAR1=VALUE1 -e VAR2=VALUE2 …

(2) 在hosts Inventory中為每個主機定義專用變量值;

(a) 向不同的主機傳遞不同的變量;

IPhone/HOSTNAME variable_name=value

(b) 向組內的所有主機傳遞相同的變量;

[group_name:VARS]

variable_name=value

調用 :

{{ var_name }}

示例:

- hosts: dbsrv
  remote_user: root
  vars:
  - pkgname: httpd
  tasks:
  - name: install a packet
    yum: name={{ pkgname }} state=present

使用vars記性變量的定義, 格式如下

vars:

– VAR_NAME1: VALUE1

– VAR_NAME2: VALUE2

若沒指定, 可以使用 -e 選項, 并且命令行中給定的 -e VAR_VALUE 的優先級更高;

ansible-playbook -e VAR_VALUE PLAYBOOK.yaml

組變量 :

可以在/etc/ansible/hosts中單獨向主機傳遞變量

方式一:

[websrv]
10.1.52.2 pkgname=naginx
10.1.52.3 pkgname=httpd

方式二:

[websrv]
10.1.52.2
10.1.52.3
[websrv:vars]
pkgname=memcached

Inventory還可以使用參數

用于定義ansible遠程連接目標主機時使用的屬性, 而非傳遞給playbook;

[websrv]

10.1.52.2 ansible_ssh_user=USER ansible_shh_pass=PASSWORD ansible_sudo_pass=SUDO_PASSWD

ansible_ssh_host

ansible_ssh_port

ansible_ssh_user

ansible_ssh_pass

ansible_sudo_pass

5. templates : 模板

文本文件, 內部嵌套有模板語言腳本(使用模板編程語言)

語法 :

字面量:

字符串 : 使用單引號或雙引號;

數字 : 整數, 浮點數

列表 : [item1, item2,…]

元組 : (item1,item2,…)

字典 : {key1:value1,key2:valuse2,…}

布爾值 : true/false

算數運算 :

+, -, * , /, //, %, **

比較操作 :

邏輯運算 : and, or, not

執行模板文件中的腳本, 并生成結果數據流, 需要使用template模塊;

template :

-a ""

src=

dest=

mode=

owner=

group=

注意 : 此模塊不能在命令行中使用, 只能在playbook中使用, 別模板語言一般為了表示使用 .j2 結尾;

示例:

- hosts: all
  remote_user: root
  tasks:
 - name: install nginx.conf
   template: src=/root/nginx.conf.j2 dest=/tmp/nginx.conf

并且要在需要使用template解析的文件中, 添加引用的參數, 例如: nginx.conf中添加

worker_processes {{ ansible_processor_vcpus }}

可以調用setup模塊中的變量名, 使用template將其解析為 value的值

完整安裝nginx并提供配置文件, 示例:

- hosts: ngxsrvs
  remote_user: root
  tasks:
  - name: install nginx
    yum: name=nginx state=latest
  - name: install nginx.conf
    template: src=/root/nginx.conf.j2 dext=/tmp/nginx.conf
    tags: ngxconf
    notify: reload nginx service
 - name: start nginx service 
   service: name=nginx state=started enabled=true
 handlers:
 - name: reload nginx service
   shell: "/usr/sbin/nginx -s reload"

6. 條件測試

when語句 : 在tasks中使用, jinja2的語法格式;

可以調用 setup 模塊的變量, 判斷后面的值是否符合條件;

示例 :

- hosts: all
  remote_user: root
  tasks:
  - name: install nginx 
    yum: name=nginx state=latest
  - name: service nginx.service restart
    service: name=nginx state=started
  when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6" 
  - name: systemctl start nginx
    shell: systemctl start nginx.service 
    when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"
  - name: install nginx.conf
    template: src=/root/nginx.conf.j2 dest=/tmp/nginx.conf
    tags: ngxconf
    notify: reload nginx
  handlers:
  - name: relaod nginx
    shell: "/usr/sbin/nginx -s reload"

7. 循環 : 迭代, 需要重復執行的任務;

對迭代項的引用, 固定變量名 "item", 使用with_items屬性給定要迭代的元素, 通過遍歷元素, 完成所有執行;

元素 : 列表, 字典

示例一:  基于字符串列表給出元素

- hosts: websrv
  remote_user: root
  tasks:
  - name: install packages
    yum: name={{ item }} state=latest
    with_items:
    - httpd
    - php
    - mariadb-server
    - php-mysql
    - sariadb-devel
    - php-devel
    - php-gd
    - php-mbstring

示例二:  基于字典列表給出元素

- hosts: websrv
  remote_user: root
  tasks:
  - name: create groups
    group: name={{ item }} state=present
    with_items:
    - group1
    - group2
    - group3
  - name: create users
    user: name={{ item.name }} group={{ item.group }} state=present
    with_items:
    - { name: user1, group: group1 }
    - { name: user2, group: group2 }
    - { name: user3, group: group3 }

示例三: 在CentOS6 和CentOS 7上分別安裝lamp;

- hosts: websrv
  remote_user: root
  tasks:
  - name: install lamp on CentOS 7
    when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"
    yum: name={{ item }} state=latest
    with_items:
    - httpd
    - mariadb-server
    - php
    - php-mysql
    - php-gd
    - php-mbstring
  - name: install lamp on CentOS 6
    when: ansible_distribution == "CnetOS" and ansible_distribution_major_version == "6"
    yum: name={{ item }} state=latest
    with_items:
    - httpd
    - mysql-server
    - php
    - php-mysql
    - php-gd
    - php-mbstring

8. 角色 : roles

以特定的層級目錄結構進行組織的tasks, variables, handlers, templates, files等;

role_NAME/

    files/ : 存放于copy或script等模塊調用的文件;

    tasks/ : 此目錄中至少應該有一個名為main.yml的文件, 用于定義各tasks; 其他的文件需要由main.uml進行"包含(include)"調用;

    handlers/ : 此目錄中至少應該有一個名為main.yml的文件, 用于定義各handlers; 其他的文件需要由main.uml進行"包含(include)"調用;

    vars/ : 此目錄中至少應該有一個名為main.yml的文件, 用于定義各variables; 其他的文件需要由main.uml進行"包含(include)"調用;

    templates/ : 存儲由templates模塊調用的模板文件;

    meta/ : 此目錄中至少應該有一個名為main.yml的文件, 定義當前角色特殊設定及其依賴關系; 其他的文件需要由main.uml進行"包含(include)"調用;

    default/ :  此目錄中至少應該有一個名為main.yml的文件, 用于定義默認變量;

路徑按照結構, 進行自包含, 不需要指定路徑, 程序會自動根據相對路徑進行查找文件;

示例:

(1) 在/etc/ansible/roles目錄下創建httpd, nginx, mariadb目錄, 在目錄下創建 files, tasks, handlers, vars, templates, meta, default目錄

mkdir -pv /etc/ansible/roles/{httpd,nginx,mariadb}/{files,tasks,handlers,vars,templates,meta,default}

(2) 在tasks目錄下創建任務文件

- name: copy nginx package
  copy: src=nginx.rpm dest=/tmp/nginx.rpm
  tags: cppkg
- name: install nginx
  yum: name=nginx.rpm state=latest
- name: install conf file
  templates: src={{ item.ngxconfj2 }} dest={{ item.ngxconf }}
  with_items:
  - { ngxconfj2: nginx.conf.j2, ngxconf: /etc/nginx/nginx.conf }
  - { ngxconfj2: default.conf.j2, ngxconf: /etc/nginx/conf.d/default.conf }
  tags: ngxconf
  notify: reload nginx service
- name: start nginx service
  shell: /usr/bin/systemctl start nginx

(3) 在files文件下存放nginx.rpm文件

(4) 在templates目錄下放置nginx.conf.j2和default.conf.j2文件

(5) 在vars目錄下新建main.yml文件, 存放templates目錄下放置配置文件中的變量和值

(6) 在/etc/ansible目錄下新建nginx.yml的playbook文件

- hosts: websrv
  remote_user: root
  roles: 
  - nginx

(7) 檢查語法和試運行

ansible-playbook –syntax-check nginx.yml

ansible-playbook –check nginx.yml

ansible-playbook nginx.yml

原創文章,作者:black_fish,如若轉載,請注明出處:http://www.www58058.com/57470

(0)
black_fishblack_fish
上一篇 2016-11-11
下一篇 2016-11-11

相關推薦

  • 遠程使用sshd連接不上服務器解決方案

    前些天在學習linux的時候CRT怎么也連接不上我的linux服務器了,整了半天,請教了一些高人才把這個問題解決,現在整理一下我的解決方案。 大家可以看到配置都正確但就是連不上。 通過查看得出原來是22端口拒絕~! 那么我就去查看22端口有沒有開啟 大家可以看到我的22端口也就是sshd服務并沒有開啟。 我去開啟我的sshd服務器,但是又出現了問題~! 隨后…

    Linux干貨 2016-03-28
  • linux進程和計劃任務

    內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、 安全功能等 進程管理:     系統優先級:數字越小,優先級越高    實時優先級: 99-0,值最大優先級最高    nice值:-20 到19 ,對應系統優先級100-139或99 Linux 內核:搶占式多任務  &nb…

    Linux干貨 2017-03-23
  • 那些年我們一起追過的緩存寫法(二)

    原文出處: 蘑菇先生   上次主要討論緩存讀寫這塊各種代碼實現。本篇是就上次的問題接著來,繼續看那些年我們各種緩存用法。 一:緩存預熱 上次有同學問過。在第一次加載時,我們的緩存都為空,怎么進行預熱。 單機Web情況下,一般我們使用RunTimeCache。相對于這種情況下: 1:我們可以在啟動事件里面刷新 1 2 3 4 vo…

    Linux干貨 2015-03-04
  • Linux的程序包管理,RPM,yum及編譯安裝簡介

    Linux的程序包管理,RPM,yum及編譯安裝簡介   Linux的程序包,指的是ELF格式的二進制應用程序文件所組成的軟件包。它一般由二進制文件、庫文件、軟件配置文件及幫助文件等組成。而對這些包進行管理的工具,主流分為兩種,在debian上,用的是apt-get管理deb包;在redhat上,主要用rpm作為軟件包管理工具。在這里,我簡單的介紹…

    Linux干貨 2016-05-29
  • 22期第七周課堂練習

    1、創建一個10G分區,并格式為ext4文件系統;        (1) 要求其block大小為2048, 預留空間百分比為2,   卷標為MYDATA, 默認掛載屬性包含acl;        (2)   掛載至/data/mydata目錄,要求掛載時禁止程…

    Linux干貨 2016-10-09
欧美性久久久久