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 -n1
auto_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 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 /service/scripts || exit 3
cd /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/null
make &>/dev/null
make install &>/dev/null
exit 0
[root@ansible scripts]# cat fenfa.sh #源碼包和安裝腳本的批量分發腳本
#!/bin/sh
#批量分發腳本
Group=$1
ansible $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 hello
Web02 | 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 | head
Web01 | 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: all
gather_facts: True #開啟系統內置變量
vars:
- PORT: 90 #自定義變量
tasks:
- name: jinja2 if test
template: src=/tmp/if.j2 dest=/root/test
ansible-playbook test_ifvars.yaml (下達分發命令)
如果我們將變量PORT值為空的話,就會進入else否則的80端口
---
- hosts: all
gather_facts: True
vars:
- PORT: #置空
tasks:
- name: jinja2 if test
template: src=/tmp/if.j2 dest=/root/test
Playbook下發可變配置文件
#利用template模塊下發可變的配置文件
---
- hosts: all
gather_facts: True #開啟系統變量
vars:
- myname: "yunjisuan" #自定義變量
tasks:
- name: template test
template: src=/tmp/test dest=/root/test #使用template下發可變配置文件
配置文件如果使用copy模塊去下發的話,那配置都是一樣的;
如果下發的配置文件里有可變的配置,需要用到template模塊。
playbook使用register輸出命令運行結果
---
- hosts: all
tasks:
- name: test register
shell: 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: all
vars: #定義變量
- name: "yunjisuan" #第一個name變量
age: "3" #第二個age變量
tasks:
- name: "{{ name }}" #{{}}兩對大括號引用變量,變量名兩頭空格
shell: echo "myname {{ name }},myage {{ age }}"
register: var_result
- debug: var=var_result
---
- hosts: all
gather_facts: True
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
特別提示:
引用變量需要在雙引號中引用。
在使用自定義變量時,我們要特別注意不要和系統的內置保留變量同名,容易引發問題。
Found variable using reserved name: name #name是一個保留的內置變量,我們在自定義時不能用,會有警告
---
- 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
#python取變量方法
a = [1,3,5] --> a[0]=1 #這樣取值就不會帶[]
a = {"sl":123123,"sl1"123321} --> a[sl]=123123 #這樣取值就不會帶[]
playbook的簡單shell模塊的使用
--- #開頭三個小-開頭
- hosts: webB
tasks:
- name: test
shell: echo "welcome to yunjisaun" >> /tmp/username
- name: test2
shell: 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: all
tasks:
- name: test copy
copy: 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.j2
worker_processes {{ ansible_processor_count }}; #可變的參數
#實戰下發可執行動作的可變的nginx配置文件
---------------------------------------------------------------------------
vim test_nginxvars.yaml
---
- 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
ansible-playbook test_nginxvars.yaml (執行分發命令)
nginx配置下發並檢測
---
- 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
ansible的script模塊批量運行腳本
#操作示例-->遠程批量分發並自動部署nginx
#所有被管理端需要掛載光盤,並創建本地yum配置文件
auto_nginx.sh #自動安裝nginx腳本
fenfa.sh #批量分發腳本
nginx-1.10.2.tar.gz #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 /service/scripts || exit 3
cd /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/null
make &>/dev/null
make install &>/dev/null
exit 0
#源碼包和安裝腳本的批量分發腳本
#!/bin/sh
#批量分發腳本
Group=$1
ansible $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
└── vars
7 directories, 2 files
執行簡單的roles任務模型
#執行nginx入口配置文件
[root@ansible myroles]# ansible-playbook nginx.yaml
PLAY [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=0
webB : 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: all
gather_facts: True
tasks: #其實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: yunjisuan
phone: 1800000000
[root@ansible myroles]# cat roles/nginx/tasks/main.yaml
---
- name: check alived
ping:
- 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/test
welcome to yunjisuan
[root@ansible myroles]# cat roles/nginx/files/test.sh
echo "aaa" >> /tmp/test
[root@ansible myroles]# chmod +x roles/nginx/files/test.sh
[root@ansible myroles]# cat roles/nginx/tasks/main.yaml
---
- name: check alived
ping:
- 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.j2
myname 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 alived
ping:
- 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 alived
ping:
- 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
notify: 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: webA
gather_facts: True
tasks:
- name:
copy: src=/tmp/test dest=/root/ #這步造成目標改變才能出發notify
notify: start_nginx
handlers:
- name: start_nginx
shell: /usr/local/nginx/sbin/nginx
[root@ansible myroles]# ansible-playbook /tmp/test.yaml
PLAY [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.yaml
PLAY [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'