溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Ansible的playbook的基本使用與快速入門

發(fā)布時間:2020-06-21 15:02:07 來源:網(wǎng)絡(luò) 閱讀:407 作者:wx5c1cfd6e22842 欄目:系統(tǒng)運維

1.使用playbook有什么好處
2.認識playbook(自動部署nginx)(自動部署docker-ce社區(qū)版)
3.YAML語法
4.playbook文件結(jié)構(gòu)
5.在變更時執(zhí)行操作(handlers)
6.任務(wù)控制(tags)
7.playbook文件調(diào)試
8.案例:自動部署tomcat
9.Playbook變量定義與使用
10.playbok文件復(fù)用
11.流程控制
12.jinja模版渲染配置文件

1. 使用playbook有什么好處

Ansible真正的能力在于使用playbook,也就稱為劇本
當(dāng)我們在某個目錄下執(zhí)行某個命令的時候,那么我們可以使用ansible的ad hoc的模式快速執(zhí)行,而無不虛編寫文件或者劇本,但是對于配置的管理和應(yīng)用的部署,通常有很多的操作,單獨的去寫ad hoc命令麻煩很多,而且ad hoc適用于簡單命令的執(zhí)行,所以我們使用playbook去完成,如果ansible是工作中用到的工具,那么ploybook就是相當(dāng)于你使用ansible的說明書,而你的主機就是原材料,寫playbook就像寫說明書一樣,它是一個按順序執(zhí)行的一個過程,playbook和ad hoc完全不是一種模式,并且功能強大

Playbook的特點
易讀的編排語言:它是用最主流的yaml格式去編寫的來實現(xiàn)應(yīng)用的編排,非常適合配置和應(yīng)用部署,也非常適合部署復(fù)雜的任務(wù),我們可以通過聲明式的內(nèi)容將復(fù)雜的工作通過playbook進行編排。

這個—syntax-check是檢查playbook的語法

[root@ansible playbook-test]# ansible-playbook nginx.yaml   --syntax-check 

playbook: nginx.yaml
[root@ansible playbook-test]# vim nginx.yaml 
[root@ansible playbook-test]# cat nginx.yaml 

---
 - hosts: webservers
  vars:
    hello: Ansible
  tasks:
  - name: Add repo
    yum_repository:
      name: nginx
      description: nginx repo
      baseurl: http://nginx.org/packages/centos/7/$basearch/
      gpgcheck: no
      enabled: 
  - name: Install nginx
    yum:
      name: nginx
      state: latest
  - name: Copy nginx configuration file
    copy:
      src: ./site.conf
      dest: /etc/nginx/conf.d/site.conf
  - name: Start nginx
    service:
      name: nginx
      state: started
  - name: Create wwwroot directory
    file:
      dest: /var/www/html
      state: directory
  - name: Create test page index.html
shell: echo "hello {{hello}}" > /var/www/html/index.html
[root@ansible playbook-test]# ls
nginx.yaml  site.conf

[root@ansible playbook-test]# vim site.conf
server {
    listen 80;
    server_name devops;
    location / {
        root   /var/www/html;
index index.html; }
}

執(zhí)行playbook
[root@ansible playbook-test]# ansible-playbook nginx.yaml
查看進程已經(jīng)啟動

[root@ansible playbook-test]# ansible webservers -m shell -a "ps -ef |grep nginx"
10.4.7.22 | SUCCESS | rc=0 >>
root      10713      1  0 16:46 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     10714  10713  0 16:46 ?        00:00:00 nginx: worker process
root      10849  10848 10 16:49 pts/1    00:00:00 /bin/sh -c ps -ef |grep nginx
root      10851  10849  0 16:49 pts/1    00:00:00 grep nginx

10.4.7.21 | SUCCESS | rc=0 >>
root      10953      1  0 16:46 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     10954  10953  0 16:46 ?        00:00:00 nginx: worker process
root      11088  11087  0 16:49 pts/1    00:00:00 /bin/sh -c ps -ef |grep nginx
root      11090  11088  0 16:49 pts/1    00:00:00 grep nginx

批量部署docker-ce社區(qū)版

這里運用的模塊就shell模塊和service,還是很簡單的。


