1. 程式人生 > >第一百一十天 : ansible-playbook 使用詳解

第一百一十天 : ansible-playbook 使用詳解

PlayBook:

核心元素:

Tasks:任務,由模組定義的操作的列表;
Variables:變數
Templates:模板,即使用了模板語法的文字檔案;
Handlers:由特定條件觸發的Tasks;
Roles:角色;
playbook的基礎元件:

Hosts:執行指定任務的目標主機;
remote_user:在遠端主機以哪個使用者身份執行;
sudo_user:非管理員需要擁有sudo許可權;
tasks:任務列表

模組,模組引數:

格式:

(1) action: module arguments
(2) module: arguments
核心元素:

Tasks:任務,由模組定義的操作的列表;
Variables:變數
Templates:模板,即使用了模板語法的文字檔案;
Handlers:由特定條件觸發的Tasks;
Roles:角色;

playbook的基礎元件:

Hosts:執行指定任務的目標主機;
remote_user:在遠端主機以哪個使用者身份執行;
sudo_user:非管理員需要擁有sudo許可權;
tasks:任務列表

模組,模組引數:
格式:

(1) action: module arguments
(2) module: arguments

示例1:

- 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: websrvs
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd
- name: start httpd service
service: name=httpd state=started

執行playbook,使用ansible-playbook命令
(1) 檢測語法
ansible-playbook –syntax-check /path/to/playbook.yaml
(2) 測試執行
ansible-playbook -C /path/to/playbook.yaml
–list-hosts
–list-tasks
–list-tags
(3) 執行
ansible-playbook /path/to/playbook.yaml
-t TAGS, –tags=TAGS
–skip-tags=SKIP_TAGS
–start-at-task=START_AT

handlers:由特定條件觸發的Tasks;
呼叫及定義方式:

tasks:
- name: TASK_NAME
  module: arguments
  notify: HANDLER_NAME
handlers:
- name: HANDLER_NAME
  module: arguments

示例:

- hosts: websrvs
  remote_user: root
  tasks:
  - name: install httpd package
    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

tags:給指定的任務定義一個呼叫標識;

- name: NAME
  module: arguments
  tags: TAG_ID

Variables:
型別:
內建:
(1) facts
自定義:
(1) 命令列傳遞;
-e VAR=VALUE
(2) 在hosts Inventory中為每個主機定義專用變數值;
(a) 向不同的主機傳遞不同的變數 ;
IP/HOSTNAME variable_name=value
(b) 向組內的所有主機傳遞相同的變數 ;
[groupname:vars]
variable_name=value
(3) 在playbook中定義
vars:
– var_name: value
– var_name: value

(4) Inventory還可以使用引數:
用於定義ansible遠端連線目標主機時使用的屬性,而非傳遞給playbook的變數;
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass

(5) 在角色呼叫時傳遞
roles:
– { role: ROLE_NAME, var: value, …}

變數呼叫:
{{ var_name }}

Templates:模板
文字檔案,內部巢狀有模板語言指令碼(使用模板語言編寫)

Jinja2 is a template engine written in pure Python. It provides a Django inspired non-XML syntax but supports inline expressions and an optional sandboxed environment.

語法:
字面量:
字串:使用單引號或雙引號;
數字:整數、浮點數;
列表:[item1, item2, …]
元組:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布林型:true/false

算術運算:
+, -, , /, //, %, *

比較操作:
==, !=, >, <, >=, <=

邏輯運算:and, or, not

執行模板檔案中的指令碼,並生成結果資料流,需要使用template模組;

template:
-a ”“
src=
dest=
mode=
onwer=
group=

注意:此模板不能在命令列使用,而只能用於playbook;

示例:

- hosts: ngxsrvs
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
  - name: install conf file
    template: src=/root/nginx.conf.j2 dest=/etc/nginx/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

條件測試:
when語句:在tasks中使用,Jinja2的語法格式;

- hosts: all
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
  - name: start nginx service on CentOS6
    shell: service nginx start
    when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
  - name: start nginx service
    shell: systemctl start nginx.service
    when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"

迴圈:迭代,需要重複執行的任務;
對迭代項的引用,固定變數名為”item”,使用with_item屬性給定要迭代的元素;
元素:列表
字串
字典

基於字串列表給出元素示例:


- hosts: websrvs
  remote_user: root
  tasks:
  - name: install packages
    yum: name={{ item }} state=latest
    with_items:
     - httpd
      - php
      - php-mysql
      - php-mbstring
      - php-gd

基於字典列表給元素示例:

- hosts: all
  remote_user: root
  tasks:
  - name: create groups
    group: name={{ item }} state=present
    with_items:
   - groupx1
    - groupx2
    - groupx3
    - name: create users
    user: name={{ item.name }} group={{ item.group }} state=present
    with_items:
    - {name: 'userx1', group: 'groupx1'}
    - {name: 'userx2', group: 'groupx2'}
    - {name: 'userx3', group: 'groupx3'}

角色:roles
以特定的層級目錄結構進行組織的tasks、variables、handlers、templates、files等;
role_name/
files/:儲存由copy或script等模組呼叫的檔案;
tasks/:此目錄中至少應該有一個名為main.yml的檔案,用於定義各task;其它的檔案需要由main.yml進行“包含”呼叫;
handlers/:此目錄中至少應該有一個名為main.yml的檔案,用於定義各handler;其它的檔案需要由main.yml進行“包含”呼叫;
vars/:此目錄中至少應該有一個名為main.yml的檔案,用於定義各variable;其它的檔案需要由main.yml進行“包含”呼叫;
templates/:儲存由template模組呼叫的模板文字;
meta/:此目錄中至少應該有一個名為main.yml的檔案,定義當前角色的特殊設定及其依賴關係;其它的檔案需要由main.yml進行“包含”呼叫;
default/:此目錄中至少應該有一個名為main.yml的檔案,用於設定預設變數;

在playbook中呼叫角色的方法:

- hosts: HOSTS
  remote_user: USERNAME
  roles:
 - ROLE1
  - ROLE2
  - { role: ROLE3, VARIABLE: VALUE, ...}
  - { role: ROLE4, when: CONDITION }

部落格作業:以上所有內容;
實戰作業:
(1) 主/備模型的keepalived+nginx;
(2) httpd+php+php-mysql;
(3) mysql-server或mariadb-server;
擁有testdb庫,並允許testuser對其擁有所有許可權;