批處理工具Ansible高級(jí)用法 - 自動(dòng)化運(yùn)維研究

讀前請(qǐng)預(yù)習(xí): Ansible基本用法

劇本playbook的使用

當(dāng)需要執(zhí)行的任務(wù)有多個(gè)時(shí),需要一條一條編輯ansible命令,然后執(zhí)行,而且當(dāng)需要重復(fù)執(zhí)行時(shí),又要重新編輯執(zhí)行,這樣效率不高,因此ansible就可以利用playbook來完成將任務(wù)寫到一個(gè)YAML格式的文件中,然后利用ansible-playbook進(jìn)行調(diào)用該文件,從而實(shí)現(xiàn)了多條語句,可重復(fù)執(zhí)行的效果,類似shell腳本的效果,ansible的playbook要借助YAML文件來實(shí)現(xiàn),YAML文件擴(kuò)展名通常為.yaml或.yml

playbook的基礎(chǔ)組件:

  • hosts:運(yùn)行指定任務(wù)的而目標(biāo)主機(jī),多個(gè)主機(jī)用:冒號(hào)分隔
  • remote_user:在遠(yuǎn)程主機(jī)上執(zhí)行任務(wù)的用戶;可以全局指定,也可以單個(gè) * 任務(wù)指定
  • sudo_user:表示以sudo方式運(yùn)行任務(wù)時(shí),切換為哪個(gè)用戶身份運(yùn)行
  • tasks: 任務(wù)列表
  • Handlers: 在發(fā)生改變時(shí)執(zhí)行的操作
  • vars:變量的使用。一種為用戶自己定義的變量;一種為facts獲取的變量(即ansible crazyting2 -m setup查到的變量)

一個(gè)playbook小示例:

  1. 編寫playbook文件
[root@crazyting1 ~]# cat playbooktest.yml 
- hosts: crazyting2  #  主機(jī)
  remote_user: root      #   遠(yuǎn)程用戶
  tasks:                 #           任務(wù)
  - name: add group
    group: name=new state=present   #  組資源
  - name: add user
    user: name={{item}} group=new       # 用戶資源
    with_items: # 循環(huán) with_items with_nested with_dict with_random_choice
    - new1
    - new2
    - new3
- hosts: crazyting2  #  主機(jī)
  remote_user: root         # 遠(yuǎn)程用戶
  vars: # 定義變量
  - var1: "hello world!"
  tasks:   # 任務(wù)                    
  - name: file  
    file: src=/root/install.log dest=/tmp/install.log  state=link owner=nobody group=nobody # file組件
    notify: # 通知觸發(fā)handlers
    - log
    - log2
  handlers:
  - name: log 
    shell: echo "{{var1}} `date`" >> /tmp/install.log  
  - name: log2
    shell: echo "{{ansible_nodename}} `date`" >> /tmp/install.log  # 通過facts獲取的系統(tǒng)的變量
    when: ansible_nodename == "crazyting2" # 條件判斷
  1. 測(cè)試playbook腳本
[root@crazyting1 ~]# ansible-playbook --check playbooktest.yml 

PLAY [crazyting2] ****************************************************************************************************************************************

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

TASK [add group] *****************************************************************************************************************************************
changed: [crazyting2]

TASK [add user] ******************************************************************************************************************************************
changed: [crazyting2] => (item=new1)
changed: [crazyting2] => (item=new2)
changed: [crazyting2] => (item=new3)

PLAY [crazyting2] ****************************************************************************************************************************************

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

TASK [file] **********************************************************************************************************************************************
changed: [crazyting2]

RUNNING HANDLER [log] ************************************************************************************************************************************
skipping: [crazyting2]

RUNNING HANDLER [log2] ***********************************************************************************************************************************
skipping: [crazyting2]

PLAY RECAP ***********************************************************************************************************************************************
crazyting2                 : ok=5    changed=3    unreachable=0    failed=0 
  1. 運(yùn)行playbook
[root@crazyting1 ~]# ansible-playbook  playbooktest.yml 

PLAY [crazyting2] ****************************************************************************************************************************************

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

TASK [add group] *****************************************************************************************************************************************
changed: [crazyting2]

TASK [add user] ******************************************************************************************************************************************
changed: [crazyting2] => (item=new1)
changed: [crazyting2] => (item=new2)
changed: [crazyting2] => (item=new3)

PLAY [crazyting2] ****************************************************************************************************************************************

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

TASK [file] **********************************************************************************************************************************************
changed: [crazyting2]

RUNNING HANDLER [log] ************************************************************************************************************************************
changed: [crazyting2]

RUNNING HANDLER [log2] ***********************************************************************************************************************************
changed: [crazyting2]

PLAY RECAP ***********************************************************************************************************************************************
crazyting2                 : ok=7    changed=5    unreachable=0    failed=0 
  1. 到crazyting2檢查一下
[root@crazyting2 ~]# tail -2 /tmp/install.log 
*** FINISHED INSTALLING PACKAGES ***hello world! Tue Feb 11 22:58:43 CST 2020
crazyting2 Tue Feb 11 22:58:43 CST 2020
[root@crazyting2 ~]# cat /etc/group |grep new
new:x:500:
[root@crazyting2 ~]# grep new  /etc/shadow 
new1:!!:18303:0:99999:7:::
new2:!!:18303:0:99999:7:::
new3:!!:18303:0:99999:7:::

Ansible角色

角色是一種官方提供開發(fā)標(biāo)準(zhǔn)和規(guī)范。按照該目錄結(jié)構(gòu)搭建ansible playbook,從而達(dá)到各組件的分離和解耦。使用role組織playbook是官方提供的最佳實(shí)踐。

