文章目錄 在議playbook 虛擬環境中安裝ansible playbook 結合變量的一些演示 普通的vars_files 變量,在同級目錄創建目錄 使用host_vars 定義變量 group_vars定義變量 根據不同系統操作不同版本 傳遞多個外置變量 舉例幾個不同的示例 facts when loop handlers 與 notify tags 任務標簽 異常處理 jinja2 roles
在議playbook
主要是使用不同的模塊進行編排
如果格式有問題,找chatgpt調整下格式輸出就可以
缺點是比較死板,不能成體系
虛擬環境中安裝ansible
要在CentOS 7系統上讓Ansible使用Python 3,你可以按照以下步驟進行操作:確認你的CentOS 7系統已安裝Python 3。你可以通過在終端中運行python3 --version命令來檢查是否已安裝Python 3。安裝Python 3的pip包管理工具。在CentOS 7上,你可以使用以下命令安裝:sudo yum install python3-pip
安裝python3-devel軟件包以支持Python 3的開發庫。運行以下命令進行安裝:
sudo yum install python3-devel
創建一個Python 3虛擬環境(可選)。虛擬環境可以幫助你隔離Ansible所需的Python包與系統級安裝的Python包。使用以下命令創建虛擬環境:
python3 -m venv ansible-env
激活虛擬環境:source ansible-env/bin/activate
安裝Ansible和所需的Python包。在虛擬環境中運行以下命令:
pip install ansible
配置Ansible以使用Python 3。打開/etc/ansible/ansible.cfg文件,并找到以下行:
# interpreter_python = auto_silent
取消注釋并將其更改為以下內容:interpreter_python = /usr/bin/python3
確認Ansible使用Python 3。運行以下命令來檢查:
ansible --version
playbook 結合變量的一些演示
普通的vars_files 變量,在同級目錄創建目錄
- hosts: webserversvars_files:- ./test.ymltasks:- name: Output Varsdebug:msg:- "{{ http_packages }}"- "{{ db_packages }}"$cat test.yml
test: ansible_vars_files
http_packages: 123
db_packages: 123r返回結果
=> {"msg": [123,null]
}
注意: test.yml 一定要有這個變量,哪怕為空,否則報錯test.yml 可以被多個playbook 引用vars_files:- ./test.yml
使用host_vars 定義變量
hosts 配置文件為
[webservers]
1.1.1.1 aaa=2 bbb=master[webservers:vars]
port=80---
- hosts: webserverstasks:- name: output variablesdebug:msg: "{{ aaa }} {{ bbb }} {{ port }}"> {"msg": "2 master 80"
}
group_vars定義變量
在項目目錄中創建 group_vars 目錄,然后在創建一個文件,文件的文件名稱要與
inventory 清單中的組名稱保持完全一致;在 group_vars 目錄中創建 webservers 文件,為 webservers 主機組設定變
量;"msg": [11,22]
}$cat group_vars/all
web: 11
web1: 22
(ansible-env)$cat t5.yml
- hosts: webserverstasks:- name: Output Vaiables"debug:msg:- "{{ web }}"- "{{ web1 }}"
根據不同系統操作不同版本
注意 www 用戶是有sudo 權限 ---
- hosts: webserversbecome: yesbecome_user: wwwtasks:# 通過fact變量判斷系統為centos才會安裝httpd- name: Centos Install httpdyum: name=httpd state=presentwhen: (ansible_distribution == "CentOS")# 通過fact變量判斷系統為ubuntu才會安裝httpd2- name: Ubuntu Install httpdyum: name=httpd2 state=presentwhen: (ansible_distribution == "Ubuntu")
傳遞多個外置變量
ansible-playbook f5.yml -i hosts -e
"web_packages=GeoIP" -e "ftp_packages=telnet"
舉例幾個不同的示例
- hosts: alltasks:- name:shell: netstat -lntpregister: System_Status- name: Get System Statusdebug: msg={{System_Status.stdout_lines}}
- hosts: webserverstasks:- name: Output variables ansible factsdebug:msg: >this default IPv4 address "{{ ansible_fqdn}}" is "{{ ansible_default_ipv4.address }}"- hosts: alltasks:- name: Ignore Falsecommand: /bin/falseignore_errors: yes- name: touch new filefile: path=/tmp/old state=touch
facts
用來采集客戶端信息,
ansible localhost -m setup -a "filter="ansible_default_ipv4""
when
when 判斷在 Ansible 中的使用頻率非常高;比如 yum 模塊可以自動檢測軟件包是
否已被安裝,而無需人為干涉,但對于有些任務則是需要進行判斷才可以實現的。
比如: web 節點都需要配置 nginx 倉庫,但其他節點并不需要,此時就會用到
when 判斷。
比如: Centos 與 Ubuntu 都需要安裝 Apache ,而 Centos 系統軟件包為
httpd ,而 Ubuntu 系統軟件包為 httpd2 ,那么此時就需要判斷主機系統,然
后為不同的主機系統安裝不同的軟件包。hen: (ansible_hostname is match("web*"))
主機名不為web的不做任何處理
loop
loop 是重復
- hosts: web
tasks:
- name: Add Users
user:
name: {{ item.name }}
groups: {{ item.groups }}
state: present
loop:
- { name: 'testuser1', groups: 'bin' }
- { name: 'testuser2', groups: 'root' }- hosts: all
tasks:
- name: Configure Rsync Server
copy: src={{ item.src }} dest=/etc/{{ item.dest }} mode={{
item.mode }}
with_items:
- {src: "rsyncd.conf", dest: "rsyncd.conf", mode: "0644"}
- {src: "rsync.passwd", dest: "rsync.passwd", mode:
"0600"}
handlers 與 notify
Handlers 是一個觸發器,同時是一個特殊的 tasks ,它無法直接運行,它需要被
tasks 通知后才會運行。比如: httpd 服務配置文件發生變更,我們則可通過
Notify 通知給指定的 handlers 觸發器,然后執行相應重啟服務的操作,如果配
置文件不發生變更操作,則不會觸發 Handlers 任務的執行;如果配置文件發生變化會調用該handlers下面的對應名稱的task
handlers:- name: Restart Httpd Serverservice: name=httpd state=restartedhandlers 注意事項
1.無論多少個 task 通知了相同的 handlers , handlers 僅會在所有
tasks 結束后運行一次。
2.只有 task 發生改變了才會通知 handlers ,沒有改變則不會觸發
handlers
3.不能使用 handlers 替代 tasks 、因為 handlers 是一個特殊的 tasks
tags 任務標簽
默認情況下, Ansible 在執行一個 playbook 時,會執行 playbook 中所有的任
務。而標簽功能是用來指定要運行 playbook 中的某個特定的任務;
1.為 playbook 添加標簽的方式有如下幾種:
對一個 task 打一個標簽
對一個 task 打多個標簽
對多個 task 打一個標簽
2. task 打完標簽使用的幾種方式
-t 執行指定tag標簽對應的任務
--skip-tags 執行除 --skip-tags 標簽之外的所有任務ansible-playbook --skip-tags install_server
xxx.yml標簽結合include
[root@ansible ~]# cat main.yml
- hosts: localhost
tasks:
- name: Installed Tomcat8 Version
include: install_tomcat8.yml
tags: tomcat8
- name: Installed Tomcat9 Version
include: install_tomcat9.yml
tags: tomcat9
異常處理
- hosts: webserverstasks:- name: configure httpd servertemplate:src: ./httpd.conf.j2dest: /etc/httpd/conf/httpd.confnotify: Restart Httpd Server- name: Check HTTPDshell: /usr/sbin/httpd -tregister: httpd_checkfailed_when: httpd_check.rc != 0 or '"OK"' not in httpd_check.stdout- name: start httpd serverservice:name: httpdstate: startedenabled: yeshandlers:- name: Restart Httpd Serversystemd:name: httpdstate: restarted
nginx 的異常處理
- hosts: webservertasks:- name: Install Nginx Serveryum:name: nginxstate: present- name: Configure Nginx Servertemplate:src: ./nginx.conf.j2dest: /etc/nginx/nginx.confnotify: Restart Nginx Server- name: Check Nginx Servershell: /usr/sbin/nginx -tregister: check_nginxchanged_when: '"successful" in check_nginx.stdout'- name: Start Nginx Serverservice:name: nginxstate: startedenabled: yeshandlers:- name: Restart Nginx Serversystemd:name: nginxstate: restarted在這個標準格式的 Playbook 中,我們在"hosts"中指定了目標主機組,并定義了多個任務。每個任務都有一個名稱以及對應的模塊和參數。要解決場景1,即要求每臺主機的端口都不一樣,可以在 Jinja2 模板文件 (nginx.conf.j2) 中使用變量來動態設置端口號。例如,可以通過定義一個名為nginx_port的變量,并在模板文件中使用它來設置 Nginx 的監聽端口。要解決場景2,即使用 Jinja2 模板來修改被管理主機的配置文件,我們使用了template模塊。該模塊會將指定的模板文件復制到遠程主機,并在復制過程中解析文件中的變量值。在"Check Nginx Server"任務中,我們使用了changed_when來定義任務的改變條件。只有當檢查 Nginx 配置的輸出中包含"successful"時,任務才會被標記為已改變。最后,在處理程序部分,我們定義了一個名為"Restart Nginx Server"的處理程序,它會在被通知時使用systemd模塊重啟 Nginx 服務。請注意,Ansible Playbook 的格式要求嚴格,正確的縮進和符號使用非常重要。以上提供的輸出已經按照標準格式進行了調整。
jinja2
Jinja2 是 Python 的全功能模板引擎
Ansible 需要使用 Jinja2 模板來修改被管理主機的配置文件。
ansible 使用 jinja2 模板需要借助 template 模塊實現,那 template 模塊是用
來做什么的?
template 模塊和 copy 模塊完全一樣,都是拷貝文件至遠程主機,區別在于
template 模塊會解析要拷貝的文件中變量的值,而 copy 則是原封不動的將文件拷
貝至被控端。
roles
更加規范,更加標準的去靈活安排你維護的業務