運維自動化發展歷程及技術應用
- IAAS基礎設置即服務,提供硬件服務
- PAAS平臺即服務,提供操作系統服務
- SAAS軟件即服務,提供整套服務
ansible的安裝
yum -y install ansible
ansible –version 查看版本信息
/etc/ansible/ansible.cfg? 配置文件
/etc/ansible/hosts?????? 控制的主機列表
/etc/ansible/roles?????? 角色
添加主機清單,在/etc/ansible/hosts文件中添加主機
可以以分組添加形式添加,如:
連接被控制的主機,ansible是基于ssh協議,
[root@centos7 ~]#ansible appsrv -m ping -k
appsrv代表配置文件中定義的主機列表,-m表示模塊,-k提供用戶名口令
ansible all -m ping??????? all代表所有主機
ansible 配置文件
Ansible配置文件/etc/ansible/ansible.cfg(一般保持默認)
[defaults]
#inventory = /etc/ansible/hosts # 主機列表配置文件
#library = /usr/share/my_modules/ # 庫文件存放目錄
#remote_tmp= $HOME/.ansible/tmp#臨時py命令文件存放在遠程主機目錄
#local_tmp= $HOME/.ansible/tmp# 本機的臨時命令執行目錄
#forks = 5 # 默認并發數
#sudo_user= root # 默認sudo用戶
#ask_sudo_pass= True #每次執行ansible命令是否詢問ssh密碼
#ask_pass= True
#remote_port= 22
#host_key_checking= False # 檢查對應服務器的host_key,建議取消注釋??? 建議開啟
#log_path=/var/log/ansible.log#日志文件??????????????????????????????? 建議開啟
ansible-doc:顯示模塊幫助
Ansible-doc -a 顯示所有模塊的文檔
Ansible-doc -l? 列出可用模塊
Ansible-doc -s? 顯示指定模塊的playbook片段
例:ansible-doc ping 顯示ping模塊的用
ansible<host-pattern> [-m module_name] [-a args]
–version 顯示版本
-m module指定模塊,默認為command
-v 詳細過程–vv-vvv更詳細
–list-hosts 顯示主機列表,可簡寫—list
-k, –ask-pass 提示連接密碼,默認Key驗證
-K, –ask-become-pass 提示輸入sudo
-C, –check 檢查,并不執行
-T, –timeout=TIMEOUT 執行命令的超時時間,默認10s
-u, –user=REMOTE_USER 執行遠程執行的用戶
-b, –become 代替舊版的sudo切換
例:–list-hosts顯示主機列表
[root@centos7 .ssh]#ansible all –list-hosts
hosts (3):
192.168.67.131
192.168.67.132
192.168.67.53
[root@centos7 .ssh]#ansible appsrv –list-hosts
hosts (2):
192.168.67.131
192.168.67.132
基于key驗證,用戶不用輸入密碼
ssh-keygen
Ssh-copy-id hostIP? 分別輸入不同主機ip
[root@centos7 .ssh]#ansible all -m ping
192.168.67.131 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
192.168.67.53 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
192.168.67.132 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
ansible的Host-pattern
匹配主機的列表
All :表示所有Inventory中的所有主機
ansibleall –m ping
* :通配符
ansible“*” -m ping
ansible192.168.1.* -m ping
ansible“*srvs” -m ping
或關系
ansible“websrvs:appsrvs” -m ping
ansible“192.168.1.10:192.168.1.20” -m ping
邏輯與
ansible“websrvs:&dbsrvs” –m ping
在websrvs組并且在dbsrvs組中的主機
邏.非
ansible‘websrvs:!dbsrvs’ –m ping
在websrvs組,但不在dbsrvs組中的主機
綜合邏輯
ansible‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
正則表達式
ansible“websrvs:&dbsrvs” –m ping
ansible“~(web|db).*\.magedu\.com” –m ping
ansible 模塊介紹
?command模塊為默認模塊,可以省略不寫
[root@centos7 .ssh]#ansible all -a ‘creates=/etc/passwd cat /etc/fstab’
192.168.67.53 | SUCCESS | rc=0 >>
skipped, since /etc/passwd exists
192.168.67.131 | SUCCESS | rc=0 >>
skipped, since /etc/passwd exists
192.168.67.132 | SUCCESS | rc=0 >>
skipped, since /etc/passwd exists
creates=/etc/passwd 表示如果文件存在,后面的命令不執行
removes=/etc/passwd 表示如果文件不存在,后面的命令不執行
[root@centos7 .ssh]#ansible all -a ‘chdir=/boot ls’?? 查看boot目錄
command不支持重定向、變量、管道,shell模塊支持
如:
[root@centos7 .ssh]#ansible all -a ‘echo $HOSTNAME’
192.168.67.53 | SUCCESS | rc=0 >>
$hostname
192.168.67.131 | SUCCESS | rc=0 >>
$hostname
192.168.67.132 | SUCCESS | rc=0 >>
$hostname
shell模塊,
[root@centos7 .ssh]#ansible all -m shell -a ‘echo $HOSTNAME’
192.168.67.53 | SUCCESS | rc=0 >>
centos6.91
192.168.67.131 | SUCCESS | rc=0 >>
centos6.9
192.168.67.132 | SUCCESS | rc=0 >>
centos7.5
script模塊,本機的腳本在所有主機上執行
[root@centos7 data]#vim host.sh
[root@centos7 data]#chmod +x host.sh
[root@centos7 data]#ansible all -m script -a ‘/data/host.sh’
192.168.67.131 | SUCCESS => {
“changed”: true,
“rc”: 0,
“stderr”: “Shared connection to 192.168.67.131 closed.\r\n”,
“stdout”: “centos6.9\r\n”,
“stdout_lines”: [
“centos6.9”
]
}
copy模塊,將本機的文件復制到遠程
ansible-doc copy
例:關閉所有主機selinux
[root@centos7 data]#ansible all -m shell -a ‘getenforce’
192.168.67.53 | SUCCESS | rc=0 >>
Disabled
192.168.67.131 | SUCCESS | rc=0 >>
Disabled
192.168.67.132 | SUCCESS | rc=0 >>
Enforcing
[root@centos7 data]#ansible all -m shell -a ‘ls -l /etc/sysconfig/selinux’
192.168.67.53 | SUCCESS | rc=0 >>
lrwxrwxrwx. 1 root root 17 Apr 29 20:18 /etc/sysconfig/selinux -> ../selinux/config
192.168.67.131 | SUCCESS | rc=0 >>
lrwxrwxrwx. 1 root root 17 Apr? 8 12:34 /etc/sysconfig/selinux -> ../selinux/config
192.168.67.132 | SUCCESS | rc=0 >>
lrwxrwxrwx. 1 root root 17 May 29 04:03 /etc/sysconfig/selinux -> ../selinux/config
復制配置好的文件到所有遠程主機(要注意版本不同)
ansible all -m copy -a ‘src=/data/config dest=/etc/selinux/ backup=yes’
ansible all -m shell -a ‘reboot’
[root@centos7 data]#ansible all -a ‘getenforce’
192.168.67.131 | SUCCESS | rc=0 >>
Disabled
192.168.67.132 | SUCCESS | rc=0 >>
Disabled
192.168.67.53 | SUCCESS | rc=0 >>
Disabled
例:生成一個文件并且指定內容
[root@centos7 data]#ansible all -m copy -a ‘content=”hello\nhi” dest=/data/file’
[root@centos7 data]#ansible all -a ‘cat /data/file’
192.168.67.53 | SUCCESS | rc=0 >>
hello
hi
192.168.67.131 | SUCCESS | rc=0 >>
hello
hi
192.168.67.132 | SUCCESS | rc=0 >>
hello
hi
fecth模塊,從遠程主機抓取單個文件,暫時不能是目錄
[root@centos7 data]#ansible all -m fetch -a ‘src=/var/log/messages dest=/data/’
dest=/data/表示本機目錄
[root@centos7 data]#tree /data
/data
├── 192.168.67.131
│?? └── var
│?????? └── log
│?????????? └── messages
├── 192.168.67.132
│?? └── var
│?????? └── log
│?????????? └── messages
└── 192.168.67.53
└── var
└── log
└── messages
9 directories, 3 files
如果需要抓取多個文件??梢詫⑽募却虬缓笞ト?/p>
file模塊,設置文件屬性
[root@centos7 data]#ansible all -m file -a ‘dest=/data/f1 state=touch’??????? 創建文件
state=touch、absent、directory、link?? absent表示刪除、directory表示創建文件夾
dest 、name、 path三個單詞效果是等價
創建鏈接
[root@centos7 data]#ansible all -m file -a ‘src=/etc/fstab dest=/data/fstab.link state=link’
刪除鏈接
[root@centos7 data]#ansible all -m file -a ‘dest=/data/fstab.link state=absent’
hostname模塊,更改主機名
ansible 192.168.67.53 -m hostname -a ‘name=centos6’
cron模塊,創建計劃任務
ansible all -m cron -a ‘minute=* weekday=1,3,5 job=”/usr/bin/wall hello how are you !” name=notice’
禁用計劃任務
ansible all -m cron -a ‘disabled=true job=”/usr/bin/wall hello how are you !” name=notice’
job和name都需要指定,
刪除計劃任務
ansible all -m cron -a ‘job=”/usr/bin/wall how are you !” name=notice state=absent’
yum模塊
ansible all -m yum -a ‘name=vsftpd’? 安裝vsftp
ansible all -m yum -a ‘name=vsftpd state=removed’? 卸載
批量安裝包ansible all -m yum -a ‘name=vsftpd,dhcp,http’
批量卸載,同上
單獨安裝某個包,假設此包在ansible客戶端上沒有
- 把安裝包復制到客戶端上
ansible all -m copy -a ‘src=/data/tree-1.6.0-10.el7.x86_64.rpm dest=/root’
- 安裝
ansible all -m yum -a ‘name=/root/tree-1.6.0-10.el7.x86_64.rpm disable_gpg_check=yes’
清除yum緩存
ansible all -m yum -a ‘name=dstat update_cache=yes’
service模塊,管理服務
ansible all -m service -a ‘name=vsftpd state=started enabled=yes’? 啟動服務,并且開機啟動
restarted ,stop
user模塊
創建nginx系統用戶
[root@centos7 data]#ansible all -m user -a ‘name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=110’
刪除用戶并刪除家目錄
ansible all -m user -a ‘name=nginx state=absent remove=yes’
group管理組
創建組
ansible all -m group -a ‘name=wang system=yes gid=110’
刪除組
ansible all -m group -a ‘name=wang system=yes state=absent’
ansible-galaxy
連接https://galaxy.ansible.com 下載相應的roles
列出所有已安裝的galaxy
ansible-galaxy list
安裝galaxy
ansible-galaxy install geerlingguy.redis
刪除galaxy
ansible-galaxy remove geerlingguy.redis
?
ansible-vault
功能:管理加密解密yml文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml 加密
ansible-vault decrypt hello.yml 解密
ansible-vault view hello.yml 查看
ansible-vault edit hello.yml 編輯加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create new.yml 創建新文件
ansible-console:2.0+新增,可交互執行命令,支持tab
root@test(2)[f:10] $
執行用戶@當前操作的主機組(當前組的主機數量)[f:并發數]$
設置并發數:forks n 例如:forks 10
切換.:cd 主機組例如:cd web
列出當前組主機列表:list
列出所有的內置:?或help
示例:
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appsrvs
root@appsrvs (2)[f:5]$ list
root@appsrvs(2)[f:5]$ yum name=httpdstate=present
root@appsrvs(2)[f:5]$ service name=httpdstate=started
playbook的編寫
—
– hosts: appsrv
remote_user: root
tasks:
– name: install httpd
yum: name=httpd
– name: install configure file
copy: src=/root/httpd.conf dest=/etc/httpd/conf
– name: start service
service: name=httpd state=started enabled=yes
?
?運行playbook方式
ansible-playbook fileyml –check 只檢測
ansible-playbook fileyml
ansible-playbook fileyml –limit websrv? 只針對主機列表中的某些主機執行
-v?? -vv?? -vvv顯示過程
ansible-playbook file.yml –list-tasks? 查看playbook中task
ansible-playbook file.yml –list-hosts? 查看playbook中主機
?
handlers和notify結合使用觸發條件
安裝http服務,假如以下playbook已經執行,所有操作已經完成,但之后配置文件發生修改,需重新執行,但服務已經重啟過,此條任務將不執行,而無法重新加載配置文件,
解決方法
還可觸發多個
-hosts: websrvs
remote_user: root
tasks:
-name: add group nginx
tags: user
user: name=nginxstate=present
-name: add user nginx
user: name=nginxstate=present group=nginx
-name: Install Nginx
yum: name=nginxstate=present
-name: config
copy: src=/root/config.txtdest=/etc/nginx/nginx.conf
notify:
-Restart Nginx
-Check NginxProcess
handlers:
-name: Restart Nginx
service: name=nginxstate=restarted enabled=yes
-name: Check Nginxprocess
shell: killall-0 nginx> /tmp/nginx.log
playbook中tags使用
ansible-playbook -t install,start httpd.yml? 可以選擇標簽執行
也可以將兩個標簽的設為同一名字,執行時將同時執行兩個任務
playbook中變量的使用
1.執行的時候給變量賦值
2.在playbook中定義變量
- 在/etc/ansible/hosts中定義
普通變量:主機組中主機單獨定義,優先級高于公共變量
公共(組)變量:針對主機組中所有主機定義同一變量
ansible-playbook app.yml
變量優先級
命令行 playbook 主機清單 模板文件
setup模塊定義了系統自帶的變量
如:查看ansible_fqdn變量
ansible all -m setup -a ‘filter=”ansible_fqdn”‘
變量可以專門寫入一個文件中,然后調用就可以
如:在/etc/ansible/下創建一個vars.yml
var1: httpd
var2: vsftpd
編寫劇本調用
ansible-playbook testvars.yml
模板templates
Jinja2語言,使用字面量,有下面形式
字符串:使用單引號或雙引號
數字:整數,浮點數
列表:[item1, item2, …]
元組:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布爾型:true/false
算術運算:+, -, *, /, //, %, **
比較操作:==, !=, >, >=, <, <=
邏輯運算:and, or, not
流表達式:For If When
模板文件放置沒有嚴格要求,可以在ansible目錄下創建文件夾templates,和playbook平級
template也是個模塊,只能用于playbook,不能用于ansible命令行中
templates功能:根據模塊文件動態生成對應的配置文件
templates文件必須存放于templates目錄下,且命名為.j2 結尾
yaml/yml文件需和templates目錄平級,目錄結構如下:
./
├── temnginx.yml
└── templates
└── nginx.conf.j2
利用template,引用變量
例:nginx的安裝,
在/etc/ansible/下創建templates目錄
1.復制模板文件并且改名以.j2為后綴
cp /etc/nginx/nginx.conf? /etc/ansible/templates/nginx.conf.j2
2.編輯模板文件,引用一個變量,cpu個數變量ansible_processor_vcpus,此時的cup個數為1
ansible all -m setup | grep processor
vim /etc/ansible/templates/nginx.conf.j2
3.編寫playbook
4.執行playbook
ansible-playbook temnginx –limit 192.168.67.132
5.根據變量引用,worker process變為原來4倍
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/100290