在大數據運維環境下,對主機名要求比較嚴格,因此對大數據節點的主機名要進行統一規劃,而後集中設置,若是本地沒有創建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的默認目錄結構,以下圖所示:
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
若是執行成功,會有綠色、淺黃色輸出提示,若是執行失敗,能夠看紅色輸出內容,判斷檢查問題。
大數據環境下,爲了安裝、配置和維護的方便,通常會設置管理機(安裝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安裝完成後,還要添加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自動化運維工具的使用。