---
- hosts: webservers
  gather_facts: no
  remote_user: root

  tasks:
  - name: install packages
    shell: yum -y install yum-utils device-mapper-persistent-data lvm2

  - name: docker packages
    shell: wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  - name: install docker-ce
    shell: yum -y install docker-ce

  - name: daocloud speed up
    shell: curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

  - name: systemctl start docker
    service: name=docker state=started

測試查看是否安裝成功

[root@ansible ~]# ansible webservers -m shell -a "docker -v"
10.4.7.21 | SUCCESS | rc=0 >>
Docker version 19.03.5, build 633a0ea

10.4.7.22 | SUCCESS | rc=0 >>
Docker version 19.03.5, build 633a0ea

YAML語法格式
縮進表示層級關(guān)系
不支持制表符“tab” 縮進
通常開頭縮進2個空格
字符后縮進1個空格,如冒號,逗號等
“---”表示YAML格式,一個文件的開頭
“#”注釋
在變更時執(zhí)行操作(handlers)處理器
主要用于當(dāng)你出來某個操作變更時,它幫你觸發(fā)另一個任務(wù)

  • hosts: webservers
    gather_facts: no
    這個會收集列表主機的信息,會很耗時間,一般就是禁用掉,這樣的話就提高我們playbook的效率

自動部署tomcat
1. 安裝jdk
2. 下載tomcat包
3. 解壓tomcat
4. 啟動

安裝tomcat

---
- hosts: webservers
  gather_facts: no
  vars:
    tomcat_version: 9.0.29
    tomcat_install_dir: /usr/local

  tasks:
    - name: Install java-1.8.0-openjdk.x86_64
      shell: yum -y install java-1.8.0-openjdk.x86_64 state=present

    - name: Download tomcat
      get_url: url=http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.29/bin/apache-tomcat-9.0.29.tar.gz dest=/tmp
    - name: Unarchive tomcat-{{ tomcat_version }}.tar.gz
      unarchive:
        src: /tmp/apache-tomcat-{{ tomcat_version }}.tar.gz
        dest: "{{ tomcat_install_dir }}"
        copy: no

    - name: Start tomcat
      shell: cd {{ tomcat_install_dir }} &&
             mv apache-tomcat-{{ tomcat_version }} tomcat8 &&
             cd tomcat8/bin && nohup ./startup.sh &
[root@ansible tomcat-playbook]# ansible-playbook tomcat.yaml
[root@ansible tomcat-playbook]# ansible webservers -m shell -a "ps -ef |grep tomcat"

Playbook變量定義與使用

  1. 命令行
  2. 在inventory中定義
  3. 在playbook中定義
  4. 在role中定義
  5. 注冊變量(register)
  6. 系統(tǒng)信息變量(facts)

命令行定義變量
列出主要的變量信息

[root@ansible tomcat-playbook]# ansible-playbook --list-tags tomcat.yaml 

playbook: tomcat.yaml

  play #1 (webservers): webservers  TAGS: []
      TASK TAGS: []
[root@ansible tomcat-playbook]# ansible-playbook --list-tasks tomcat.yaml 

playbook: tomcat.yaml

  play #1 (webservers): webservers  TAGS: []
    tasks:
      Install java-1.8.0-openjdk.x86_64 TAGS: []
      Download tomcat   TAGS: []
      Unarchive tomcat-{{ tomcat_version }}.tar.gz  TAGS: []
      Start tomcat  TAGS: []

debug模塊在執(zhí)行期間打印語句,并且可用于調(diào)試變量或表達式,而不必停止playbook。

[root@ansible tomcat-playbook]# vim 1.yaml

---
- hosts: webservers
  gather_facts: no
  remote_user: root

  tasks:
  - name: test var
    debug: msg="{{work_dir}}"
[root@ansible tomcat-playbook]# ansible-playbook 1.yaml -e work_dir=/usr/local

定義這個變量也有一定的要求,變量名是要以字母為開頭

還有一種在inventory中定義
在/etc/ansible/hosts去定義變量,為一組主機或者多個主機傳遞不同的變量
也可以單獨寫到/etc/ansible/group_vars/webservers.yml下,它默認會讀取你哪個組里面的變量,以yml的模式更方便
http_port: 8090
server_name: xiabanle


