ansible詳解和批量部署tomcat

ansible詳解和批量部署tomcat

ansible介紹

ansible是自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。
主要包括:
(1)、連接插件connection plugins:負責和被監控端實現通信;
(2)、host inventory:指定操作的主機,是一個配置文件裏面定義監控的主機;
(3)、各種模塊核心模塊、command模塊、自定義模塊;
(4)、藉助於插件完成記錄日誌郵件等功能;
(5)、playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。

基本架構

在這裏插入圖片描述

ansible特點和優點

特點

(1)、no agents:不需要在被管控主機上安裝任何客戶端;
(2)、no server:無服務器端,使用時直接運行命令即可;
(3)、modules in any languages:基於模塊工作,可使用任意語言開發模塊;
(4)、yaml,not code:使用yaml語言定製劇本playbook;
(5)、ssh by default:基於SSH工作;
(6)、strong multi-tier solution:可實現多級指揮。

優點

(1)、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
(2)、批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行;
(3)、使用python編寫,維護更簡單,ruby語法過於複雜;
(4)、支持sudo。

對客戶端的要求

如果託管節點上開啓了SElinux,你需要安裝libselinux-python,這樣纔可使用Ansible中與通常我們使用 ssh 與託管節點通信,默認使用 sftp.如果 sftp 不可用,可在 ansible.cfg 配置文件中配置成 scp 的方式. 在託管節點上也需要安裝 Python 2.4 或以上的版本.如果版本低於 Python 2.5 ,還需要額外安裝一個模塊:

客戶端需要安裝 python-simplejson

如果託管節點上開啓了SElinux,你需要安裝libselinux-python(當然也可以關閉SElinux),這樣纔可使用Ansible中與Note
copy/file/template相關的函數.你可以通過Ansible的yum模塊在需要的託管節點上安裝libselinux-python.

ansible的安裝

linux上安裝pip

安裝pip:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

通過pip來安裝ansible依賴包:

pip install
pip install paramiko
pip install PyYAML Jinja2 httplib2 six

pip install simplejson
pip install --upgrade distribute
pip install --upgrade setuptools

安裝ansible

unzip ansible2.4.zip
python setup install

安裝完成之後 : (命令行會安裝到/usr/bin目錄)
/usr/bin
ls -l |grep ansible

注:
安裝說明:
ansible 2.6是需要python3的模塊,同時使用pip相關的安裝也是需要使用python3的
在linux7.5上進行相應的測試時, 我們可以使用ansible2.4的穩定版本
這樣如果使用make/ make install的方式安裝,編譯才能通過

配置文件及相關目錄

安裝完成之後的配置目錄:
配置文件目錄:/etc/ansible/
執行文件目錄:/usr/bin/
Lib庫依賴目錄:/usr/lib/pythonX.X/site-packages/ansible/
Help文檔目錄:/usr/share/doc/ansible-X.X.X/
Man文檔目錄:/usr/share/man/man1/

例如:我的配置文件

[root@srva ~]# cat /etc/ansible/hosts 
[srva]
srva

[srv]
srvb
srvc
srvd

而測試機hostys文件:

