ansible批量管理服務工具
ansible批量管理服務工具
批量管理服務器的工具
無須部署agent,通過ssh進行管理流行的自動化運維工具:https://github.con/ansible/ansible
三種批量管理工具
ansible (so easy) 500以下服務器saltstack (比較復雜) 1000到4萬服務器puppet (超級復雜) 只有很老企業在用
jkenkins簡介
可視化運維(主要用在可視化部署)持續構建,可以和git,svn結合(存放開發代碼的倉庫)可結合ssh實現可視化運維可結合ansible實現可視化運維
Ansible服務器簡單的綜合安全管理策略
#禁止非root用戶查看Ansible管理服務器端/etc/hosts文件[root@ansible ~]# ll /etc/hosts-rw-r--r--. 1 root root 180 9月 9 00:38 /etc/hosts[root@ansible ~]# chmod 600 /etc/hosts#禁止非root用戶查看Ansible的主機清單配置文件[root@ansible ~]# ll /etc/ansible/hosts-rw-r--r-- 1 root root 87 9月 9 21:59 /etc/ansible/hosts[root@ansible ~]# chmod 600 /etc/ansible/hosts
ansible查看幫助
/usr/local/python/bin/ansible-doc -l(查看總幫助)/usr/local/python/bin/ansible-doc -s shell(查看shell模塊的幫助)/usr/local/python/bin/ansible-doc -s raw
安裝ansible流程
如果Centos7版本
需要安裝yum -y install net-toolsvim
關閉防火牆:systemctl stop firewalld 關閉防火牆開機啟動:systemctl disable fierwalld
關閉selinux
7.5yum安裝ansible
7.5yum倉庫全可以用,本地的需要自己手動打開
yum -y install epel-release
yum -y install ansible (自動安裝sshpass軟件包)
安裝支持包
yum -y install lrzsz vim net-tools gcc gcc-c++ ncurses ncurses-devel unzip zlib-devel zlib openssl-devel openssl libffi-devel

下載python源碼包
鏈接:https://pan.baidu.com/s/1nE0v2fN6dq4FHfhSTbBnsg
提取碼:ud04需要雲yum
wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz

源碼編譯Python3.5
tar xf Python-3.5.2.tgz -C /usr/src
cd /usr/src/Python-3.5.2
./configure --prefix=/usr/local/python
make && make install
ln -s /usr/local/python/bin/python3 /usr/bin/python3(制作軟鏈接)
which python3(查看命令是否存在)
python3 -V(查詢python版本)

靜心等待ansible安裝完畢后
ln -s /usr/local/python/bin/ansible /usr/local/bin(制作軟鏈接)
which ansible(查看命令是否存在)
ansible --version(查看ansible版本)

ansible的簡單配置
通過pip安裝的ansible是沒有配置文件的
mkdir -p /etc/ansible(默認沒有,需要手動創建)
vim /etc/ansible/hosts(默認沒有,需要手動創建)

ansible命令使用格式
ansible -i 主機或主機組 -m 指定模塊 -a 命令 (-i指定配置文件,不寫就默認路徑下/etc/ansible/hosts,-m指定模塊,-a發布命令)
command模塊發布命令使用格式
(對方需要有python包,發布命令)
ansible nginx -m command -a 'hostname -I'
(分發模塊內容格式,nginx是模塊名,-a是條件,-m command是調用ansible里面的模塊發布命令用)ansible client2 -m command -a 'hostname -I'
(分發單個主機格式,client2是主機名,-a是條件,-m command是調用ansible里面的模塊發布命令用)ansible client1 -m command -a 'hostname -I'
(分發單個主機格式,client1是主機名,-a是條件,-m command是調用ansible里面的模塊發布命令用)ansible client1:client2 -m command -a 'hostname -I'
(分發多個主機格式,client1:client2是主機名,-a是條件,-m command是調用ansible里面的模塊發布命令用)ansible all -m command -a 'hostname -I'
(all是分發所有主機格式,-a是條件,-m command是調用ansible里面的模塊發布命令用)


ping模塊發布命令使用格式
(對方需要有python包)
ping模塊檢查服務器是否連接正常,ping模塊不需要-a指定參數
ansible all -m ping (ansible的ping模塊格式)