[root@ansible group_vars]# ansible webservers -a "echo {{http_port}}"
10.4.7.22 | SUCCESS | rc=0 >>
8090

10.4.7.21 | SUCCESS | rc=0 >>
8090

[root@ansible group_vars]# ansible webservers -a "echo {{server_name}}"
10.4.7.22 | SUCCESS | rc=0 >>
xiabanle

10.4.7.21 | SUCCESS | rc=0 >>
xiabanle

在playbook使用debug模塊去定義變量

---
- hosts: webservers
  gather_facts: no
  remote_user: root
  vars:
    - work_dir: /usr/local
    - nginx_version: 1.16

  tasks:
  - name: Install nginx
debug: msg="{{work_dir}}/nginx/{{nginx_version}}"
[root@ansible tomcat-playbook]# ansible-playbook 1.yaml --syntax-check

playbook: 1.yaml
[root@ansible tomcat-playbook]# ansible-playbook 1.yaml

使用file模塊創(chuàng)建文件

---
- hosts: webservers
  gather_facts: no
  remote_user: root
  vars:
    - work_dir: /opt
    - nginx_version: 1.11

  tasks:
  - name: create dir
    file: "dest={{work_dir}}/nginx/{{nginx_version}} state=directory"

注冊變量—register
注冊變量就是將你某個任務(wù)執(zhí)行的結(jié)果保存到一個變量中,這樣的話就是能動態(tài)的獲取一個變量,例如執(zhí)行完一個任務(wù),返回有個狀態(tài),那么希望根據(jù)這個狀態(tài)異步處理,因為之前的變量由于對應(yīng)好了,很難知道這次獲取的什么變量。
這里有個debug就是專門調(diào)試變量用的,這里時創(chuàng)建文件的同時動態(tài)定義文件的時間
一般這種就是啟動兩個服務(wù),這兩個服務(wù)是有依賴關(guān)系的,只有啟動第一個服務(wù),第二個才能啟動起來,那這種情況下,就可以在啟動服務(wù)下加一個注冊變量,如果第一個服務(wù)啟動的時候會有pid,或者有其他的輸出然后用到定義的注冊變量。

---
- hosts: webservers
  gather_facts: no
  remote_user: root
  vars:
    - work_dir: /opt

  tasks:
    - name: register var
      command: date +"%F %T"
      register: datetime

    - name: touch file
      #debug: msg={{datetime}}
      file: dest=/tmp/r_{{datetime.stdout}} state=touch

系統(tǒng)信息變量(fasts
以系統(tǒng)變量調(diào)用主機名/主機IP并創(chuàng)建文件
這個可以通過set up去調(diào)用,來查看我們的ansible的接口api

[root@ansible test]# ansible webservers -m setup

---
- hosts: webservers
  gather_facts: yes
  remote_user: root

  tasks:
  - name: touch file
    file: dest=/tmp/devops_{{ansible_hostname}} state=touch

playbok文件復(fù)用
將我們的文件進行復(fù)用,可以使用playbook中的incloud_tasks和import_tasks導(dǎo)入進來,這樣的好處就是,當(dāng)我們?nèi)懸粋€比較大的playbook時,可以將它分解成很多小的任務(wù),分解成小的任務(wù)之后呢,就能在其他的地方引用,第二個好處就是能組織playbook這些功能模塊,如果要寫一個大的劇本,可能是上百行,就不太好維護管理了,所以就有了include_tasks和import_tasks的實現(xiàn)來完成這些需求
Include和import的區(qū)別
都是導(dǎo)入文件的
Include(動態(tài)):在運行時導(dǎo)入
? --list-tags, --list-tasks 不會顯示到輸出
? 不能使用notify觸發(fā)來自include內(nèi)處理程序名稱(handlers)

Import*(靜態(tài)) :在playbook解析時預(yù)先導(dǎo)入,就是在playbook之前提前把預(yù)先的就導(dǎo)入進來了,
? 不能與循環(huán)一起使用
? 將變量用于目標(biāo)文件或角色名稱時,不能使用inventory(主機/主機組等)中的變量
復(fù)用案例:
安裝lnmp/lnmt
只需要將—import調(diào)用使用的的那個yaml就可以了

vim lnmp.yaml

---
 - import_playbook: nginx.yaml
 - import_playbook: mysql.yaml
 - import_playbook: php.yaml

