連接:https://pan.baidu.com/s/1A3Iq3gGkGS27L_Gt37_I0g
提取碼:ncy2
複製這段內容後打開百度網盤手機App,操做更方便哦html
- 批量管理服務器的工具
- 無需部署agent,經過ssh進行管理
- 流行的自動化運維工具:https://github.com/ansible/ansible
- 可視化運維(主要用在可視化部署)
- 持續構建,能夠和git,svn結合
- 可結合ssh實現可視化運維
- 可結合ansible實現可視化運維
[root@server ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@server ~]# uname -m x86_64 [root@server ~]# uname -r 3.10.0-862.el7.x86_64
[root@Ansible ~]# yum -y install lrzsz gcc gcc-c++ ncurses ncurses-devel unzip zlib-devel zlib openssl-devel openssl [root@Ansible ~]# rpm -qa lrzsz gcc gcc-c++ ncurses ncurses-devel unzip zlib-devel zlib openssl-devel openssl gcc-c++-4.8.5-28.el7_5.1.x86_64 ncurses-devel-5.9-14.20130511.el7_4.x86_64 ncurses-5.9-14.20130511.el7_4.x86_64 openssl-1.0.2k-12.el7.x86_64 gcc-4.8.5-28.el7_5.1.x86_64 openssl-devel-1.0.2k-12.el7.x86_64 unzip-6.0-19.el7.x86_64 zlib-1.2.7-17.el7.x86_64 zlib-devel-1.2.7-17.el7.x86_64 lrzsz-0.12.20-36.el7.x86_64
[root@Ansible yang]# pwd /yang [root@Ansible yang]# ls Python-3.5.2.tgz [root@Ansible yang]# tar xf Python-3.5.2.tgz -C /usr/src/ #解壓縮 [root@Ansible yang]# cd /usr/src/Python-3.5.2/ [root@Ansible Python-3.5.2]# ./configure --prefix=/usr/local/python/ #源碼編譯 #如下省略。。。 [root@Ansible Python-3.5.2]# make && make install #如下省略。。。 [root@Ansible Python-3.5.2]# ln -s /usr/local/python/bin/python3 /usr/bin/python3 #創建軟鏈接 [root@Ansible Python-3.5.2]# which python3 /usr/bin/python3 [root@Ansible Python-3.5.2]# python3 -V python的版本號 Python 3.5.2
[root@Ansible Python-3.5.2]# /usr/local/python/bin/pip3 install ansible #如下省略。。。
[root@Ansible Python-3.5.2]# ln -s /usr/local/python/bin/ansible /usr/local/bin/ [root@Ansible Python-3.5.2]# which ansible /usr/local/bin/ansible [root@Ansible Python-3.5.2]# ansible --version ansible 2.6.4 #ansible版本 config file = None configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/local/python/lib/python3.5/site-packages/ansible executable location = /usr/local/bin/ansible python version = 3.5.2 (default, Sep 6 2018, 22:33:20) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
[root@ansible ~]# /usr/local/python/bin/ansible-doc -l #查看總幫助 [root@ansible ~]# /usr/local/python/bin/ansible-doc -s shell #查看shell模塊的幫助 [root@ansible ~]# /usr/local/python/bin/ansible-doc -s raw
- ansible是無agent的,無agent是怎麼批量管理服務器的?主要是借用ssh來批量管理服務器。
- ssh默認登錄是須要密碼的,因此管理起來比較麻煩,這節課主要是介紹ssh的無密碼登錄。
- ssh無密碼登錄實現之後,使用ansible批量管理服務器就變得簡單了
Host | IP |
---|---|
ansible | 192.168.200.73 |
web01 | 192.168.200.74 |
web02 | 192.168.200.75 |
[root@Ansible ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P "" Generating public/private rsa key pair. Created directory '/root/.ssh'. Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:AyXvTyhwFx6yOSXrzVUBcmGCzjmgoLjo51Yn+XVdmbk root@Ansible The key's randomart image is: +---[RSA 2048]----+ | +.B =oo. | |. . .% B . | |o. ..+B.+ . +| |o . +=B o = | |.. +.S . . . .| |o + o = . . E | |. . + . o | | . o . | | +. | +----[SHA256]-----+
[root@Ansible ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 192.168.200.74 #Web01的IP /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.200.74's password: Web01的登陸密碼 Number of key(s) added: 1 Now try logging into the machine, with: "ssh -o ' StrictHostKeyChecking=no' '192.168.200.74'" and check to make sure that only the key(s) you wanted were added.
[root@Ansible ~]# hostname -I 192.168.200.73 [root@Ansible ~]# ssh 192.168.200.74 Last login: Thu Sep 6 22:16:49 2018 from 192.168.200.1 [root@Web01 ~]# hostname -I 192.168.200.74 [root@Web01 ~]# exit logout Connection to 192.168.200.74 closed.
[root@Ansible ~]# mkdir -p /etc/ansible [root@Ansible ~]# cat /etc/ansible/hosts #ansible主機管理配置文件 [nginx] #被管理的主機組名稱 Web01 ansible_ssh_host=192.168.200.74 ansible_ssh_port=22 ansible_ssh_user=root #第一臺主機 Web02 ansible_ssh_host=192.168.200.75 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=111111 #第二臺主機 特別提示: Web01 ===> 主機名 ansible_ssh_host ===>主機IP ansible_ssh_port ===>ssh的默認端口 ansible_ssh_user ===>ssh的用戶名 ansible_ssh_pass ===>ssh的用戶的鏈接密碼
若是咱們已經設置了ssh免密鑰了。那麼就不須要寫密碼了。例如:Web01
咱們要是沒有設置免密鑰,那麼就須要安裝sshpass工具,並在/etc/ansible/hosts文件裏寫上主機的鏈接密碼。例如Web02python
#下載epel源安裝sshpass root@Ansibl ~]# yum -y install wget [root@ansible ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [root@ansible ~]# yum -y install sshpass [root@ansible ~]# which sshpass /usr/bin/sshpass
#修改ssh配置文件 [root@ansible ~]# sed -n '35p' /etc/ssh/ssh_config # StrictHostKeyChecking ask [root@ansible ~]# vim /etc/ssh/ssh_config [root@ansible ~]# sed -n '35p' /etc/ssh/ssh_config StrictHostKeyChecking no #去掉註釋,修改爲這樣 #重啓ssh服務 [root@ansible ~]# systemctl reload sshd.service
#進行ping模塊的鏈接測試 [root@Ansible ~]# ansible nginx -m ping Web01 | SUCCESS => { "changed": false, "ping": "pong" } Web02 | SUCCESS => { "changed": false, "ping": "pong" }
ansible -i /etc/ansible/hosts 主機或主機組 -m 指定模塊 -a 命令
linux
ansible all -m ping
nginx
主機組,主機,all表明全部c++
主機組範圍 | 解釋 |
---|---|
all | 表明全部主機 |
Web01:Web02 | 能夠指定多臺主機 |
all:!Web01 | 指定all但不包含Web02,注意!前須要加轉意符號\ |
[root@Ansible ~]# ansible Web01 -m ping Web01 | SUCCESS => { "changed": false, "ping": "pong" } [root@Ansible ~]# ansible all -m ping Web01 | SUCCESS => { "changed": false, "ping": "pong" } Web02 | SUCCESS => { "changed": false, "ping": "pong" } [root@Ansible ~]# ansible Web01:Web02 -m ping Web01 | SUCCESS => { "changed": false, "ping": "pong" } Web02 | SUCCESS => { "changed": false, "ping": "pong" } [root@Ansible ~]# ansible all:\!Web01 -m ping Web02 | SUCCESS => { "changed": false, "ping": "pong" } [root@Ansible ~]# ansible Web01:Web02 -m command -a 'uptime' Web02 | SUCCESS | rc=0 >> 23:14:40 up 1:16, 3 users, load average: 0.05, 0.03, 0.05 Web01 | SUCCESS | rc=0 >> 23:14:40 up 1:16, 3 users, load average: 0.06, 0.03, 0.05
#command支持直接回顯命令的執行結果 [root@ansible ~]# ansible all -m command -a "pwd" Web01 | SUCCESS | rc=0 >> /root Web02 | SUCCESS | rc=0 >> /root #command模塊不支持管道符操做 [root@ansible ~]# ansible all -m command -a "echo test | grep t" Web01 | SUCCESS | rc=0 >> test | grep t Web02 | SUCCESS | rc=0 >> test | grep t #command模塊不支持重定向操做 [root@ansible ~]# ansible all -m command -a "echo bb >> /tmp/testansible" Web01 | SUCCESS | rc=0 >> bb >> /tmp/testansible Web02 | SUCCESS | rc=0 >> bb >> /tmp/testansible
#shell模塊支持管道符 [root@ansible ~]# ansible all -m shell -a "echo testansible | grep a" Web01 | SUCCESS | rc=0 >> testansible Web02 | SUCCESS | rc=0 >> testansible #shell支持重定向 [root@ansible ~]# ansible all -m shell -a "echo bb >> /tmp/testansible" Web01 | SUCCESS | rc=0 >> Web02 | SUCCESS | rc=0 >> [root@Web01 tmp]# cat testansible bb [root@Web02 tmp]# cat testansible bb #若是遇到特殊符號須要加入\轉義,這樣子ansible才能正常運行 [root@Ansible ~]# ansible all -m shell -a "cat /etc/passwd | awk -F":" '{print \$1}'" Web01 | SUCCESS | rc=0 >> root bin daemon adm lp sync shutdown halt mail operator games ftp nobody systemd-network dbus polkitd sshd postfix chrony Web02 | SUCCESS | rc=0 >> root bin daemon adm lp sync shutdown halt mail operator games ftp nobody systemd-network dbus polkitd sshd postfix chrony
[root@Ansible ~]# ansible all -m raw -a "yum -y clean all" Web02 | SUCCESS | rc=0 >> Loaded plugins: fastestmirror Cleaning repos: base extras updates Cleaning up everything Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos Cleaning up list of fastest mirrors Shared connection to 192.168.200.75 closed. Web01 | SUCCESS | rc=0 >> Loaded plugins: fastestmirror Cleaning repos: base extras updates Cleaning up everything Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos Cleaning up list of fastest mirrors Shared connection to 192.168.200.74 closed.
[root@Ansible ~]# ansible all -m raw -a "yum makecache" Web02 | SUCCESS | rc=0 >> Loaded plugins: fastestmirror Determining fastest mirrors #中間省略。。。 Metadata Cache Created Shared connection to 192.168.200.75 closed. Web01 | SUCCESS | rc=0 >> Loaded plugins: fastestmirror Determining fastest mirrors #中間省略。。。 Metadata Cache Created Shared connection to 192.168.200.74 closed.
[root@Ansible ~]# ansible all -m raw -a "yum -y install nmap" #如下省略。。。
[root@Web01 ~]# which nmap /usr/bin/nmap [root@Web02 ~]# which nmap /usr/bin/nmap
- src:指定源文件或目錄
- dest:指定目標服務器的文件或目錄
- backup:是否要備份
- owner:拷貝到目標服務器後,文件或目錄的所屬用戶
- group:拷貝到目標服務器後,文件或目錄的所屬羣組
- mode:文件或目錄的權限
[root@Ansible ~]# mkdir yangwenbo [root@Ansible ~]# cd yangwenbo [root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# echo "welcome to yunjisuan161" > yunwei [root@Ansible yangwenbo]# cat yunwei welcome to yunjisuan161
[root@Web01 ~]# yum -y install libselinux-python [root@Web01 ~]# rpm -qa libselinux-python libselinux-python-2.5-12.el7.x86_64 [root@Web02 ~]# yum -y install libselinux-python [root@Web02 ~]# rpm -qa libselinux-python libselinux-python-2.5-12.el7.x86_64
特別提示:git
- 若是目標路徑不存在會自動建立
- src===>源文件路徑 dest=目標路徑位置
#拷貝文件 [root@Ansible yangwenbo]# ansible all -m copy -a "src=/root/yangwenbo/yunwei dest=/root/yangwenbo/" Web01 | SUCCESS => { "changed": true, "checksum": "4775b9cf454d1817e252f0678c06d64bc214da1c", "dest": "/root/yangwenbo/yunwei", "gid": 0, "group": "root", "md5sum": "38b35e7d3f5c75583ce5e1ee5838a396", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:admin_home_t:s0", "size": 24, "src": "/root/.ansible/tmp/ansible-tmp-1536310826.228977-17143783285290/source", "state": "file", "uid": 0 } Web02 | SUCCESS => { "changed": true, "checksum": "4775b9cf454d1817e252f0678c06d64bc214da1c", "dest": "/root/yangwenbo/yunwei", "gid": 0, "group": "root", "md5sum": "38b35e7d3f5c75583ce5e1ee5838a396", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:admin_home_t:s0", "size": 24, "src": "/root/.ansible/tmp/ansible-tmp-1536310826.2419605-39881113399031/source", "state": "file", "uid": 0 } #檢查拷貝結果 [root@Web01 ~]# cd yangwenbo/ [root@Web01 yangwenbo]# pwd /root/yangwenbo [root@Web01 yangwenbo]# cat yunwei welcome to yunjisuan161 [root@Web02 ~]# cd yangwenbo/ [root@Web02 yangwenbo]# pwd /root/yangwenbo [root@Web02 yangwenbo]# cat yunwei welcome to yunjisuan161
特別提示:若是目標路徑裏有與我拷貝的文件同名文件的話,會直接覆蓋目標路徑下的文件github
[root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# cat yunwei welcome to yunjisuan161 #拷貝文件 [root@Ansible yangwenbo]# ansible Web01 -m copy -a "src=/root/yangwenbo/ dest=/root/yangwenbo/" Web01 | SUCCESS => { "changed": false, "checksum": "4775b9cf454d1817e252f0678c06d64bc214da1c", "dest": "/root/yangwenbo/yunwei", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "path": "/root/yangwenbo/yunwei", "secontext": "system_u:object_r:admin_home_t:s0", "size": 24, "state": "file", "uid": 0 } #檢查拷貝結果 [root@Web01 yangwenbo]# pwd /root/yangwenbo [root@Web01 yangwenbo]# cat yunwei welcome to yunjisuan161
特別提示:參數:backup=yes ===>意思是,若是目標路徑下,有與我同名但不一樣內容的文件時,在覆蓋前,對目標文件先進行備份。web
[root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# cat yunwei hello #拷貝文件 [root@Ansible yangwenbo]# ansible Web01 -m copy -a "src=/root/yangwenbo/ dest=/root/yangwenbo/ backup=yes" Web01 | SUCCESS => { "backup_file": "/root/yangwenbo/yunwei.1990.2018-09-07@05:30:28~", "changed": true, "checksum": "f572d396fae9206628714fb2ce00f72e94f2258f", "dest": "/root/yangwenbo/yunwei", "gid": 0, "group": "root", "md5sum": "b1946ac92492d2347c6235b4d2611184", "mode": "0644", "owner": "root", "secontext": "system_u:object_r:admin_home_t:s0", "size": 6, "src": "/root/.ansible/tmp/ansible-tmp-1536312626.9388444-271698353874697/source", "state": "file", "uid": 0 } #檢查拷貝結果 [root@Web01 yangwenbo]# pwd /root/yangwenbo [root@Web01 yangwenbo]# ls yunwei yunwei.1990.2018-09-07@05:30:28~ [root@Web01 yangwenbo]# cat yunwei hello [root@Web01 yangwenbo]# cat yunwei.1990.2018-09-07\@05\:30\:28~ welcome to yunjisuan161
#拷貝文件 [root@Ansible yangwenbo]# ansible Web02 -m copy -a "src=/root/yangwenbo/ dest=/root/yangwenbo/ owner=nobody group=nobody mode=0600" Web02 | SUCCESS => { "changed": true, "checksum": "f572d396fae9206628714fb2ce00f72e94f2258f", "dest": "/root/yangwenbo/yunwei", "gid": 99, "group": "nobody", "md5sum": "b1946ac92492d2347c6235b4d2611184", "mode": "0600", "owner": "nobody", "secontext": "system_u:object_r:admin_home_t:s0", "size": 6, "src": "/root/.ansible/tmp/ansible-tmp-1536312849.3372185-152360920901702/source", "state": "file", "uid": 99 } #檢查拷貝結果 [root@Web02 yangwenbo]# pwd /root/yangwenbo [root@Web02 yangwenbo]# ls yunwei [root@Web02 yangwenbo]# cat yunwei hello [root@Web02 yangwenbo]# ll total 4 -rw-------. 1 nobody nobody 6 Sep 7 05:34 yunwei
ansible的script模塊可以實現遠程服務器批量運行本地的shell腳本。shell
#操做示例-->遠程批量分發並自動部署nginx #全部被管理端須要掛載光盤,並建立本地yum配置文件 [root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# ls | xargs -n1 auto_nginx.sh #自動安裝nginx腳本 fenfa.sh #批量分發腳本 nginx-1.10.2.tar.gz #nginx源碼包 [root@Ansible yangwenbo]# cat auto_nginx.sh #自動安裝nginx腳本 #!/bin/sh #nginx install shell scripts test -d /media/cdrom || mkdir -p /media/cdrom mount /dev/sr0 /media/cdrom &>/dev/null yum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel &>/dev/null test -d /root/yangwenbo || exit 3 cd /root/yangwenbo/ tar xf nginx-1.10.2.tar.gz -C /usr/src/ cd /usr/src/nginx-1.10.2/ ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module &>/dev/null make &>/dev/null make install &>/dev/null exit 0 [root@Ansible yangwenbo]# cat fenfa.sh #源碼包和安裝腳本的批量分發腳本 #!/bin/sh #批量分發腳本 Group=$1 ansible $Group -m copy -a "src=/root/yangwenbo/ dest=/root/yangwenbo/" ansible $Group -m script -a "/root/yangwenbo/auto_nginx.sh"
#激活腳本 [root@Ansible yangwenbo]# sh fenfa.sh all Web02 | SUCCESS => { "changed": true, "dest": "/root/yangwenbo/", "src": "/root/yangwenbo/" } Web01 | SUCCESS => { "changed": true, "dest": "/root/yangwenbo/", "src": "/root/yangwenbo/" } Web02 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 192.168.200.75 closed.\r\n", "stderr_lines": [ "Shared connection to 192.168.200.75 closed." ], "stdout": "", "stdout_lines": [] } Web01 | SUCCESS => { "changed": true, "rc": 0, "stderr": "Shared connection to 192.168.200.74 closed.\r\n", "stderr_lines": [ "Shared connection to 192.168.200.74 closed." ], "stdout": "", "stdout_lines": [] }
#檢查腳本執行結果 [root@Web01 ~]# ll -d /usr/local/nginx drwxr-xr-x. 6 root root 54 Sep 7 06:00 /usr/local/nginx [root@Web02 ~]# ll -d /usr/local/nginx drwxr-xr-x. 6 root root 54 Sep 7 06:00 /usr/local/nginx
此腳本只是個演示示例,工做中須要寫的儘可能嚴謹一些vim
playbook的使用,playbook能夠把ansible的模塊進行組合
#設置ansible-playbook的軟鏈接 [root@Ansible /]# ln -s /usr/local/python/bin/ansible-playbook /usr/local/bin/ [root@Ansible /]# which ansible-playbook /usr/local/bin/ansible-playbook
[root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# cat test_shell.yaml #playbook的執行模板 --- #開頭三個小-開頭 - hosts: Web01 tasks: - name: test shell: echo "welcome to yunjisaun" >> /tmp/username - name: test2 shell: echo "welcome to yunjisuan" >> /tmp/username 模板說明: --- #開頭必須有三個小-,頂格寫 - hosts: #正文配置代碼的第一級,必須有兩個空格(-佔一個空格位) - host: Web01 #Web01是host參數的值,值和hosts:之間要有一個空格 tasks: #tasks:表示接下來要執行的具體任務 - name: #相對於tasks再多縮進兩個格(-佔一個空格位),表示屬於tasks的下一級 - name: test #test只是要執行的具體命令的名字能夠隨便寫。name:後仍是有一個空格要注意 shell: #表示調用shell模塊執行命令相對於tasks仍舊要多縮進兩個空格 shell: echo "xxx" >> xxx #shell:後邊仍是要有個空格,須要注意。
#執行playbook配置文件 [root@Ansible yangwenbo]# ansible-playbook test_shell.yaml PLAY [Web01] *********************************************************************************** TASK [Gathering Facts] ************************************************************************* ok: [Web01] TASK [test] ************************************************************************************ changed: [Web01] TASK [test2] *********************************************************************************** changed: [Web01] PLAY RECAP ************************************************************************************* Web01 : ok=3 changed=2 unreachable=0 failed=0
#執行結果 [root@Web01 tmp]# pwd /tmp [root@Web01 tmp]# ls username [root@Web01 tmp]# cat username welcome to yunjisaun welcome to yunjisuan
[root@Ansible yangwenbo]# echo "welcom to yunjisuan" >> /root/yangwenbo/test_copy [root@Ansible yangwenbo]# cat test_copy welcom to yunjisuan [root@Ansible yangwenbo]# cat test_copy.yaml #playbook的執行模板 --- - hosts: Web02 tasks: - name: test copy copy: src=/root/yangwenbo/test_copy dest=/tmp/
#執行playbook配置文件 [root@Ansible yangwenbo]# ansible-playbook test_copy.yaml PLAY [Web02] *********************************************************************************** TASK [Gathering Facts] ************************************************************************* ok: [Web02] TASK [test copy] ******************************************************************************* changed: [Web02] PLAY RECAP ************************************************************************************* Web02 : ok=2 changed=1 unreachable=0 failed=0
#執行結果 [root@Web02 tmp]# pwd /tmp [root@Web02 tmp]# ls test_copy [root@Web02 tmp]# cat test_copy welcom to yunjisuan
咱們在用playbook進行ansible模塊操做的時候,並無命令的執行結果輸出,默認被隱藏
咱們能夠經過register模塊最加輸出命令的執行結果
[root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# cat test_register.yaml #playbook的執行模板 --- - hosts: all tasks: - name: test register shell: echo "hi Tom" >> /tmp/registers register: print_result #將以前命令的輸出結果保存在變量print_result裏 - debug: var=print_result #將變量的值做爲debug輸出出來
#執行playbook配置文件 [root@Ansible yangwenbo]# ansible-playbook test_register.yaml PLAY [all] ************************************************************************************* TASK [Gathering Facts] ************************************************************************* ok: [Web01] ok: [Web02] TASK [test register] *************************************************************************** changed: [Web02] changed: [Web01] TASK [debug] *********************************************************************************** ok: [Web01] => { "print_result": { "changed": true, "cmd": "echo \"hi Tom\" >> /tmp/registers", "delta": "0:00:00.007286", "end": "2018-09-07 23:43:38.967375", "failed": false, "rc": 0, "start": "2018-09-07 23:43:38.960089", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": [] } } ok: [Web02] => { "print_result": { "changed": true, "cmd": "echo \"hi Tom\" >> /tmp/registers", "delta": "0:00:00.006651", "end": "2018-09-07 23:43:38.957825", "failed": false, "rc": 0, "start": "2018-09-07 23:43:38.951174", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": [] } } PLAY RECAP ************************************************************************************* Web01 : ok=3 changed=1 unreachable=0 failed=0 Web02 : ok=3 changed=1 unreachable=0 failed=0
#執行結果 [root@Web01 tmp]# pwd /tmp [root@Web01 tmp]# ls registers [root@Web01 tmp]# cat registers hi Tom [root@Web02 tmp]# pwd /tmp [root@Web02 tmp]# ls registers [root@Web02 tmp]# cat registers hi Tom
[root@Ansible tmp]# pwd /tmp [root@Ansible tmp]# ls nginx.conf [root@Ansible tmp]# cat nginx.conf #nginx的配置文件 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.yangwenbo.com; location / { root html; index index.html index.htm; } } } [root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# cat test_nginx_conf.yaml #playbook的執行模板 --- - hosts: all tasks: - name: copy nginx.conf copy: src=/tmp/nginx.conf dest=/usr/local/nginx/conf/ backup=yes - name: shell: /usr/local/nginx/sbin/nginx -t register: nginx_result - debug: var=nginx_result
#執行playbook配置文件 [root@Ansible yangwenbo]# ansible-playbook test_nginx_conf.yaml PLAY [all] ************************************************************************************* TASK [Gathering Facts] ************************************************************************* ok: [Web01] ok: [Web02] TASK [copy nginx.conf] ************************************************************************* changed: [Web02] changed: [Web01] TASK [shell] *********************************************************************************** changed: [Web02] changed: [Web01] TASK [debug] *********************************************************************************** ok: [Web01] => { "nginx_result": { "changed": true, "cmd": "/usr/local/nginx/sbin/nginx -t", "delta": "0:00:00.720120", "end": "2018-09-07 23:14:53.043060", "failed": false, "rc": 0, "start": "2018-09-07 23:14:52.322940", "stderr": "nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful", "stderr_lines": [ "nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok", #提示nginx配置文件正常 "nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful" ], "stdout": "", "stdout_lines": [] } } ok: [Web02] => { "nginx_result": { "changed": true, "cmd": "/usr/local/nginx/sbin/nginx -t", "delta": "0:00:00.628406", "end": "2018-09-07 23:14:52.966781", "failed": false, "rc": 0, "start": "2018-09-07 23:14:52.338375", "stderr": "nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful", "stderr_lines": [ "nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok", #提示nginx配置文件正常 "nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful" ], "stdout": "", "stdout_lines": [] } } PLAY RECAP ************************************************************************************* Web01 : ok=4 changed=2 unreachable=0 failed=0 Web02 : ok=4 changed=2 unreachable=0 failed=0
#執行結果 [root@Web01 /]# cat /usr/local/nginx/conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.yangwenbo.com; location / { root html; index index.html index.htm; } } } [root@Web02 /]# cat /usr/local/nginx/conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.yangwenbo.com; location / { root html; index index.html index.htm; } } }
[root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# cat test_vars.yaml #playbook的執行模板 --- - hosts: all vars: #定義變量 - names: "yunjisuan" #第一個name變量 age: "3" #第二個age變量 tasks: - name: "{{ names }}" #{{}}兩對大括號引用變量,變量名兩頭空格 shell: echo "myname {{ names }},myage {{ age }}" >> /tmp/bianliang register: var_result - debug: var=var_result #特別提示:引用變量須要在雙引號中引用。
#執行playbook配置文件 [root@Ansible yangwenbo]# ansible-playbook test_vars.yaml PLAY [all] ************************************************************************************** TASK [Gathering Facts] ************************************************************************** ok: [Web01] ok: [Web02] TASK [yunjisuan] ******************************************************************************** changed: [Web01] changed: [Web02] TASK [debug] ************************************************************************************ ok: [Web01] => { "var_result": { "changed": true, "cmd": "echo \"myname yunjisuan,myage 3\" >> /tmp/bianliang", "delta": "0:00:00.007237", "end": "2018-09-07 23:37:10.839684", "failed": false, "rc": 0, "start": "2018-09-07 23:37:10.832447", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": [] } } ok: [Web02] => { "var_result": { "changed": true, "cmd": "echo \"myname yunjisuan,myage 3\" >> /tmp/bianliang", "delta": "0:00:00.009848", "end": "2018-09-07 23:37:10.859020", "failed": false, "rc": 0, "start": "2018-09-07 23:37:10.849172", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": [] } } PLAY RECAP ************************************************************************************** Web01 : ok=3 changed=1 unreachable=0 failed=0 Web02 : ok=3 changed=1 unreachable=0 failed=0
#執行結果 [root@Web01 tmp]# pwd /tmp [root@Web01 tmp]# ls bianliang [root@Web01 tmp]# cat bianliang myname yunjisuan,myage 3 [root@Web02 tmp]# pwd /tmp [root@Web02 tmp]# ls bianliang [root@Web02 tmp]# cat bianliang myname yunjisuan,myage 3
咱們可使用ansible all -m setup | less查看ansible內置變量
[root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# cat test_setupvars.yaml #playbook的執行模板 --- - hosts: all gather_facts: True #使用ansible內置變量 tasks: - name: setup var shell: echo "ip {{ ansible_all_ipv4_addresses[0] }} cpu {{ ansible_processor_count }}" >> /tmp/test - name: setup var2 shell: echo "time {{ ansible_date_time["date"] }}" >> /tmp/test register: var_result - debug: var=var_result
#執行playbook配置文件 [root@Ansible yangwenbo]# ansible-playbook test_setupvars.yaml PLAY [all] ************************************************************************************* TASK [Gathering Facts] ************************************************************************* ok: [Web01] ok: [Web02] TASK [setup var] ******************************************************************************* changed: [Web02] changed: [Web01] TASK [setup var2] ****************************************************************************** changed: [Web01] changed: [Web02] TASK [debug] *********************************************************************************** ok: [Web01] => { "var_result": { "changed": true, "cmd": "echo \"time 2018-09-07\" >> /tmp/test", "delta": "0:00:00.005305", "end": "2018-09-07 23:49:33.178900", "failed": false, "rc": 0, "start": "2018-09-07 23:49:33.173595", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": [] } } ok: [Web02] => { "var_result": { "changed": true, "cmd": "echo \"time 2018-09-07\" >> /tmp/test", "delta": "0:00:00.005363", "end": "2018-09-07 23:49:33.230051", "failed": false, "rc": 0, "start": "2018-09-07 23:49:33.224688", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": [] } } PLAY RECAP ************************************************************************************* Web01 : ok=4 changed=2 unreachable=0 failed=0 Web02 : ok=4 changed=2 unreachable=0 failed=0
#執行結果 [root@Web01 tmp]# pwd /tmp [root@Web01 tmp]# ls test [root@Web01 tmp]# cat test ip 192.168.200.74 cpu 1 time 2018-09-07 [root@Web02 tmp]# pwd /tmp [root@Web02 tmp]# ls test [root@Web02 tmp]# cat test ip 192.168.200.75 cpu 1 time 2018-09-07
配置文件若是使用copy模塊去下發的話,那配置都是同樣的;
若是下發的配置文件裏有可變的配置,須要用到template模塊。
[root@Ansible tmp]# pwd /tmp [root@Ansible tmp]# ls test [root@Ansible tmp]# cat test my name is {{ myname }} #自定義變量 my name is {{ ansible_all_ipv4_addresses[0] }} #系統變量 [root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# cat test_filevars.yaml #playbook的執行模板 --- - hosts: all gather_facts: True #開啓系統變量 vars: - myname: "yunjisuan" #自定義變量 tasks: - name: template test template: src=/tmp/test dest=/tmp/test #使用template下發可變配置文件
#執行playbook配置文件 [root@Ansible yangwenbo]# ansible-playbook test_filevars.yaml PLAY [all] ************************************************************************************* TASK [Gathering Facts] ************************************************************************* ok: [Web01] ok: [Web02] TASK [template test] *************************************************************************** changed: [Web01] changed: [Web02] PLAY RECAP ************************************************************************************* Web01 : ok=2 changed=1 unreachable=0 failed=0 Web02 : ok=2 changed=1 unreachable=0 failed=0
#執行結果 [root@Web01 tmp]# pwd /tmp [root@Web01 tmp]# ls test [root@Web01 tmp]# cat test my name is yunjisuan my name is 192.168.200.74 [root@Web02 tmp]# pwd /tmp [root@Web02 tmp]# ls test [root@Web02 tmp]# cat test my name is yunjisuan my name is 192.168.200.75
[root@Ansible tmp]# pwd /tmp [root@Ansible tmp]# ls if.j2 [root@Ansible tmp]# cat if.j2 {% if PORT %} #if PORT存在 ip=0.0.0.0:{{ PORT }} {% else %} #不然的話 ip=0.0.0.0:80 {% endif %} #結尾 [root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# cat test_ifvars.yaml #playbook的執行模板 --- - hosts: all gather_facts: True #開啓系統內置變量 vars: - PORT: 90 #自定義變量 tasks: - name: jinja2 if test template: src=/tmp/if.j2 dest=/root/test
#執行playbook配置文件 [root@Ansible yangwenbo]# ansible-playbook test_ifvars.yaml PLAY [all] ************************************************************************************* TASK [Gathering Facts] ************************************************************************* ok: [Web02] ok: [Web01] TASK [jinja2 if test] ************************************************************************** changed: [Web01] changed: [Web02] PLAY RECAP ************************************************************************************* Web01 : ok=2 changed=1 unreachable=0 failed=0 Web02 : ok=2 changed=1 unreachable=0 failed=0
#執行結果 [root@Web01 tmp]# pwd /tmp [root@Web01 tmp]# ls test [root@Web01 tmp]# cat test ip=0.0.0.0:90 [root@Web02 tmp]# pwd /tmp [root@Web02 tmp]# ls test [root@Web02 tmp]# cat test ip=0.0.0.0:90
[root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# cat test_ifvars.yaml #playbook的執行模板 --- - hosts: all gather_facts: True vars: - PORT: #置爲空 tasks: - name: jinja2 if test template: src=/tmp/if.j2 dest=/root/test
#執行playbook配置文件 [root@Ansible yangwenbo]# ansible-playbook test_ifvars.yaml PLAY [all] ************************************************************************************* TASK [Gathering Facts] ************************************************************************* ok: [Web01] ok: [Web02] TASK [jinja2 if test] ************************************************************************** changed: [Web01] changed: [Web02] PLAY RECAP ************************************************************************************* Web01 : ok=2 changed=1 unreachable=0 failed=0 Web02 : ok=2 changed=1 unreachable=0 failed=0
#執行結果 [root@Web01 tmp]# pwd /tmp [root@Web01 tmp]# ls test [root@Web01 tmp]# cat test ip=0.0.0.0:80 [root@Web02 tmp]# pwd /tmp [root@Web02 tmp]# ls test [root@Web02 tmp]# cat test ip=0.0.0.0:80
#實戰下發可執行動做的可變的nginx配置文件 [root@Ansible tmp]# pwd /tmp [root@Ansible tmp]# ls nginx.j2 [root@Ansible tmp]# cat nginx.j2 worker_processes {{ ansible_processor_count }}; #可變的參數 [root@Ansible yangwenbo]# pwd /root/yangwenbo [root@Ansible yangwenbo]# cat test_nginxvars.yaml #playbook的執行模板 --- - hosts: all gather_facts: True #開啓系統內置變量 tasks: - name: nginx conf template: src=/tmp/nginx.j2 dest=/usr/local/nginx/conf/nginx.conf notify: - reload nginx #下發通知給handlers模塊執行名字叫作reload nginx的動做 handlers: #定義動做 - name: reload nginx #動做的名字 shell: /usr/local/nginx/sbin/nginx -s reload