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
$1ur9ObJiT5iHNrb9QnjaIB0
也可以使用openssl passwd -l
然後通過交互式方式來輸入密碼,然後再將密文使用到ansible來處理。
用上面生成的密碼創建用戶
$ ansible all -m user -a ‘name=foo password="$1ur9ObJiT5iHNrb9QnjaIB0"’
不同的發行版默認使用的加密方式可能會有區別,具體可以查看/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模塊來執行處理。