[root@srva ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.174.128 srva.wtest.com srva
192.168.174.129 srvb.wtest.com srvb
192.168.174.130 srvc.wtest.com srvc
192.168.174.131 srvd.wtest.com srvd

ansible模塊和使用

常用模塊介紹
根據Ansible官方的分類,將模塊分爲核心模塊和額外模塊,代碼託管地址:https://github.com/ansible

核心模塊按功能分類爲:雲模塊、命令模塊、數據庫模塊、文件模塊、資產模塊、消息模塊、監控模塊、網絡模塊、通知模塊、包管理模塊、源碼控制模塊、系統模塊、單元模塊、web設施模塊、windows模塊等。

具體可以參看官方頁面ansible-modules-core。這裏從官方分類的模塊裏選擇最常用的一些模塊進行介紹,介紹之前我們先調整一下hosts文件,把默認用戶和密碼添加到主機中,這樣就不需要指定-u及-k了。

[test]
192.168.1.71 ansible_ssh_user=zzq ansible_ssh_pass=12345
192.168.1.72 ansible_ssh_user=zzq ansible_ssh_pass=12345
192.168.1.73 ansible_ssh_user=zzq ansible_ssh_pass=12345

一、ping模塊
測試主機是否是通的,用法很簡單,不涉及參數。

$ ansible test -m ping

二、setup模塊
setup模塊,主要用於獲取主機信息,在playbooks裏經常會用到的一個參數。gather_facts就與該模塊相關,setup模塊下經常使用的一個參數是filter參數,具體使用示例如下:

查看主機內存信息

$ ansible test -m setup -a ‘filter=ansible_*_mb’

查看地接口爲eth0-2的網卡信息

$ ansible test -m setup -a ‘filter=ansible_eth[0-2]’

將所有主機的信息輸入到/tmp/facts目錄下,每臺主機的信息輸入到主機名文件中(/etc/ansible/hosts裏的主機名)

$ ansible test -m setup --tree /tmp/facts

三、file模塊
file模塊主要用於遠程主機上的文件操作,具體使用示例如下:

創建一個軟連接

$ ansible test -m file -a “src=/etc/fstab dest=/tmp/fstab state=link”

刪除一個文件

$ ansible test -m file -a “path=/tmp/fstab state=absent”

創建一個文件

$ ansible test -m file -a “path=/tmp/test state=touch”

常用參數:

force #需要在兩種情況下強制創建軟鏈接,一種是源文件不存在但之後會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然後創建新的軟鏈,有兩個選項:yes|no;
group #定義文件/目錄的屬組;
mode #定義文件/目錄的權限;
owner #定義文件/目錄的屬主;
path #必選項,定義文件/目錄的路徑, required;
recurse #遞歸的設置文件的屬性,只對目錄有效;
src #要被鏈接的源文件的路徑,只應用於state=link的情況;
dest #被鏈接到的路徑,只應用於state=link的情況;
state:
directory #如果目錄不存在,創建目錄;
file #即使文件不存在,也不會被創建;
link #創建軟鏈接;
hard #創建硬鏈接;
touch #如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最後修改時間;
absent #刪除目錄、文件或者取消鏈接文件;

四、copy模塊
複製文件到遠程主機,如下示例:

$ ansible test -m copy -a “src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644”
$ ansible test -m copy -a “src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes”
$ ansible test -m copy -a “src=/mine/sudoers dest=/etc/sudoers validate=‘visudo -cf %s’”

常用參數:

backup #在覆蓋之前將原文件備份,備份文件包含時間信息。有兩個選項:yes|no;
content #用於替代"src",可以直接設定指定文件的值;
directory_mode #遞歸的設定目錄的權限,默認爲系統默認權限;
force #如果目標主機包含該文件,但內容不同,如果設置爲yes,則強制覆蓋,如果爲no,則只有當目標主機的目標位置不存在該文件時,才複製。默認爲yes;
others #所有的file模塊裏的選項都可以在這裏使用;
dest #必選項,要將源文件複製到的遠程主機的絕對路徑,如果源文件是一個目錄,那麼該路徑也必須是個目錄, required;
src # 要複製到遠程主機的文件在本地的地址,可以是絕對路徑,也可以是相對路徑。
如果路徑是一個目錄,它將遞歸複製。
在這種情況下,
#如果路徑使用"/“來結尾,則只複製目錄裏的內容,如果沒有使用”/“來結尾,則包含目錄在內的整個內容全部複製,類似於rsync;
validate #複製文件前進行驗證,文件的路徑的驗證是通過”%s";

五、service模塊
用於管理主機服務,能夠同時管理CentOS6和CentOS7,不區分CentOS6的service和CentOS7的systemctl,如下實例:

$ ansible test -m service -a “name=httpd state=started enabled=yes”
$ ansible test -m service -a “name=foo pattern=/usr/bin/foo state=started”
$ ansible test -m service -a “name=network state=restarted args=eth0”

我自己測試

常用參數:

name #必選項,服務名稱;
state #對當前服務執行啓動,停止、重啓、重新加載等操作(started, stopped, restarted, reloaded);
enabled #是否開機啓動yes|no;
pattern #定義一個模式,如果通過status指令來查看服務的狀態時,沒有響應,就會通過ps指令在進程中根據該模式進行查找,如果匹配到,則認爲該服務依然在運行;
runlevel #運行級別;
arguments #給命令行提供一些選項;
sleep #如果執行了restarted,在則stop和start之間沉睡幾秒鐘;

六、cron模塊
用於管理計劃任務,如下實例:

$ ansible test -m cron -a ‘name=“a job for reboot” special_time=reboot job="/some/job.sh"’
$ ansible test -m cron -a ‘name=“yum autoupdate” minute=/1 hour= day=* month=* weekday=* user=“root” job=“date>>/tmp/1.txt”’
$ ansible test -m cron -a ‘name=“yum autoupdate” minute=1 hour=/1 day= month=* weekday=* user=“root” job=“date>>/tmp/1.txt”’
$ ansible test -m cron -a ‘backup=“True” name=“test” minute=“0” hour=“5,2” job=“ls -alh > /dev/null”’
$ ansilbe test -m cron -a ‘cron_file=ansible_yum-autoupdate state=absent’

常用參數:

name #該任務的描述;
backup #對遠程主機上的原任務計劃內容修改之前做備份;
cron_file #如果指定該選項,則用該文件替換遠程主機上的cron.d目錄下的用戶的任務計劃;
day #日(1-31,,/2,……);
hour #小時(0-23,,/2,……);
minute #分鐘(0-59,,/2,……);
month #月(1-12,,/2,……);
weekday #周(0-7,*,……);
job #要執行的任務,依賴於state=present;
special_time #指定什麼時候執行,參數:reboot(重啓時),yearly(每年),annually,monthly,weekly,daily,hourly;
state #確認該任務計劃是創建還是刪除;
user #以哪個用戶的身份執行;

七、yum模塊
使用yum包管理器來管理軟件包,實例如下:

安裝最新版本的apache;

$ ansible test -m yum -a ‘name=httpd state=latest’

移除apache;

$ ansible test -m yum -a ‘name=httpd state=absent’

升級所有的軟件包;

$ ansible test -m yum -a 'name=* state=latest ’

安裝整個Development tools相關的軟件包;

$ ansible test -m yum -a ‘name="@Development tools" state=present’

從本地倉庫安裝nginx;

$ ansible test -m yum -a ‘name=/usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present’

從一個遠程yum倉庫安裝nginx;

$ ansible test -m yum -a ‘name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present’

常用參數:

name #要進行操作的軟件包的名字,也可以傳遞一個url或者一個本地的rpm包的路徑;
config_file #yum的配置文件;
disable_gpg_check #關閉gpg_check;
disablerepo #不啓用某個源;
enablerepo #啓用某個源;
state #用於描述安裝包最終狀態,present/latest用於安裝包,absent用於卸載安裝包;

八、user模塊:
用戶管理模塊,使用實例:

$ ansible test -m user -a ‘name=johnd comment=“John Doe” uid=1040 group=admin’
1
常用參數:

home #指定用戶的家目錄,需要與createhome配合使用;
groups #指定用戶的屬組;
uid #指定用的uid;
password #指定用戶的密碼;
name #指定用戶名;
createhome #是否創建家目錄yes|no;
system #是否爲系統用戶;
remove #當state=absent時,remove=yes則表示連同家目錄一起刪除,等價於userdel -r;
state #是創建還是刪除;
shell #指定用戶的shell環境;

注:指定password參數時,不能使用明文密碼,因爲後面這一串密碼會被直接傳送到被管理主機的/etc/shadow文件中,所以需要先將密碼字符串進行加密處理。然後將得到的字符串放到password中即可。

生成一個密碼:

$ echo “123456” | openssl passwd -1 -salt $(< /dev/urandom tr -dc ‘[:alnum:]’ | head -c 32) -stdin
$14P4PlFuE4P4PlFuEur9ObJiT5iHNrb9QnjaIB0

也可以使用openssl passwd -l
然後通過交互式方式來輸入密碼,然後再將密文使用到ansible來處理。

用上面生成的密碼創建用戶

$ ansible all -m user -a ‘name=foo password="$14P4PlFuE4P4PlFuEur9ObJiT5iHNrb9QnjaIB0"’

不同的發行版默認使用的加密方式可能會有區別,具體可以查看/etc/login.defs文件確認,centos 6.5版本使用的是SHA512加密算法。

九、group模塊
組管理模塊,使用實例:

$ ansible all -m group -a ‘name=somegroup state=present’

常用參數:

gid #指定gid;
name #指定組名稱;
state #操作狀態,present,absent;
system #是否爲系統組;

十、filesystem模塊
在塊設備上創建文件系統,示例如下:

$ ansible test -m filesystem -a ‘fstype=ext2 dev=/dev/sdb1 force=yes’
$ ansible test -m filesystem -a ‘fstype=ext4 dev=/dev/sdb1 opts="-cc"’

常用參數:

dev #目標塊設備;
force #在一個已有文件系統的設備上強制創建;
fstype #文件系統的類型;
opts #傳遞給mkfs命令的選項;

十一、mount模塊
配置掛載點

$ ansible test -m mount ‘name=/mnt/dvd src=/dev/sr0 fstype=iso9660 opts=ro state=present’
$ ansible test -m mount ‘name=/srv/disk src=‘LABEL=SOME_LABEL’ state=present’
$ ansible test -m mount ‘name=/home src=‘UUID=b3e48f45-f933-4c8e-a700-22a159ec9077’ opts=noatime state=present’

$ ansible test -a ‘dd if=/dev/zero of=/disk.img bs=4k count=1024’
$ ansible test -a ‘losetup /dev/loop0 /disk.img’
$ ansible test -m filesystem -a ‘fstype=ext4 force=yes opts=-F dev=/dev/loop0’
$ ansible test -m mount ‘name=/mnt src=/dev/loop0 fstype=ext4 state=mounted opts=rw’

常用參數:

fstype #必選項,掛載文件的類型;
name #必選項,掛載點;
opts #傳遞給mount命令的參數;
src #必選項,要掛載的文件;
state #必選項;
present #只處理fstab中的配置;
absent #刪除掛載點;
mounted #自動創建掛載點並掛載之;
umounted #卸載;

十二、get_url模塊
該模塊主要用於從http、ftp、https服務器上下載文件(類似於wget)

$ ansible test -m filesystem -a ‘url=http://example.com/path/file.conf dest=/etc/foo.conf mode=0440’
1
2
常用參數:

sha256sum #下載完成後進行sha256 check;
timeout #下載超時時間,默認10s;
url #下載的URL;
url_password、url_username #主要用於需要用戶名密碼進行驗證的情況;
use_proxy #使用代理,代理需事先在環境變更中定義;

十三、unarchive模塊
用於解壓文件的模塊,

$ ansible test -m unarchive -a ‘src=foo.tgz dest=/var/lib/foo’
$ ansible test -m unarchive -a ‘src=/tmp/foo.zip dest=/usr/local/bin copy=no’
$ ansible test -m unarchive -a ‘src=https://example.com/example.zip dest=/usr/local/bin copy=no’

常用參數:

copy #在解壓文件之前,是否先將文件複製到遠程主機,默認爲yes。若爲no,則要求目標主機上壓縮包必須存在;
creates #指定一個文件名,當該文件存在時,則解壓指令不執行;
dest #遠程主機上的一個路徑,即文件解壓的路徑;
group #解壓後的目錄或文件的屬組;
list_files #如果爲yes,則會列出壓縮包裏的文件,默認爲no,2.0版本新增的選項;
mode #解決後文件的權限;
src #如果copy爲yes,則需要指定壓縮文件的源路徑;
owner #解壓後文件或目錄的屬主;

十四、script模塊
在指定節點上執行shell/python腳本(注意,該腳本是在ansible控制節點上面的) 支持管道。
$ ansible test -m script -a ‘/root/src.sh’

十、shell模塊
在指定節點上執行shell/python腳本(注意,該腳本是在遠程節點)。 支持管道。

$ ansible test -m shell -a ‘/bin/bash /root/dest.sh’

十六、command模塊
用於執行遠程系統命令,此模塊爲ansible默認執行的模塊,也是常用模塊之一。 不支持管道命令。

$ ansible test -m command -a ‘uname -n’
1
十七、raw模塊
類似於command模塊、區別在於raw模塊支持管道傳遞。 支持管道

$ ansible test -m raw -a “tail -n2 /etc/passwd | head -n1”

本部分引用博客:原文鏈接:https://blog.csdn.net/zzq900503/article/details/80158767。 記錄在這裏,不再另說明。

playbook介紹和說明

Playbook是Ansible的配置,部署,編排語言。他們可以被描述爲一個需要希望遠程主機執行命令的方案,或者一組IT程序運行的命令集合。
dfd
當執行一些簡單的改動時ansible命令是非常有用的,然而它真的作用在於它的腳本能力。當對一臺機器做環境初始化的時候往往需要不止做一件事情,這時使用playbook會更加適合。通過playbook你可以一次在多臺機器執行多個指令。通過這種預先設計的配置保持了機器的配置統一,並很簡單的執行日常任務。

Playbook還開創了很多特性,它可以允許你傳輸某個命令的狀態到後面的指令,如你可以從一臺機器的文件中抓取內容並附爲變量,然後在另一臺機器中使用,這使得你可以實現一些複雜的部署機制,這是ansible命令無法實現的。
(變量的功能:不同機器之間的傳遞)

使用playbook批量部署tomcat

使用playbook安裝jdk1.8

規劃目錄:
源文件目錄:/install
壓縮包:jdk-8u231-linux-x64.tar.gz
解壓後的文件目錄:/usr/local/java/jdk-8u231-linux-x64 ,使用這個目錄作爲JAVA_HOME
解壓縮之後,配置/etc/profile的環境變量。
然後完成批量部署

yaml文件

[root@srva yaml]# cat jdk18.yaml
---
- hosts: srv
  vars:
    - tarname: jdk-8u231-linux-x64
    - jdkname: jdk1.8.0_231
    - profile: /etc/profile
  remote_user: root
  tasks:
    - name: cp and untar
      unarchive: src=/install/{{ tarname }}.tar.gz dest=/usr/local/java copy=yes
    - name:  config JAVA_HOME
      shell: echo "export JAVA_HOME=/usr/local/java/{{ jdkname }}" >> {{ profile }}
    - name: config PATH
      shell: echo "export PATH=\${JAVA_HOME}/bin:\${JAVA_HOME}/jre/bin:\$PATH" >> {{ profile }}
    - name: active {{ profile }} configure file
      shell: source {{ profile }}
    - name: java -version
      shell: /usr/local/java/{{ jdkname }}/bin/java -version
      register: javaversion
    - name: show
      debug: var=javaversion.stdout verbosity=0

使用playbook安裝jdk1.8:
ansible-playbook jdk8.yaml

使用playbook批量部署tomcat

tomcat批量部署:

目錄規劃
安裝目錄: /usr/local/tomcat
源安裝文件目錄:apache-tomcat-8.5.50.tar.gz

思路:
解壓到/usr/local目錄之後,之後重命名成tomcat目錄(這樣其實看起來是比較舒服的)

yaml配置文件:

[root@srva yaml]# cat tomcat.yaml
---
- hosts: srv
  remote_user: root
  tasks:
    - name: cp and untar
      unarchive: src=/install/apache-tomcat-8.5.50.tar.gz dest=/usr/local copy=yes
    - name: rename the tomcat dir
      shell: cd /usr/local;mv apache-tomcat-8.5.50 tomcat
    - name: start tomcat
      shell: source /etc/profile; nohup /usr/local/tomcat/bin/startup.sh &

向srv主機組批量部署tomcat,並啓動
ansilbe-playbook tomcat.yaml

配置過程中存在問題記錄

$ 符號的轉義

在ansilble調用shell模塊處理時,如果引號內有$符號,則需要用 \ 轉義
如我們在配置JAVA環境喲哦結果時使用的配置:
在這裏插入圖片描述

無法通過ansible啓動tomcat

當使用 ansible srv -m shell -a ‘/usr/local/tomcat/bin/startup.sh’ 啓動tomcat發現返回爲SUCESS, 但是實際在受管端無法啓動tomcat
處理:
1、環境變量,在startup.sh中添加source /etc/profile
2、後臺運行,加上nohup…&
yaml腳本配置可以如下:
- name: start tomcat
shell: nohup /usr/local/tomcat/bin/startup.sh &

---
- hosts: srv
  remote_user: root
  tasks:
    - name: cp and untar
      unarchive: src=/install/apache-tomcat-8.5.50.tar.gz dest=/usr/local copy=yes
    - name: rename the tomcat dir
      shell: cd /usr/local;mv apache-tomcat-8.5.50 tomcat
    - name: start tomcat
      shell: nohup /usr/local/tomcat/bin/startup.sh &

tomcat無法通過bin/shutdown.sh關閉

tomcat無法通過bin/shutdown.sh關閉
處理:修改java.security安全檢驗方式

文件位置:
JAVA_HOME=/usr/local/java/jdk1.8.0_231
filename=${JAVA_HOME}/jre/lib/security/java.security

我們通過使用shell腳本來批量修改:

touch deal_java_security.sh

[root@srva yaml]# cat deal_java_security.sh

# env

JAVA_HOME=/usr/local/java/jdk1.8.0_231
filename=${JAVA_HOME}/jre/lib/security/java.security

# the main method: deal with the java random security policy
sed -i "s/^securerandom.source=file.*$/securerandom.source=file:\/dev\/.\/random/g" ${filename}

使用ansible在srv主機羣組批量執行:
ansible srv -m script -a ‘/root/yaml/deal_java_security.sh’

當然完全可以通過批量頒發至srv各個節點上,然後通過ansilbe shell模塊來執行處理。

發佈了63 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章