Ansible Playbooks 介紹 和 使用 一

[TOC]node

Ansible Playbooks

Playbooks 組成部分:

  • Inventory
  • Modules
  • Ad Hoc Commands
  • Playbooks
    • Tasks: 任務,即調用模塊完成的某些操做
    • Variables: 變量
    • Templates: 模板
    • Handlers: 處理器,由某時間觸發執行的操做
    • Roles: 角色

YAML 介紹

YAML 是一個可讀性高的用來表達資料序列的格式。YAML參考了其餘多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言。
YAML Ain't Markup Language,即YAML不是XML。python

其特性:linux

  • 可讀性好
  • 和腳本語言的交互性好
  • 使用時限語言的數據類型
  • 有一個一直的信息模型
  • 易於實現
  • 能夠基於流來處理
  • 表達能力強,擴展型好

YAML 語法

YAML 的語法和其餘高階語言相似,而且能夠簡單表達清單、散列表、變量等數據結構。其結構(Structure)經過空格來展現,序列(Squence)裏的項用-來代辦,Map裏的鍵值對用:分割nginx

案例:web

name: John Smith
age: 41
gender: Male
spouse:
    name: Jane Smith
    age: 37
    gennder: Female
children:
    -   name: Jimmy Smith
        age: 17
        gender: Male
    -   name: Jenny Smith
        age: 13
        gender: Female

YAML 文件擴展名一般爲: .yaml,如 example.yamlshell

List

列表中的全部元素均使用-打頭,例如:apache

# A list of t asty fruits
- Apple
- Orange
- Strawberry
- Mango

Dictionary

字典經過key與value進行表示,例如:安全

# An exployee record
name: Example Developer
job: Developer
skill: Elite

也能夠將key:value 放置於{}中進行描述bash

# An exployee record
{name: Example Developer, job: Developer, skill: Elite}

Ansible 基礎元素

變量

變量名僅能由字母、數字和下劃線組成,且只能以字母開頭。數據結構

facts

facts是由正在通訊的遠程目標主機發揮的信息,這些信息被保存在ansible變量中,要獲取指定額遠程主機所支持的全部facts,可使用以下命令進行:

# ansible hostname -m setup

registre

把任務的輸出定義爲變量,而後用於其餘任務,示例以下:

tasks:
- shell: /usr/bin/foo
  register: foo_result
  ignore_errors: true

經過命令傳遞變量

在運行playbook的時候也能夠經過一些變量供playbook使用,示例以下:

ansible-playbook test.yml --extra-vars "hosts=www user=mageedu"

經過roles傳遞變量

當一個主機應用角色的時候能夠傳遞變量,而後在角色內使用這些變量,示例以下:

- hosts: webservs
  roles:
  - common
  - { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }

Inventory

ansible 的主要功能在於批量主機操做,爲了便捷地使用其中的部分主機,能夠在inventory file中將其分組命名。默認的Inventory file 爲 /etc/ansible/hosts。
inventory file 能夠有多個,且也能夠經過Dynamic Inventory來動態生成

主機變量

能夠在inventory中定義主機時爲其添加主機變量以便於在playbook中使用。例如:

[webservs]
10.0.0.65 http_port=80 maxRequestsPerChild=888
10.0.0.66 http_port=8080 maxRequestsPerChild=909

組變量

組變量是指賦予給特定組內全部主機上在playbook中可用的變量。例如:

[webservs:vars]
ntp_server=ntp.aliyun.com
nfs_server=nfs.aliyun.com

注意:[組名:vars] 組名中的:vars 是固定用法

組嵌套

inventory中,組還能夠包含其餘的組,而且也能夠像組中的主機指定變量。不過這些變量只能在ansible-playbook中使用,而不支持ansible。例如:

[apache]
http1.magedu.com
http2.magedu.com

[nginx]
nginx1.magedu.com
nginx2.magedu.com

[webservs:children]
apache
nginx

[webservs:vars]
ntp_server=ntp.magedu.com

注意::childer 一樣是固定用法

inventory 參數

ansible基於ssh連接inventory中指定的遠程主機時,還能夠經過參數指定其交互方式;這些擦桉樹以下所示:

  • ansible_ssh_host
  • ansible_ssh_port
  • ansible_ssh_user
  • ansible_ssh_pass
  • ansible_sudo_pass
  • ansible_connection
  • ansible_ssh_private_key_file
  • ansible_shell_type
  • ansible_python_interpreter
  • ansible_*_interpreter

編寫 ansible playbooks 劇本

