一、ansible簡介
ansible基於python開發的自動化運維工具,其功能實現基於ssh遠程連接服務
ansible可以實現批量系統配置、批量軟件部署、批量文件拷貝、批量運行命令等功能
http://www.ansible.com/ ##幫助手冊
1.1 一些常用的自動化運維工具
Puppet —基於 Ruby 開發,採用 C/S 架構,擴展性強,基於 SSL,遠程命令執行相對較弱
SaltStack —基於 Python 開發,採用 C/S 架構,相對 puppet 更輕量級,配置語法使用 YMAL,使得配置 腳本更簡單。
1.2 Ansible —基於 Pythonparamiko 開發,分佈式,無需客戶端,輕量級,配置語法使用 YMAL 及 Jinja2 模板語言,
更強的遠程 命令執行操作 ,Ansible 是一個簡單的自動化運維管理工具,可以用來自動化部署應用、配置、
編排 task(持續 交 付、無宕機更新等),採用paramiko 協議庫(fabric 也使用這個),通過 SSH 或者 ZeroMQ 等連接主機。
1.3 Ansible 工作機制
Ansible 在管理節點將 Ansible 模塊通過 SSH 協議(或者 Kerberos、LDAP)推送到被管理端執 行,執行完之後自動刪除,
可以使用SVN 等來管理自定義模塊及編排
1.4 Ansible 的組成由 5 個部分組成:
①,Ansible:核心引擎(包含2個模塊)
核心模塊:ansible模塊資源分發到遠程節點使其執行特定任務或匹配一個特定的狀態。
自定義模塊:如果核心模塊不足以完成某種功能,可以添加自定義模塊。
②,Plugins:完成模塊功能的補充,包括連接插件、郵件插件等
③,Playbooks:定義ansible任務的配置文件,可以將多個任務定義在一個劇本中,
④,由ansible自動執行,劇本執行支持多個任務,可以由控制主機運行多個任務,同時對多臺遠程主機進行管理。
⑤,Inventory:定義 Ansible 管理主機的清單
二、特點:
1、不需要單獨安裝客戶端,基於系統自帶的sshd服務,sshd就相當於ansible的客戶端
2、不需要服務端
3、需要依靠大量的模塊實現批量管理
4、配置文件/etc/ansible/ansible.cfg
三、準備環境:
ssh key+ansible (ansible需要先ssh認證)
1、管理機 需要配置好ssh密鑰認證
2、管理機 連接到客戶端1、客戶端2...不需要密碼
3、關閉防火牆
四、安裝服務
yum -y install epel-release ##安裝epel源
yum -y install ansible
五、ansible配置文件
[root@test1 ~]# tree -F /etc/ansible/
/etc/ansible/
├── ansible.cfg ##目前不需要修改,如果所有服務器的ssh端口變了就修改
├── hosts ##被ansible管理的服務器IP地址列表(也可以是主機名但是主機名必須被解析)
└── roles/ ##目錄下是空的
配置文件詳解:
[defaults] #通用默認配置段
#inventory = /etc/ansible/hosts #被控端IP或者DNS列表
#library = /usr/share/my_modules/ #ansible默認搜尋模塊位置
#module_utils = /usr/share/my_module_utils/
#remote_tmp = ~/.ansible/tmp #ansible遠程執行臨時文件;
#local_tmp = ~/.ansible/tmp
#forks = 5 #並行進程數
#poll_interval = 15 #回頻率或者輪訓間隔時間
#sudo_user = root #sudo遠程執行用戶名
#ask_sudo_pass = True #使用sudo,是夠需要輸入密碼
#ask_pass = True #是否需要輸入密碼
#transport = smart #通信機制
#remote_port = 22 #遠程SSH端口
#module_lang = C #模塊和系統之間通信語言
#module_set_locale = False
#gathering = implicit #控制默認facts收集(遠程系統變量)
roles_path= /etc/ansible/roles 用於playbook搜索Ansible roles;
host_key_checking = False 檢查遠程主機密鑰;
#sudo_exe = sudo sudo遠程執行命令;
#sudo_flags = -H 傳遞sudo之外的參數;
timeout = 10 SSH超時時間;
remote_user = root 遠程登陸用戶名;
log_path = /var/log/ansible.log 日誌文件存放路徑;
module_name = command Ansible命令執行默認的模塊;
#executable = /bin/sh 執行的Shell環境,用戶Shell模塊;
#hash_behaviour = replace 特定的優先級覆蓋變量;
#jinja2_extensions 允許開啓Jinja2拓展模塊;
#private_key_file = /path/to/file 私鑰文件存儲位置;
#display_skipped_hosts = True 顯示任何跳過任務的狀態;
#system_warnings = True 禁用系統運行ansible潛在問題警告;
#deprecation_warnings = True Playbook輸出禁用“不建議使用”警告;
#command_warnings = False command模塊Ansible默認發出警告;
#nocolor = 1 輸出帶上顏色區別,開啓/關閉:0/1;
pipelining = False 開啓pipe SSH通道優化;
[accelerate] accelerate緩存加速。
accelerate_port = 5099
accelerate_timeout = 30
accelerate_connect_timeout = 5.0
accelerate_daemon_timeout = 30
accelerate_multi_key = yes
5.1基礎配置
編輯ansible的主機配置文件hosts,添加主機組client
cp /etc/ansible/hosts{,.bak}
cat > /etc/ansible/hosts<<EOF
[client]
192.168.24.131
192.168.24.132
192.168.24.133
EOF
[root@test1 ~]# tail /etc/ansible/hosts
[client]
192.168.24.131
192.168.24.132
192.168.24.133
5.2批量運行命令
ansible client -a "uptime"
等於
ansible client -m command -a “uptime”
ansible -vvv -a “hostname”顯示執行過程
-m 指定模塊
-a 後面執行命令
##注:如果執行管道,-m 指定shell模塊
【主要參數如下】
-v,–verbose 打印詳細模式;
-i PATH,–inventory=PATH 指定host文件路徑;
-f NUM,–forks=NUM 指定fork開啓同步進程的個數,默認5;
-m NAME,–module-name=NAME 指定module名稱,默認模塊command;
-a MODULE_ARGS module模塊的參數或者命令;
-k,–ask-pass 輸入遠程被管理端密碼;
–sudo 基於sudo用戶執行;
-K,–ask-sudo-pass 提示輸入sudo密碼與sudo一起使用;
-u USERNAME,–user=USERNAME 指定移動端的執行用戶;
-C,–check 測試執行過程,不改變真實內容,相當於預演;
-T TIMEOUT, 執行命令超時時間,默認爲10秒;
--version 查看Ansible軟件版本信息。
ansible-playbook --syntax-check user.yml #驗證yml語法
[root@jenkins script]# ansible-playbook --syntax-check user.yml
[DEPRECATION WARNING]: ACCELERATE_TIMEOUT option, Removing accelerate as a connection method, settings not needed either. . This feature will be removed in
version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_DAEMON_TIMEOUT option, Removing accelerate as a connection method, settings not needed either. . This feature will be
removed in version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_CONNECT_TIMEOUT option, Removing accelerate as a connection method, settings not needed either. . This feature will be
removed in version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_MULTI_KEY option, Removing accelerate as a connection method, settings not needed either. . This feature will be removed in
version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: ACCELERATE_PORT option, Removing accelerate as a connection method, settings not needed either. . This feature will be removed in
version 2.5. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
[WARNING]: Could not match supplied host pattern, ignoring: test
playbook: user.yml #正常語法
5.3 批量發送文件
copy 模塊
src=從哪裏來
dest=到哪裏去
mode=修改權限
backup=備份
本地的/root/1.txt 發送到所有的服務器的/opt下
ansible client -m copy -a "src=/root/1.txt dest=/opt/"
##注:src指從哪裏來,dest指到哪裏去
新文件是黃色的,再次執行是綠色的
ansible client -a "ls -l /opt" ##驗證文件是否存在
ansible client -m copy -a "src=/root/1.txt dest=/opt/test/test1/"
##自動在opt下創建/test/test1文件,並將1.txt複製到/test/tes1/目錄下
ansible client -m copy -a "src=/root/1.txt dest=/opt/2.txt" ##拷貝且修改文件名
ansible client -m copy -a "src=/root/3.txt dest=/opt/2.txt backup=yes"
##3.txt會覆蓋原2.txt,但在此之前會備份2.txt
ansible client -m copy -a "src=/root/4.txt dest=/opt/5.txt owner=test group=test mode=0755"
##修改所有者和文件權限
shell 模塊
運行腳本、命令、特殊符號
創建文件
echo 'yum -y install lrzsz' >/opt/yum.sh
1.先把腳本發送到對應的服務器
ansible client -m copy -a "src=/opt/yum.sh dest=/opt/ mode=755"
ansible client -a "ls -l /opt/yum.sh"
2、運行 /bin/sh
ansible client -m shell -a "/bin/sh /opt/yum.sh"
ansible client -m shell -a "rpm -qa| grep lrzsz" ##shell支持特殊符號
script 腳本模塊
1.把腳本發送到對應服務器(過程不顯示)
2.運行腳本 (過程不顯示)
寫一個腳本 更改所有服務器的yum源
cat>/opt/yuan.sh<<EOF
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
EOF
ansible client -m script -a "/opt/yuan.sh"
ansible client -a "yum repolist"
cron 定時任務模塊
每5分鐘顯示hello到/tmp/test.log
echo '*/5 * * * * echo hello >>/tmp/test.log 2>&1' >>/var/spool/cron/root ##原命令
crond模塊
ansible client -m cron -a 'name=hello minute=*/2 job="echo hello >>/tmp/test.log 2>&1"' ##改造後命令
ansible client -a "crontab -l"
例:時間同步
[root@test1 ~]# ansible client -m cron -a 'name=date minute=*/5 job="/usr/sbing/ntpdate ntp1.aliyun.com >/dev/null 2>&1"'
192.168.24.131 | CHANGED => {
"changed": true,
"envs": [],
"jobs": [
"date"
]
}
[root@test1 ~]# ansible client -a "crontab -l"
192.168.24.131 | CHANGED | rc=0 >>
#Ansible: date
*/5 * * * * /usr/sbing/ntpdate ntp1.aliyun.com >/dev/null 2>&1
測試方法:
ansible all -a hostname
ansible -C 操作之前檢查語法,模擬一下命令不會生效,無誤之後可以去掉-C
##添加定時任務:
ansible client -m cron -a "name='network restart' minute=00 hour=00 job='network restart >/dev/null 2>&1' state=present" -C
ansible client -m cron -a "name='network restart' minute=00 hour=00 job='network restart >/dev/null 2>&1' state=present"
ansible -a "crontab -l"
##刪除這個定時任務
ansible client -m cron -a "name='network restart' minute=00 hour=00 job='/etc/init.d/network restart' state=absent" -C
ansible client -m cron -a "name='network restart' minute=00 hour=00 job='/etc/init.d/network restart' state=absent"
ansible -a "crontab -l"
1.真正運行ansible生效前 檢查語法
ansible -C
2.沒問題就去掉-C
yum 模塊:
ansible client -m yum -a "name=vim state=installed"
ansible client -m yum -a "name=lrzsz,net-tool" ##yum安裝多個軟件
file模塊:
ansible client -m file -a "dest=/tmp/test/ state=directory" ##創建遠程目錄
ansible client -a "tree -F /tmp/"
owner 設置複製傳輸後的數據屬主信息
group 設置複製傳輸後的數據屬組信息
mode 設置文件數據權限信息
dest 要創建的文件或目錄命令,以及路徑信息
src 指定要創建軟連接的文件信息
六、模塊:
6.1 ansible如何查詢幫助,查詢模塊的參數
ansible-doc -s copy ##查看copy模塊幫助
ansible-doc -l ##顯示所有模塊
七、通過ansible批量管理服務
1、命令行 各種模塊
2、書寫劇本-playbook
ansible部署rsync,nfs,sersync(實踐)
八、基礎補充--ansible-playbook
8.1特點:
1.配置管理
2.批量部署
3.ad-hoc 批量執行命令
ansible client -m command -a "hostname"
4.編寫playbook劇本-腳本
8.2核心功能:
1.pyYAML-劇本語言
2.paramiko-遠程連接與數據傳輸
3.jinjia2--ansible模板
8.3準備環境:
1.四臺機器web01 backup nfs01 m01
2.配置好m01與web01 backup nfs的ssh密鑰認證
3.配置好m01通過ansible管理web01 backup nfs01
8.4寫法步驟:
核心:找誰幹啥
ansible語言是yml,嚴格要求對齊,注意空格
-host:all ##哪臺服務器
task: ##做什麼任務,運行什麼模塊
- command:ifconfig
等於
ansible -m command -a "ifconfig"
ansible -m shell -a "echo hello >>/tmp/hello.log"
vim /op/show.yml
---
- hosts: all
tasks:
- command: ifconfig
ansible-playbook /op/show.yml -C 運行
[root@test1 ~]# cat /opt/show.yml
---
- hosts: client ##-空格
tasks: ##兩個空格
- command: uptime ##四個空格-空格
---
- hosts: client
tasks:
- shell: ifconfig >/tmp/new.txt
---
- hosts: client
tasks:
- name: "show is addr"
shell: ifconfig >/tmp/new.txt
給所有服務器添加定時任務--變爲劇本
---
- hosts: client
tasks:
- name: network restart
cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=present
刪除定時任務:
---
- hosts: client
tasks:
- name: network restart
cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=absent
多個任務:
---
- hosts: client
tasks:
- name: network restart
cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=present
- name: ipaddr
shell: ifconfig
不同機器運行不同命令:
---
- hosts: 192.168.24.131
tasks:
- name: ipaddr
shell: ifconfig
- hosts: 192.168.24.132
tasks:
- name: network
cron: name='network restart' minute=00 hour=00 job='/etc/init.d/network restart >/dev/null 2>&1' state=present
yum 安裝:
---
- hosts: all
tasks:
- name: yum install
yum: name=htop,sl,cowsay
批量修改單個用戶:
---
- hosts: client
gather_facts: false
tasks:
- name: Change password
user: name={{ name1 }} password={{ chpass | password_hash('sha512') }} update_password=always
ansible-playbook play1.yml -e "name1=username chpass=admin#123" #name1是用戶名,chpass後面填新密碼,把用戶和密碼傳參進去(適合修改單個用戶)