shell模塊發布命令使用格式
(對方需要有python包)
shell模塊支持管道符格式
ansible all -m shell -a 'echo test | grep t'shell模塊支持重定向格式
ansible all -m shell -a "echo bb >> /tmp/testansible"shell模塊支持awk格式
ansible all -m shell -a "cat /etc/passwd | awk -F":" '{print $1}'" (如果遇到特殊符號需要加入\轉義)



raw模塊使用格式僅通過ssh實現
(不依賴python包)

copy模塊注意事項
yum -y install libselinux-python(傳送失敗的話說明對方沒有這個支持包)
copy模塊拷貝文件目錄使用格式
ansible all -m copy -a 'src=/root/xin dest=/tmp'
(src源文件,dest目標位置,對方沒有目錄模塊自動創建)


ansible all -m copy -a 'src=/root/xin dest=/tmp backup=yes'
(src源文件,dest目標位置,backup=yes覆蓋同時是否備份源文件)


ansible all -m copy -a 'src=/root/xin dest=/tmp owner=nobody group=nobody mode=0600'
(owner=屬主是誰,group=屬組是誰,mode=它權限)


script模塊批量運行腳本使用格式
ansible all -m script -a "/service/scripts/auto_nginx.sh"
#操作示例-->遠程批量分發並自動部署nginx#所有被管理端需要掛載光盤,並創建本地yum配置文件[root@ansible scripts]# pwd/service/scripts[root@ansible scripts]# ls | xargs -n1auto_nginx.sh #自動安裝nginx腳本fenfa.sh #批量分發腳本nginx-1.10.2.tar.gz #nginx源碼包[root@ansible scripts]# cat auto_nginx.sh #nginx安裝腳本#!/bin/sh#nginx install shell scriptstest -d /media/cdrom || mkdir -p /media/cdrommount /dev/sr0 /media/cdrom &>/dev/nullyum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel &>/dev/nulltest -d /service/scripts || exit 3cd /service/scripts/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/nullmake &>/dev/nullmake install &>/dev/nullexit 0[root@ansible scripts]# cat fenfa.sh #源碼包和安裝腳本的批量分發腳本#!/bin/sh#批量分發腳本Group=$1ansible $Group -m copy -a "src=/service/scripts/ dest=/service/scripts/"ansible $Group -m script -a "/service/scripts/auto_nginx.sh"[root@ansible scripts]# sh fenfa.sh all #激活腳本
cron定時任務模塊
Ansible中的cron模塊用於定義任務計划。主要包括兩種狀態(state)

#添加定時任務計划,在所有被管理的主機里每十分鍾輸出hello字符串,定時任務描述為test cron job[root@ansible ~]# ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"'Web02 | SUCCESS => {"changed": true,"envs": [],"jobs": ["test cron job"]}Web01 | SUCCESS => {"changed": true,"envs": [],"jobs": ["test cron job"]}[root@ansible ~]# ansible all -m shell -a 'crontab -l'Web01 | SUCCESS | rc=0 >>#Ansible: test cron job*/10 * * * * /bin/echo helloWeb02 | SUCCESS | rc=0 >>#Ansible: test cron job*/10 * * * * /bin/echo hello#刪除描述為test cron job的定時任務[root@ansible ~]# ansible all -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state=absent'Web02 | SUCCESS => {"changed": true,"envs": [],"jobs": []}Web01 | SUCCESS => {"changed": true,"envs": [],"jobs": []}[root@ansible ~]# ansible all -m shell -a 'crontab -l'Web02 | SUCCESS | rc=0 >>Web01 | SUCCESS | rc=0 >>#給Web01服務器上的普通用戶yunjisuan添加一個定時任務[root@ansible ~]# ansible Web01 -m shell -a 'id yunjisuan'Web01 | SUCCESS | rc=0 >>uid=1000(yunjisuan) gid=1000(yunjisuan) 組=1000(yunjisuan)[root@ansible ~]# ansible Web01 -m cron -a 'minute="*/10" job="/bin/echo hello" name="yunjisuan cron job" user="yunjisuan"'Web01 | SUCCESS => {"changed": true,"envs": [],"jobs": ["yunjisuan cron job"]}[root@ansible ~]# ansible Web01 -m shell -a 'crontab -u yunjisuan -l'Web01 | SUCCESS | rc=0 >>#Ansible: yunjisuan cron job*/10 * * * * /bin/echo hello[root@ansible ~]# ansible Web01 -m cron -a 'minute="*/10" job="/bin/echo hello" name="yunjisuan cron job" user="yunjisuan" state="absent"'Web01 | SUCCESS => {"changed": true,"envs": [],"jobs": []}[root@ansible ~]# ansible Web01 -m shell -a 'crontab -u yunjisuan -l'Web01 | SUCCESS | rc=0 >>
yum模塊批量安裝軟件包
利用yum模塊安裝軟件包,雖然能被shell模塊替代,但是用yum模塊更顯專業一些

user模塊批量創建用戶
用戶管理模塊。管理用戶賬號

#在Web02上創建一個普通用戶yunjisuan,並設置用戶的密碼為123123[root@ansible ~]# ansible Web02 -m user -a 'name=yunjisuan comment="welcom to yunjisuan" uid=1066 groups=wheel password=123123 shell=/bin/bash home=/home/yunjisuan'Web02 | SUCCESS => {"changed": true,"comment": "welcom to yunjisuan","create_home": true,"group": 1066,"groups": "wheel","home": "/home/yunjisuan","name": "yunjisuan","password": "NOT_LOGGING_PASSWORD","shell": "/bin/bash","state": "present","system": false,"uid": 1066}[root@ansible ~]# ansible Web02 -m shell -a 'tail -1 /etc/passwd'Web02 | SUCCESS | rc=0 >>yunjisuan:x:1066:1066:welcom to yunjisuan:/home/yunjisuan:/bin/bash[root@ansible ~]# ansible Web02 -m shell -a 'tail -1 /etc/shadow'Web02 | SUCCESS | rc=0 >>yunjisuan:123123:17783:0:99999:7::: #密碼居然是明文!!!
利用ansible的user模塊狀態用戶時要注意在password參數的后邊添加密文,否則不能登陸用戶
通過Python的pip程序安裝passlib即可為密碼加密
#安裝Python2的pip工具,並通過pip工具安裝Python的加密模塊來給密碼加密[root@ansible ~]# yum -y install epel-release[root@ansible ~]# yum -y install python2-pip[root@ansible ~]# pip install passlib#生成密文密碼[root@ansible ~]# python -c "from passlib.hash import sha512_crypt;import getpass;print sha512_crypt.encrypt(getpass.getpass())"Password: #輸入你想要加密的密碼$6$rounds=656000$Tw15COd8DLh/VS94$Mcmz/8CcjBKiEl0mYHcOQQCxEA5mz66EcGH2qXVk6o.Sm7FsRS.DsDVy6ET8iI6jDa045I94slZqWFwyYnRSW1 #加密后的密碼#刪除之前創建的yunjisuan用戶,並刪除它的家目錄[root@ansible ~]# ansible Web02 -m user -a 'name=yunjisuan state=absent remove=true'Web02 | SUCCESS => {"changed": true,"force": false,"name": "yunjisuan","remove": true,"state": "absent"}#繼續在Web02上創建yunjisuan用戶[root@ansible ~]# ansible Web02 -m user -a 'name=yunjisuan comment="welcom to yunjisuan" uid=1066 groups=wheel password=$6$rounds=656000$Tw15COd8DLh/VS94$Mcmz/8CcjBKiEl0mYHcOQQCxEA5mz66EcGH2qXVk6o.Sm7FsRS.DsDVy6ET8iI6jDa045I94slZqWFwyYnRSW1 shell=/bin/bash' home=/home/yunjisuan'[root@ansible ~]# ansible Web02 -m shell -a 'tail -1 /etc/shadow'Web02 | SUCCESS | rc=0 >>yunjisuan:$6$rounds=656000$Tw15COd8DLh/VS94$Mcmz/8CcjBKiEl0mYHcOQQCxEA5mz66EcGH2qXVk6o.Sm7FsRS.DsDVy6ET8iI6jDa045I94slZqWFwyYnRSW1:17783:0:99999:7::: #終於密文了
setup模塊批量查看服務的所有屬性
Ansible中使用setup模塊收集,查看被管理主機的facts(facts是Ansible采集被管理主機設備信息的一個功能)。每個被管理主機在接收並運行管理命令之前,都會將自己的相關信息(操作系統版本,IP地址等)發送給控制主機
#查看遠程主機的facts信息[root@ansible ~]# ansible Web01 -m setup | headWeb01 | SUCCESS => {"ansible_facts": {"ansible_all_ipv4_addresses": ["192.168.200.184"],"ansible_all_ipv6_addresses": ["fe80::20c:29ff:fe77:16ad"],"ansible_apparmor": {"status": "disabled"
ansible-playbook的初步使用
playbook可以把ansible的模塊進行組合
ln -s /usr/local/python/bin/ansible-playbook /usr/local/bin (優先制作軟鏈接)shell模塊支持很多模式,copy模塊分發文件或目錄,register模塊輸出命令運行結果,nginx_conf配置下發並檢測,vars自定義變量,setupvars內置變量,filevars可變配置文件vim test_shell[copy,register,nginx_conf,vars,setupvars,filevars].yaml (執行模板)ansible-playbook test_shell[copy,register,nginx_conf,vars,setupvars,filevars].yaml (執行配置文件)我們可以使用ansible all -m setup | less (查看ansible內置變量)vim if.j2 (下發配置文件模板樣式)
下發配置文件里面使用判斷語法
vim /tmp/if.j2{% if PORT %} #if PORT存在ip=0.0.0.0:{{ PORT }}{% else %} #否則的話ip=0.0.0.0:80{% endif %} #結尾vim test_ifvars.yaml---- hosts: allgather_facts: True #開啟系統內置變量vars:- PORT: 90 #自定義變量tasks:- name: jinja2 if testtemplate: src=/tmp/if.j2 dest=/root/testansible-playbook test_ifvars.yaml (下達分發命令)如果我們將變量PORT值為空的話,就會進入else否則的80端口---- hosts: allgather_facts: Truevars:- PORT: #置空tasks:- name: jinja2 if testtemplate: src=/tmp/if.j2 dest=/root/test
Playbook下發可變配置文件
#利用template模塊下發可變的配置文件---- hosts: allgather_facts: True #開啟系統變量vars:- myname: "yunjisuan" #自定義變量tasks:- name: template testtemplate: src=/tmp/test dest=/root/test #使用template下發可變配置文件
配置文件如果使用copy模塊去下發的話,那配置都是一樣的;
如果下發的配置文件里有可變的配置,需要用到template模塊。
playbook使用register輸出命令運行結果
---- hosts: alltasks:- name: test registershell: echo "welcome to yunjisuan"register: print_result #將之前命令的輸出結果保存在變量print_result里- debug: var=print_result #將變量的值作為debug輸出出來。我們在用playbook進行ansible模塊操作的時候,並沒有命令的執行結果輸出,默認被隱藏了我們可以通過register模塊追加輸出命令的執行結果
playbook的自定義變量和內置變量
我們可以使用ansible all -m setup | less查看ansible內置變量
---- hosts: allvars: #定義變量- name: "yunjisuan" #第一個name變量age: "3" #第二個age變量tasks:- name: "{{ name }}" #{{}}兩對大括號引用變量,變量名兩頭空格shell: echo "myname {{ name }},myage {{ age }}"register: var_result- debug: var=var_result
---- hosts: allgather_facts: Truetasks:- name: setup varshell: echo "ip {{ ansible_all_ipv4_addresses[0] }} cpu {{ ansible_processor_count }}" >> /tmp/test- name: setup var2shell: echo "time {{ ansible_date_time["date"] }}" >> /tmp/testregister: var_result- debug: var=var_result特別提示:引用變量需要在雙引號中引用。在使用自定義變量時,我們要特別注意不要和系統的內置保留變量同名,容易引發問題。Found variable using reserved name: name #name是一個保留的內置變量,我們在自定義時不能用,會有警告
---- hosts: allgather_facts: True #使用ansible內置變量tasks:- name: setup varshell: echo "ip {{ ansible_all_ipv4_addresses[0] }} cpu {{ ansible_processor_count }}" >> /tmp/test- name: setup var2shell: echo "time {{ ansible_date_time["date"] }}" >> /tmp/testregister: var_result- debug: var=var_result#python取變量方法a = [1,3,5] --> a[0]=1 #這樣取值就不會帶[]a = {"sl":123123,"sl1"123321} --> a[sl]=123123 #這樣取值就不會帶[]
playbook的簡單shell模塊的使用
--- #開頭三個小-開頭- hosts: webBtasks:- name: testshell: echo "welcome to yunjisaun" >> /tmp/username- name: test2shell: echo "welcome to yunjisuan" >> /tmp/username模板說明:--- #開頭必須有三個小-,頂格寫- hosts: #正文配置代碼的第一級,必須有兩個空格(-占一個空格位)- host: webB #webB是host參數的值,值和hosts:之間要有一個空格tasks: #tasks:表示接下來要執行的具體任務- name: #相對於tasks再多縮進兩個格(-占一個空格位),表示屬於tasks的下一級- name: test #test只是要執行的具體命令的名字可以隨便寫。name:后還是有一個空格要注意shell: #表示調用shell模塊執行命令相對於tasks仍舊要多縮進兩個空格shell: echo "xxx" >> xxx #shell:后邊還是要有個空格,需要注意。
playbook的簡單copy模塊的使用
---- hosts: alltasks:- name: test copycopy: src=/tmp/copy_test dest=/tmp/模板說明:--- #開頭必須有三個小-,頂格寫- hosts: #正文配置代碼的第一級,必須有兩個空格(-占一個空格位)tasks: #tasks:表示接下來要執行的具體任務- name: test #test只是要執行的具體命令的名字可以隨便寫。name:后還是有一個空格要注意copy: src=/tmp/copy_test dest=/tmp/ #把源文件拷貝到對方的位置
Playbook的notify通知和下發nginx配置
vim nginx.j2worker_processes {{ ansible_processor_count }}; #可變的參數#實戰下發可執行動作的可變的nginx配置文件---------------------------------------------------------------------------vim test_nginxvars.yaml---- hosts: allgather_facts: True #開啟系統內置變量tasks:- name: nginx conftemplate: src=/tmp/nginx.j2 dest=/usr/local/nginx/conf/nginx.confnotify:- reload nginx #下發通知給handlers模塊執行名字叫做reload nginx的動作handlers: #定義動作- name: reload nginx #動作的名字shell: /usr/local/nginx/sbin/nginx -s reloadansible-playbook test_nginxvars.yaml (執行分發命令)
nginx配置下發並檢測
---- hosts: alltasks:- name: copy nginx.confcopy: src=/tmp/nginx.conf dest=/usr/local/nginx/conf/ backup=yes- name:shell: /usr/local/nginx/sbin/nginx -tregister: nginx_result- debug: var=nginx_result
ansible的script模塊批量運行腳本
#操作示例-->遠程批量分發並自動部署nginx#所有被管理端需要掛載光盤,並創建本地yum配置文件auto_nginx.sh #自動安裝nginx腳本fenfa.sh #批量分發腳本nginx-1.10.2.tar.gz #nginx源碼包#!/bin/sh#nginx install shell scriptstest -d /media/cdrom || mkdir -p /media/cdrommount /dev/sr0 /media/cdrom &>/dev/nullyum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel &>/dev/nulltest -d /service/scripts || exit 3cd /service/scripts/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/nullmake &>/dev/nullmake install &>/dev/nullexit 0#源碼包和安裝腳本的批量分發腳本#!/bin/sh#批量分發腳本Group=$1ansible $Group -m copy -a "src=/service/scripts/ dest=/service/scripts/"ansible $Group -m script -a "/service/scripts/auto_nginx.sh"
使用roles標准化Playbook
roles功能可以用來規范playbook的編寫
創建所需要的roles原型目錄結構
#創建roles基本原型的目錄結構[root@ansible myroles]# tree /myroles//myroles/├── nginx.yaml #入口觸發配置文件└── roles #playbook的原型配置目錄└── nginx #nginx相關模組配置目錄├── files #copy模塊和script模塊的參數src默認會從這個文件夾查找├── handlers #用來存放notify的├── tasks #用來存放ansible模塊任務的├── templates #用來存放j2的└── vars #用來存放變量的7 directories, 1 file#入口觸發配置文件[root@ansible myroles]# cat /myroles/nginx.yaml---- hosts: all #執行的主機范圍gather_facts: True #開啟系統內置變量roles: #啟用roles原型配置- nginx #執行nginx原型模組
roles中tasks任務編排模組的使用
#在nginx模組添加tasks任務配置文件[root@ansible myroles]# cat roles/nginx/tasks/main.yaml---- name: check alived #任務1的名字ping: #執行ping模塊- name: #任務2的名字shell: ls / #執行shell模塊register: ls_result #將執行結果保存給變量- debug: var=ls_result #變量的值賦值給debug進行輸出#完成后的目錄結構如下所示[root@ansible myroles]# tree /myroles//myroles/├── nginx.yaml #nginx模組入口配置文件└── roles└── nginx #nginx原型模組目錄├── files├── handlers├── tasks│ └── main.yaml #nginx模組的tasks任務配置文件├── templates└── vars7 directories, 2 files
執行簡單的roles任務模型
#執行nginx入口配置文件[root@ansible myroles]# ansible-playbook nginx.yamlPLAY [all] ****************************************************************************************************TASK [Gathering Facts] ****************************************************************************************ok: [webA]ok: [webB]TASK [nginx : check alived] ***********************************************************************************ok: [webA]ok: [webB]TASK [nginx : shell] ******************************************************************************************changed: [webA]changed: [webB]TASK [nginx : debug] ******************************************************************************************ok: [webA] => {"ls_result": {"changed": true,"cmd": "ls /","delta": "0:00:00.002805","end": "2018-06-21 11:52:29.343592","failed": false,"rc": 0,"start": "2018-06-21 11:52:29.340787","stderr": "","stderr_lines": [],"stdout": "bin\nboot\ndev\netc\nhome\nlib\nlib64\nmedia\nmnt\nopt\nproc\nroo\nroot\nrun\nsbin\nservice\nsrv\nsys\ntmp\nusr\nvar","stdout_lines": ["bin","boot","dev","etc","home","lib","lib64","media","mnt","opt","proc","roo","root","run","sbin","service","srv","sys","tmp","usr","var"]}}ok: [webB] => {"ls_result": {"changed": true,"cmd": "ls /","delta": "0:00:00.002708","end": "2018-06-21 11:52:29.359754","failed": false,"rc": 0,"start": "2018-06-21 11:52:29.357046","stderr": "","stderr_lines": [],"stdout": "bin\nboot\ndev\netc\nhome\nlib\nlib64\nmedia\nmnt\nopt\nproc\nroo\nroot\nrun\nsbin\nservice\nsrv\nsys\ntmp\nusr\nvar","stdout_lines": ["bin","boot","dev","etc","home","lib","lib64","media","mnt","opt","proc","roo","root","run","sbin","service","srv","sys","tmp","usr","var"]}}PLAY RECAP ****************************************************************************************************webA : ok=4 changed=1 unreachable=0 failed=0webB : ok=4 changed=1 unreachable=0 failed=0
ansible-playbook執行入口配置文件nginx.yaml后,它會自動在roles目錄下查找nginx目錄並進入后查找tasks任務目錄並執行main.yaml的任務配置文件。
其實,這個roles的操作等效於以下配置
#本配置和之前的roles配置等效[root@ansible myroles]# cat /service/scripts/test.yaml---- hosts: allgather_facts: Truetasks: #其實roles的本質就是將tasks任務單獨寫了。- name: check alived #並在入口文件里追加了roles去查找tasks配置文件路徑ping:- name:shell: ls /register: ls_result- debug: var=ls_result
roles中vars自定義變量模組的使用
#創建自定義變量vars模組的配置文件[root@ansible myroles]# cat roles/nginx/vars/main.yaml---my_name: yunjisuanphone: 1800000000[root@ansible myroles]# cat roles/nginx/tasks/main.yaml---- name: check alivedping:- name:shell: ls /register: ls_result- debug: var=ls_result- name: #添加對變量引用的任務編排shell: echo my phone is {{ phone }}register: echo_result- debug: var=echo_result[root@ansible myroles]# ansible-playbook nginx.yaml #執行入口配置文件
使用copy,script模塊的標准化
roles模型里使用copy,script模塊,默認從roles/nginx/files這里面找
[root@ansible myroles]# cat roles/nginx/files/testwelcome to yunjisuan[root@ansible myroles]# cat roles/nginx/files/test.shecho "aaa" >> /tmp/test[root@ansible myroles]# chmod +x roles/nginx/files/test.sh[root@ansible myroles]# cat roles/nginx/tasks/main.yaml---- name: check alivedping:- name:shell: ls /register: ls_result- debug: var=ls_result- name:shell: echo my phone is {{ phone }}register: echo_result- debug: var=echo_result- name: #添加copy模塊copy: src=test dest=/root/- name: #添加script模塊(自動在目標IP機器上執行腳本)script: test.sh[root@ansible myroles]# ansible-playbook nginx.yaml
roles中template模塊的使用
roles模型里使用template模塊,默認從roles/nginx/template里面找
[root@ansible myroles]# cat roles/nginx/templates/test.j2myname is {{ my_name }},my phone is {{ phone }} #引用自定義變量my ipaddress is {{ansible_all_ipv4_addresses[0]}} #引用內置變量[root@ansible myroles]# cat roles/nginx/tasks/main.yaml---- name: check alivedping:- name:shell: ls /register: ls_result- debug: var=ls_result- name:shell: echo my phone is {{ phone }}register: echo_result- debug: var=echo_result- name:copy: src=test dest=/root/- name:script: test.sh- name:template: src=test.j2 dest=/root/test2 #下發可變配置文件[root@ansible myroles]# ansible-playbook nginx.yaml
roles中notify模塊的使用
roles使用notify模塊,默認從roles/nginx/handles里面找
[root@ansible myroles]# cat roles/nginx/handlers/main.yaml---- name: start_nginx #定義handlers的動作類型shell: /usr/local/nginx/sbin/nginx- name: stop_nginx #定義handlers的動作類型shell: /usr/local/nginx/sbin/nginx -s stop- name: reload_nginx #定義handlers的動作類型shell: /usr/local/nginx/sbin/nginx -s reload[root@ansible myroles]# cat roles/nginx/tasks/main.yaml---- name: check alivedping:- name:shell: ls /register: ls_result- debug: var=ls_result- name:shell: echo my phone is {{ phone }}register: echo_result- debug: var=echo_result- name:copy: src=test dest=/root/- name:script: test.sh- name:template: src=test.j2 dest=/root/test2notify: start_nginx #執行template任務后下發通知給handlers執行start_nginx[root@ansible myroles]# ansible-playbook nginx.yaml
特別提示:
notify下發通知只有當之前的任務造成了變化那么才會被執行,如果沒有發生任何改變,則notify不會被執行。例如:
#tasks任務造成改變,觸發notify[root@ansible myroles]# cat /tmp/test.yaml---- hosts: webAgather_facts: Truetasks:- name:copy: src=/tmp/test dest=/root/ #這步造成目標改變才能出發notifynotify: start_nginxhandlers:- name: start_nginxshell: /usr/local/nginx/sbin/nginx[root@ansible myroles]# ansible-playbook /tmp/test.yamlPLAY [webA] ***************************************************************************************************TASK [Gathering Facts] ****************************************************************************************ok: [webA]TASK [copy] ***************************************************************************************************changed: [webA] #發生了改變RUNNING HANDLER [start_nginx] #觸發notify *********************************************************************************changed: [webA]PLAY RECAP ****************************************************************************************************webA : ok=3 changed=2 unreachable=0 failed=0#我們再次執行/tmp/test.yaml[root@ansible myroles]# ansible-playbook /tmp/test.yamlPLAY [webA] ***************************************************************************************************TASK [Gathering Facts] ****************************************************************************************ok: [webA]TASK [copy] ***************************************************************************************************ok: [webA] #沒有造成任務改變,未觸發notify通知PLAY RECAP ****************************************************************************************************webA : ok=2 changed=0 unreachable=0 failed=0
ansible批量管理企業案例
4.1 ansible all -m copy -a 'src=/root/xin.sh dest=/root'
4.2 ansible all -m user -a 'name=yunjisuan shell=/sbin/nologin createhome=no'
4.3 ansible all -m shell -a 'echo "123123" | pass --stdin root'
4.4 ansible all -m user -a 'name=benet password=321321 shell=/bin/bash'
4.5 ansible all -m cron -a 'job="/bin/echo xin > /tmp/sl" name="test cron job"'
4.6 ansible all -m shell -a 'vmstat'