vim nginx.yaml

---
- hosts: webservers
  gather_facts: no
  remote_user: root

  tasks:
  - name: Install nginx
    debug: msg="install nginx ... "  
[root@ansible web]# ansible-playbook lnmp.yaml   

Import導(dǎo)入的是playbook,而include的是導(dǎo)入的任務(wù)文件

[root@ansible web]# ansible-playbook test.yaml

---
- hosts: webservers
  gather_facts: no
  remote_user: root

  tasks:
  - name: task1
    debug: msg="test1"

  - name: task2
    debug: msg="test2"

但是部署的任務(wù)這個tasks,任務(wù)比較多時就可以進行分解,可以分成獨立的文件,例如有兩個任務(wù),我將第一個tasks分解成一個文件,第二個分解成一個文件用include再導(dǎo)入進去

vim test.yaml

---
- hosts: webservers
  gather_facts: no
  remote_user: root

  tasks:
  - include_tasks: task1.yaml
  - include_tasks: task2.yaml

vim task1.yaml

---
- name: tasks1
  debug: msg="test1"
vim task2.yaml

---
- name: tasks2
  debug: msg="test2"

流程控制
循環(huán)
批量創(chuàng)建用戶/文件/拷貝文件也可以使用

- name: create file
  file: path=/tmp/{{item}} state=touch
  with_items:
      - "1.txt"
      - "2.txt"
      - "3.txt"
      - "4.txt"
執(zhí)行效果
[root@hdss7-200 test-roles]# ansible-playbook -i hosts site.yaml --tags nginx

PLAY [roles] ***************************************************************************************************

TASK [nginx : create file] *************************************************************************************
changed: [10.4.7.22] => (item=1.txt)
changed: [10.4.7.22] => (item=2.txt)
changed: [10.4.7.22] => (item=3.txt)
changed: [10.4.7.22] => (item=4.txt)

PLAY RECAP *****************************************************************************************************
10.4.7.22                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
常用循環(huán)語句:

Ansible的playbook的基本使用與快速入門
比如拷貝文件

- name: copy html
  copy: src=/tmp/{item}} dest=/tmp
  with_items:
      - "a.html"
      - "b.html"
      - "c.html"

或者通配符,像一些拷貝一些目錄的tar.gz的壓縮包的時候比如比較多的時候就會用到可以使用fileglob,或者item,進行for循環(huán),進行批量執(zhí)行,簡化操作步驟。

- name: copy html
  copy: src={{item}} dest=/tmp
  with_fileglob:
      - "/tmp/*.html"

模版
比如部署一個應(yīng)用,nginx,etcd,這些都有自己的配置文件,就比如將nginx,虛擬主機的配置文件,渲染到我們的nginx上,就可以使用template,這個模塊就專門支持jr模版
這里定義j2的模版,然后拷貝這個文件過去進行渲染

[root@hdss7-200 test-roles]# cat /tmp/nginx.conf 
{% set domain_name = domain %}
server {
   listen 80;
    server_name {{ domain_name }};
    location / {
         root /usr/share/html;

    }
}

定義的變量,進行傳遞

[root@hdss7-200 test-roles]# cat group_vars/roles.yaml 
domain: www.xxxxx.com

定義的任務(wù)類型

- name: vire hosts
  template: src=/tmp/nginx.conf dest=/etc/nginx/conf.d/

比如再傳遞端口的變量,在jinja里使用ansible的變量之間{{ }}去使用

[root@hdss7-200 test-roles]# cat /tmp/nginx.conf 
{% set domain_name = domain %}
server {
   listen {{ http_port }};
    server_name {{ domain_name }};
    location / {
         root /usr/share/html;

    }
}

我在ansible去定義這個變量

[root@hdss7-200 test-roles]# cat group_vars/roles.yaml 
domain: "www.maidi.com"
http_port: "80"

執(zhí)行成功會將使用j2的模版將我們的配置文件拷貝過來,我們通過j2的模版和ansible定義變量就可以渲染很多我們的功能和需求

[root@hdss7-22 conf.d]# cat nginx.conf 
server {
   listen 80;
    server_name www.maidi.com;
    location / {
         root /usr/share/html;

    }
}
向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI