大數據運維環境下ansible-playbook應用案例

一、批量更改主機名並生成本地解析

在大數據運維環境下,對主機名要求比較嚴格,因此對大數據節點的主機名要進行統一規劃,而後集中設置,若是本地沒有創建DNS解析服務器,還須要對每一個節點添加本地解析,也就是將每一個節點的ip和主機名的對應關係添加到/etc/hosts文件中。要解決這兩個問題,只須要兩個playbook腳本便可自動完成。html

要批量更改每一個節點的主機名,首先須要修改ansible中/etc/ansible/hosts文件內容,添加以下配置:node

[hostall]
213.229   hostname=namenodemaster
213.230   hostname=slave001
213.231   hostname=slave002

這裏定義了一個名爲hostall的主機組,組中有三臺主機,每一個主機IP後面跟了一個hostname變量,變量後面就是定義好的主機名,而這個變量能夠在playbook腳本中直接引用。shell

接下來就能夠編寫playbook腳本了,內容以下:服務器

- hosts: hostall
  remote_user: root
  tasks:
    - name: change name
      shell: "echo {{hostname}} > /etc/hostname"
    - name:
      shell: hostname {{hostname}}

這個腳本中,變量{{hostname}}以及值就是在/etc/ansible/hosts文件中定義的「hostname=namenodemaster」這部份內容。經過使用shell模塊,實現將定義好的主機名添加到每一個遠程主機的/etc/hostname文件中(限於RHEL/Centos7/8系統),而後執行hostname命令使其生效。運維

每一個主機名修改完畢後,還須要構建一個本地解析文件(IP和主機名對應的文件),而後傳到每一個遠程主機上,要實現這個功能,能夠編寫以下playbook腳本,內容以下:ssh

- hosts: hostall
  remote_user: root
  roles:
  - roles
  tasks:
   - name: add localhost
     local_action: shell echo "127.0.0.1   localhost" > {{AnsibleDir}}/roles/templates/hosts.j2
     run_once: true
   - set_fact: ipaddress={{hostvars[inventory_hostname].ansible_default_ipv4.address}}
   - set_fact: hostname={{hostvars[inventory_hostname].ansible_facts.hostname}}
   - name: add host record
     local_action: shell echo {{ipaddress}} {{hostname}} >> {{AnsibleDir}}/roles/templates/hosts.j2
   - name: copy hosts.j2 to allhost
     template: src={{AnsibleDir}}/roles/templates/hosts.j2 dest=/etc/hosts

這個playbook中,使用了角色中的變量,因此要了解下咱們這個ansible的默認目錄結構,以下圖所示:
大數據運維環境下ansible-playbook應用案例ide

咱們的程序安裝在/etc/ansible命令下,在這個目錄中有三個子目錄,分別是files 、templates 和roles,files目錄主要是存放一些要拷貝的遠程主機的程序文件,templates 目錄下存放的是一些配置好的模板文件,這些模板文件會統一拷貝到遠程主機中,最後,還有一個roles目錄,此目錄下咱們建立了一個main.yml文件,用來定義角色變量,main.yml中變量定義方式以下:工具

server1_hostname: 172.16.213.229
server2_hostname: 172.16.213.230
server3_hostname: 172.16.213.231
AnsibleDir: /etc/ansible
BigdataDir: /opt/bigdata
hadoopconfigfile: /etc/hadoop

其中,每行內容中冒號前面的就是變量名,後面的內容是變量的值,定義變量後,就能夠在playbook中進行引用了。oop

最後,再回到上面這個playbook文件中,因爲要使用角色變量,因此引入了roles關鍵字,接下來,在tasks任務中,首先使用了local_action模塊,在管理機上生成了一個模板文件hosts.j2,注意這裏面的變量{{AnsibleDir}}就是在main.yml中定義好的,run_once表示這個本地shell僅僅執行一次,接着經過set_fact定義了兩個變量ipaddress和hostname,這兩個變量都從ansible內置變量中獲取具體的值,而後將獲取到的ipaddress和hostname值寫入管理機上的hosts.j2文件中,最後一個操做步驟是經過template模塊,將hosts.j2模板文件拷貝到遠程主機的/etc/目錄下並重命名爲hosts文件。學習

將此腳本放到/etc/ansible目錄下,並命名爲hosts.yml,而後執行以下命令:

[root@server239 ansible]# ansible-playbook  hosts.yml

若是執行成功,會有綠色、淺黃色輸出提示,若是執行失敗,能夠看紅色輸出內容,判斷檢查問題。

二、主機自動創建ssh信任

大數據環境下,爲了安裝、配置和維護的方便,通常會設置管理機(安裝ansible的機器)和每一個集羣節點之間的無密碼登陸(單向信任),而無密碼登陸最簡單的方式是經過設置ssh公私鑰認證機制,下面playbook腳本能夠完成管理機到遠程主機組hostall的無密碼登陸,腳本內容以下:

- hosts: hostall
  gather_facts: no
  roles:
   - roles
  tasks:
   - name: close ssh yes/no check
     lineinfile: path=/etc/ssh/ssh_config regexp='(.*)StrictHostKeyChecking(.*)' line="StrictHostKeyChecking no"
   - name: delete /root/.ssh/
     file: path=/root/.ssh/ state=absent
   - name: create .ssh directory
     file: dest=/root/.ssh mode=0600 state=directory
   - name: generating local public/private rsa key pair
     local_action: shell ssh-keygen -t rsa -b 2048 -N '' -f /root/.ssh/id_rsa
   - name: view id_rsa.pub
     local_action: shell cat /root/.ssh/id_rsa.pub
     register: sshinfo
   - set_fact: sshpub={{sshinfo.stdout}}
   - name: add sshkey
     local_action: shell echo {{sshpub}} > {{AnsibleDir}}/roles/templates/authorized_keys.j2
   - name: copy authorized_keys.j2 to all hosts
     template: src={{AnsibleDir}}/roles/templates/authorized_keys.j2 dest=/root/.ssh/authorized_keys mode=0600
     tags:
     - copy sshkey

這個playbook稍微複雜一些,它仍然用到了角色變量,因此此腳本要放在/etc/ansible目錄下,腳本一開始經過lineinfile模塊對遠程主機上的sshd配置文件ssh_config進行文件內容替換,這個替換是關閉ssh第一次登錄時給出的「yes/no」提示,接着在遠程主機上刪除/root/.ssh目錄,並從新建立此目錄,這個操做的目的是確保遠程主機/root/.ssh目錄是乾淨的、權限正確的。而後經過local_action模塊在管理機上生成一對公私鑰,同時將生成的公鑰文件內容做爲變量sshinfo的值,並經過set_fact模塊從新定義一個變量sshpub,此變量引用sshinfo變量的stdout輸出,也就是最終的公鑰值,緊接着,將變量sshpub的內容寫入管理機authorized_keys.j2模板文件中,最後,使用template模塊將authorized_keys.j2模板文件拷貝到每一個遠程主機的/root/.ssh目錄下,並重命名爲authorized_keys,同時給文件授於屬主讀、寫權限。

將此腳本放到/etc/ansible目錄下,並命名爲ssh.yml,而後執行以下命令:

[root@server239 ansible]# ansible-playbook  ssh.yml

三、自動化安裝JDK

自動化安裝JDK是大數據運維中最多見的一個場景,JDK通常咱們下載二進制版本解壓便可使用,因此安裝JDK的過程就是把下載好的JDK程序拷貝到遠程主機的過程,JDK安裝完成後,還要添加JAVA_HOME到系統環境變量中,以讓系統識別安裝的JDK,下面的這個playbook文件就是自動化安裝JDK的整個過程,內容以下:

- hosts: hostall
  remote_user: root
  roles:
  - roles
  tasks:
   - name: mkdir jdk directory
     file: path={{BigdataDir}} state=directory mode=0755
   - name: copy and unzip jdk
     unarchive: src={{AnsibleDir}}/roles/files/jdk.tar.gz dest={{BigdataDir}}
   - name: set env
     lineinfile: dest=/etc/profile line="{{item.value}}" state=present
     with_items:
     - {value: "export JAVA_HOME={{BigdataDir}}/jdk"}
     - {value: "export PATH=$JAVA_HOME/bin:$PATH"}
   - name: chmod bin
     file: dest={{BigdataDir}}/jdk/bin mode=0755 recurse=yes
   - name: enforce env
     shell: source /etc/profile

此腳本中的BigdataDir、AnsibleDir都是角色變量,前面已經定義過具體的路徑了,其中,jdk.tar.gz位於管理機上,腳本最後經過item.value這個變量將JDK環境變量寫入到了/etc/profile文件的最後,這個變量的定義和引用方式須要引發你們注意。

將此腳本放到/etc/ansible目錄下,並命名爲jdk.yml,而後執行以下命令:

[root@server239 ansible]# ansible-playbook  jdk.yml

腳本執行成功的話,那麼jdk和環境變量就都配置好了。

文章內容不夠清晰,還有視頻輔助學習哦,訪問:

https://edu.51cto.com/course/23377.html ,Ansible與Ansible-playbook應用實戰視頻課程,幫助一次性掌握Ansible自動化運維工具的使用。

相關文章
相關標籤/搜索