# ansible、Ad-Hoc、YAML劇本 ## 1.簡介 ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量運行命令等功能。 ## 2.部署 1.dn ...
ansible、Ad-Hoc、YAML劇本
1.簡介
ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程式部署、批量運行命令等功能。
2.部署
1.dns resolve
ansible伺服器:192.168.70.42 配置阿裡yum源
ansible客戶機:192.168.70.35 192.168.70.36 配置阿裡yum源
伺服器和客戶機都做好功能變數名稱解析
vim /etc/hosts
192.168.70.35 host1
192.168.70.36 host2
192.168.70.42 ansible
2.install ansible (ansible伺服器)
yum install ansible -y
3.ssh-key免密連接
ssh-keygen //一路回車 有yes填yes
ssh-copy-id [email protected] //發送公鑰
ssh-copy-id [email protected]
ssh [email protected] //測試連接
ssh [email protected]
4.ansible基礎
1.自定義主機清單 (ansible機器)
vim /etc/ansible/hosts
host1
host2
2.測試連通性
ansible localhost -m ping //測試host1連通性 -m指定模塊
ansible host1 -m ping o //一行簡簡潔輸出
3.know_hosts
ansible host2 -m ping -u root -k -o //沒有配置ssh免密可以互動式密碼驗證登錄 如果是第一次連接會報錯 需使用ansible host2 -m ping 交互yes之後才能
`去掉(yes/no)的詢問`
vim /etc/ssh/ssh_config
StrictHostKeyChecking no
systemctl restart sshd
ansible host2 -m ping -u root -k -o //再次測試
4.請註意ping和ssh
ping的通不代表ansible連接的上,ping ICMP:網際消息管理協議
ansible的ping事探測ssh程式是否連接。不是icmp協議,如果關比sshd服務,ping可以成功,ansible測試會依舊失敗。
5.Inventory主機清單
1.增加主機組
vim /etc/ansible/hosts
[webserver]
host1 ansible_ssh_user='root'
host2 ansible_ssh_user='root'
ansible webserver -m ping -o
2.增加用戶名沒密碼(沒設置免密登錄,可以增加用戶名密碼)
vim /etc/ansible/hosts
host1 ansible_ssh_user='root' ansible_ssh_pass='123456'
host2 ansible_ssh_user='root' ansible_ssh_pass='123456'
//或者
host[1:2] ansible_ssh_user='root' ansible_ssh_pass='123456'
3.增加埠(host)
vim /etc/ssh/sshd_config
Port 22 改成Port 2222
systemctl restart sshd
測試連接
ansible host1 -m ping //會發現失敗 ansible預設sshd埠還是22
回到ansible 修改用戶host的埠
vim /etc/ansible/hosts
host1 ansible_ssh_user='root' ansible_ssh_pass='123456' ansible_ssh_port='2222' //指定ssh埠
再次測試
ansible host1 -m ping
4.組:變數
[webserver]
host1 ansible_ssh_port='2222'
host2 ansible_ssh_port='2222'
[webserver:vars]
ansible_ssh_user='root'
ansible_ssh_pass='123456'
5.子分組 (將不同的分組進行組合) 為了實驗方便我們先把host的sshd 埠改回預設
vim /etc/ansible/hosts
[apache]
host1
[nginx]
host2
[webserver:children]
apache
nginx
ansible webserver -m ping -o //測試
6.自定義主機列表
vim hostlist
[dockers]
host1
host2
ansible -i hostlist dockers -m ping -o //測試
6.Ad-Hoc點對點模式
臨時的,在ansible中是指需要快速執行的單條命令,並且不需要保存的命令。對於複雜的命令則為 playbook。
1.shell模塊
ansible webserver -m shell -a 'hostname' -o //查看主機名稱
ansible webserver -m shell -a 'yum install mariadb -y' -o //安裝mariadb
ansible webserver -m shell -a 'touch /tmp/777.txt' -o //創建文件
2.複製模塊
ansible-doc copy //查看幫助文檔
ansible webserver -m copy -a 'src=/etc/hosts dest=/tmp/2.txt' //copy 如果和原先文件一樣 不會進行拷貝
ansible webserver -m copy -a 'src=/etc/hosts dest=/tmp/3.txt owner=root group=root mode=777'
ansible webserver -m copy -a 'src=/etc/hosts dest=/tmp/3.txt owner=root group=root mode=777 backup=yes'
3.用戶模塊
ansible-doc user //查看幫助文檔
ansible webserver -m user -a 'name=xux state=present' //創建用戶
echo '123456' | openssl passwd -1 -stdin //系統存儲的是密文 需要將輸入的密碼轉化為加密後的密文
ansible webserver -m user -a 'name=xux password="$1$g93P3CoY$YPuV8anNPa8HBhnfMncB60"' //修改密碼
ansible webserver -m user -a 'name=xux shell=/sbin/nologin append=yes' //修改用戶屬性
ansible webserver -m user -a 'name=xux state=absent' //刪除用戶
4.軟體包管理
ansible-doc yum //查看幫助文檔
ansible webserver -m yum -a 'name="*" stale=lastest' //升級所有包
ansible webserver -m yum -a 'name=vsftpd state=present' //安裝vsftpd
ansible webserver -m yum -a 'name=vsftpd state=absent' //卸載vsftpd
ansible webserver -m yum -a 'name=vsftpd state=latest' //升級vsftpd
5.服務模塊
ansible-doc service //查看幫助文檔
ansible webserver -m service -a 'name=vsftpd state=started' //開啟httpd服務
ansible webserver -m service -a 'name=vsftpd state=stopped' //關閉httpd服務
ansible webserver -m service -a 'name=vsftpd state=restarted' //重啟httpd服務
ansible webserver -m service -a 'name=vsftpd state=started enabled=yes' //開啟開機自啟
ansible webserver -m service -a 'name=vsftpd state=started enabled=no' //關閉開機自啟
6.文件模塊
ansible-doc file //查看幫助文檔
ansible webservice -m file -a 'path=/tmp/11.txt mode=771 state=touch' //創建文件
ansible webserver -m file -a 'path=/tmp/asb mode=770 state=directory' //創建目錄
7.收集模塊
ansible-doc setup //查看幫助文檔
ansible host1 -m setup //列出常見常熟
ansible host1 -m setup -a 'filter=ansible_all_ipv4_addresses' //查詢ip地址
7.YAML
YAML Ain’t Markup Language-非標記語言
示例:通過YAML編寫一個簡單的劇本,完成web的部署,配置,啟動的全過程。
1.準備
ansible all -m yum -a 'name=httpd state=removed' -o //清理一下環境
yum install -y httpd //準備配置文件
mkdir apache
cd apache
cp -rf /etc/httpd/conf/httpd.conf .
grep '^Listen' httpd.conf
Listen 8080 //修改埠
2.編寫劇本
編寫
vim apache.yaml
- hosts: host2
tasks:
- name: install apache packages
yum: name=httpd state=present
- name: copy apache conf
copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
- name: ensure apache is running
service: name=httpd state=started enabled=yes
測試
ansible-playbook apache.yaml --syntax-check
ansible-playbook apache.yaml --list-tasks
ansible-playbook apache.yaml --list-hosts
執行
ansible-playbook apache.yaml
3.優化
如果我們在配置文件中修改了apache埠號為9000,那麼我們再次重啟會發現文件會被拷貝過去,但是伺服器並沒沒有重啟。
因為劇本中寫的服務啟動,並沒有重啟服務。需要優化一下劇本代碼,如果執行copy語句那麼notify會觸發,接著會執行handlers中的語句重啟服務。
- hosts: webserver
tasks:
- name: install apache packges for xux
yum: name=httpd state=latest
- name: copy apache conf file for xux
copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart apache service for xux
- name: ensure apache si running
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache service for xux
service: name=httpd state=restarted
8.Role-角色扮演
roles則是在ansible中,playbooks的目錄組織結構。將代碼或文件進行模塊化,成為roles的文件目錄組織結構,易讀,代碼可重用,層次清晰。
示例:通過role遠程部署nginx並配置
1.準備目錄
nginx 角色名
files 普通文件
handlers 觸發器程式
tasks 主任務
templates 金甲模板(有變數的文件)
vars 自定義變數
[root@localhost ~]# mkdir roles/nginx/{files,handlers,tasks,templates,vars} -p
touch roles/site.yaml roles/nginx/{handlers,tasks,vars}/main.yaml
echo 1234 > roles/nginx/files/index.html
yum install -y nginx && cp /etc/nginx/nginx.conf roles/nginx/templates/nginx.conf.j2
[root@localhost ~]# tree roles/
roles/
├── nginx
│ ├── files
│ │ └── index.html
│ ├── handlers
│ │ └── main.yaml
│ ├── tasks
│ │ └── main.yaml
│ ├── templates
│ └── vars
│ └── main.yaml
└── site.yaml
2.編寫任務
vim roles/nginx/tasks/main.yaml
- name: install epel-release packge
yum: name=epel-release state=latest
- name: install nginx packge
yum: name=nginx state=latest
- name: copy index.html
copy: src=index.html dest=/usr/share/nginx/html/index.html
- name: copy nginx.conf template
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
- name: make sure nginx service running
service: name=nginx state=started enabled=yes
Template:
Template模板在運用時與copy模塊類似,區別在於可以在Ansible的Playbook執行的時候,根據一定的條件靈活的設置要複製文件中的部分關鍵內容。
在Ansible中,Templat模板使用jinjia2語言進行配置,模板文件的尾碼名為.j2。
3.準備配置文件
vim roles/nginx/templates/nginx.conf.j2
worker_processes auto; 改成 worker_processes {{ ansible_processor_cores }}; //ansible內置變數
worker_connections 1024; 改成 worker_connections {{ worker_connections }}; //自定義變數
4.編寫變數
vim roles/nginx/vars/main.yaml
worker_connections: 10240
5.編寫處理程式
vim roles/nginx/handlers/main.yaml
---
- name: restart nginx
service: name=nginx state=restarted
6.編寫劇本
vim roles/site.yaml
- hosts: webserver
roles:
- nginx
7.實施
cd roles
ansible-playbook site.yaml --syntax-check //測試
ansible-playbook site.yaml //實施劇本
文章內容主要參考:b站磊哥5.Ansible 自動化運維實戰