完整項(xiàng)目的結(jié)構(gòu)如下:

production                # 關(guān)于生產(chǎn)環(huán)境服務(wù)器的清單文件
stage                     # 關(guān)于 stage 環(huán)境的清單文件

group_vars/
   group1                 # 這里我們給特定的組賦值
   group2                 # ""
host_vars/
   hostname1              #  如果系統(tǒng)需要特定的變量,把它們放置在這里.
   hostname2              # ""

library/                  # 如果有自定義的模塊,放在這里(可選)
filter_plugins/           # 如果有自定義的過濾插件,放在這里(可選)

site.yml          # master playbook 主 playbook
webservers.yml    # playbook for webserver tier Web 服務(wù)器的 playbook
fooservers.yml    # playbook for dbserver tier 數(shù)據(jù)庫服務(wù)器的 playbook
roles/
   common/
     files/         # 存放文件和腳本,copy模塊文件搜索路徑
     templates/     # 模版存放路徑
     tasks/         # 存放playbooks路徑
     handlers/      # notify調(diào)用部分playbook存放路徑
     vars/          # roles內(nèi)變量存放路徑
     defaults/      # 默認(rèn)尋找路徑
     meta/          # 存放元數(shù)據(jù),如作者信息,角色信息等
   webservers/
     files/
     templates/
     tasks/          
     handlers/
     vars/
     defaults/
     meta/

編寫一個(gè)nginx自動(dòng)安裝示例:

[root@crazyting1 ~]# mkdir -p ~/ansible/roles/nginx/{defaults,files,handlers,meta,tasks,templates,vars}
[root@crazyting1 ansible]# cat beta
[crazyting]
crazyting2

[root@crazyting1 ansible]# cat roles/nginx/templates/nginx.conf.j2 | head
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes {{ansible_processor_vcpus*2}};
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.

[root@crazyting1 ansible]# cat roles/nginx/tasks/group.yml 
- name: create group
  group: name=nginx
[root@crazyting1 ansible]# cat roles/nginx/tasks/user.yml 
- name: create user
  user: name=nginx group=nginx system=yes shell=/sbin/nologin
[root@crazyting1 ansible]# cat roles/nginx/tasks/yum.yml 
- name: install nginx
  yum: name=nginx
[root@crazyting1 ansible]# cat roles/nginx/tasks/templ.yml 
- name: copy conf
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
[root@crazyting1 ansible]# cat roles/nginx/tasks/start.yml 
- name: start
  service: name=nginx state=started enabled=yes
[root@crazyting1 ansible]# cat roles/nginx/tasks/main.yml 
- include: group.yml
- include: user.yml
- include: yum.yml
- include: templ.yml
- include: start.yml

[root@crazyting1 ansible]# cat sit.yml 
- hosts: crazyting
  remote_user: root
  roles:
    - role: nginx       #制定role角色名,就是roles下的目錄

[root@crazyting1 ~]# tree ansible/
ansible/
├── beta
├── roles
│   └── nginx
│       ├── defaults
│       ├── files
│       ├── handlers
│       ├── meta
│       ├── tasks
│       │   ├── group.yml
│       │   ├── main.yml
│       │   ├── restart.yml
│       │   ├── start.yml
│       │   ├── templ.yml
│       │   ├── user.yml
│       │   └── yum.yml
│       ├── templates
│       │   └── nginx.conf.j2
│       └── vars
└── sit.yml

[root@crazyting1 ansible]# ansible-playbook -i beta -C sit.yml 

PLAY [crazyting] ***************************************************************************************************************************************************************************

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

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

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

TASK [nginx : install nginx] ***************************************************************************************************************************************************************
changed: [crazyting2]

TASK [nginx : copy conf] *******************************************************************************************************************************************************************
changed: [crazyting2]

TASK [nginx : start] ***********************************************************************************************************************************************************************
changed: [crazyting2]

PLAY RECAP *********************************************************************************************************************************************************************************
crazyting2                 : ok=6    changed=5    unreachable=0    failed=0 

執(zhí)行并檢查

[root@crazyting1 ansible]# ansible crazyting2 -m setup | grep vcpus
        "ansible_processor_vcpus": 2, 
[root@crazyting1 ansible]# ansible-playbook -i beta sit.yml 

PLAY [crazyting] ***************************************************************************************************************************************************************************

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

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

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

TASK [nginx : install nginx] ***************************************************************************************************************************************************************
changed: [crazyting2]

TASK [nginx : copy conf] *******************************************************************************************************************************************************************
changed: [crazyting2]

TASK [nginx : start] ***********************************************************************************************************************************************************************
changed: [crazyting2]

PLAY RECAP *********************************************************************************************************************************************************************************
crazyting2                 : ok=6    changed=5    unreachable=0    failed=0   

[root@crazyting2 ~]# service nginx status
nginx: unrecognized service
[root@crazyting2 ~]# service nginx status
nginx (pid  26134) is running...
[root@crazyting2 ~]# grep nginx /etc/shadow
nginx:!!:18304::::::
[root@crazyting2 ~]# grep nginx /etc/group
nginx:x:501:
[root@crazyting2 ~]# head /etc/nginx/nginx.conf 
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes 4;

參考資料:
Ansible之Playbook詳解、案例
Ansible角色詳解
Ansible中文權(quán)威指南(建議看下playbook最佳實(shí)踐)
Ansible 自動(dòng)化運(yùn)維工具簡(jiǎn)單入門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容