playbook是由一個或多個play組成的列表。play的主要功能在於將事先歸併一組的主機裝扮成事先經過ansible中的tasks定義好的角色。從根據上來說,所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中,既可讓他們聯通起來按事先編排的機制同唱一臺大戲。下面是一個簡單的示例:

- hosts: webnodes
  vars:
    http_port: 80
    max_clients: 256
  remote_user: root
  tasks:
  - name: ensure apache is at the lastest version
    yum: name=httpd state=latest
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
  - name: restart apache
    service:name=httpd state=restarted

playbook 基礎組件

Hosts 和 Users

playbook 中的每個play的目的都是爲了讓某個或某些主機一某個指定的用戶執行任務。hosts用於指定要執行指定任務的主機,其可使一個或多個由冒號分割主機組;remote_user則用於指定遠程主機上的執行任務的用戶。例如上面示例中的:

- hosts: webnodes
  remote_user: root

不過,remote_user也可用於各task中,也能夠經過指定其經過sudo的方式在遠程主機上執行任務,其可用於play全局或某任務,甚至能夠在sudo時sudo_user指定sudo時切換的用戶。

- hosts: webnodes
  remote_user: mageedu
  tasks:
  - name: test connection
    ping:
    remote_user: mageedu
    sudo: yes

任務列表和action

  • play的主體部分是task list。task list中的個任務按次序逐個在hosts中指定的全部主機上執行,即在全部主機上完成第一個任務後再開始第二個。在運行playbook 時,若是中途發生錯誤,全部已執行任務都將會滾,所以,在更正playbook後從新執行一次便可。

  • task的目的是使用指定的參數執行模塊,而在模塊參數中可使用變量。模塊執行是冪等的,這意味着屢次執行是安全的,由於其結果均一致。

  • 每一個task都應該有其name,用於playbook的執行結果輸出,建議其內容儘量清晰地描述任務執行步驟,若是爲提供name,則action的結果將用於輸出

  • 定義task的可使用"action: module options" 或 "module: options" 的格式,推薦使用候着以實現向後兼容。若是action一行的內容過分,也使用在行首使用幾個空白字符進行換行

tasks:
- name: make sure apache is running
  service: name=htpd state=running

在衆多模塊中,只有command 和shell模塊僅須要給一個列表而無需使用"key=vale"格式,例如:

tasks:
- name: disable selinux
  command: /sbin/setenforce 0

若是命令或腳本的退出碼不爲零,可使用以下方式替代:

tasks:
- name: run this command and ignore the result
  shell: /usr/bin/somecommand || /bin/true
  ignore_errors: true

或者使用ignore_errors來忽略錯誤信息

tasks:
- name: run this command and ignore the result
  shell: /usr/bin/somecommand
  ignore_errors: true

playbook 案例 1

在全部的webservs組的主機上建立nginx用戶和用戶組
並模擬拷貝文件到dbservs中

[root@node01 ansible]# cat nginx.yml 
- hosts: webservs
  remote_user: root
  tasks:
  - name: create nginx group
    group: name=nginx system=yes gid=208
  - name: create nginx user
    user: name=nginx system=yes uid=208 group=nginx

- hosts: dbservs
  remote_user: root
  tasks:
  - name: copy file to dbservs
    copy: src=/etc/inittab dest=/tmp/inittab.ans

使用ansible-playbook命令執行:

[root@node01 ansible]# ansible-playbook nginx.yml 

PLAY [webservs] ***********************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************
ok: [10.0.0.65]

TASK [create nginx group] *************************************************************************************************
changed: [10.0.0.65]

TASK [create nginx user] **************************************************************************************************
changed: [10.0.0.65]

PLAY [dbservs] ************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************
ok: [10.0.0.66]

TASK [copy file to dbservs] ***********************************************************************************************
ok: [10.0.0.66]

PLAY RECAP ****************************************************************************************************************
10.0.0.65                  : ok=3    changed=2    unreachable=0    failed=0   
10.0.0.66                  : ok=2    changed=0    unreachable=0    failed=0

驗證: webservs的nginx用戶和組以及dbservs的/tmp/inittab.ans文件

[root@node01 ansible]# ansible webservs -a 'grep nginx /etc/passwd'
10.0.0.65 | CHANGED | rc=0 >>
nginx:x:208:208::/home/nginx:/bin/bash

[root@node01 ansible]# ansible webservs -a 'grep nginx /etc/group'
10.0.0.65 | CHANGED | rc=0 >>
nginx:x:208:

[root@node01 ansible]# ansible dbservs -a 'ls -l /tmp/inittab.ans'
10.0.0.66 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 511 Oct 12 10:38 /tmp/inittab.ans
相關文章
相關標籤/搜索