1.什么是變量?
以一個固定的字符串,表示一個不固定的值
2.定義變量
vars 關鍵字
vars_file
3.在Inventory主機清單中定義變量
1)清單文件中直接定義
2)準備hosts_vars group_vars目錄
4.通過外置參數傳遞(傳遞)-e
5.變量沖突砰奕,優(yōu)先級
6.變量注冊
定義變量
1.(關鍵字)配置文件內定義變量吮螺,但只能是該變量所在的hosts內能調用使用
[root@manager project1]# cat f2.yml
- hosts: webservers
vars:
- file_name: playbook_vars
tasks:
- name: Create New File
file:
path: /tmp/{{ file_name }}
state: touch
2.(vars_file)共享,任何 *.yml文件都可以使用
1570755668515.png
[root@manager project1]# cat vars_file.yml
web_packages: httpd
ftp_packages: vsftpd
[root@manager project1]# cat f2.yml
- hosts: webservers
vars:
- file_name: playbook_vars
#調用共享vars_file文件,只不過剛好文件名叫vars_file
vars_files: ./vars_file.yml
tasks:
- name: Create New File
file:
path: /tmp/{{ file_name }}
state: touch
- name: Installed Packages {{ web_packages }}
yum:
name: "{{ web_packages }}"
state: present
在主機清單中定義變量(hosts)
1.清單文件中直接定義 hosts文件定義
[webservers]
172.16.1.7
172.16.1.8
[webservers:vars]
file_name=hostsfile_group_vars
2.創(chuàng)建hosts_vars group_vars 目錄
[root@manager project1]# mkdir hosts_vars #單個主機
[root@manager project1]# mkdir group_vars #主機組
1)單個主機定義和使用方式 (host_vars能分別對不同的主機定義變量)
[root@manager project1]# cat host_vars/172.16.1.7
host_vars_name: 172.16.1.7
[root@manager project1]# cat host_vars/172.16.1.8
host_vars_name: 172.16.1.8
[root@manager project1]# cat f4.yml
- hosts: webservers
tasks:
- name: Create New File
file:
path: /opt/{{ host_vars_name }}
state: touch
2)針對主機組定義的方式
#給指定的webserver組設定變量.其他組主機無法使用該變量
[root@manager project1]# cat group_vars/webservers
group_host_vars: webservers
[root@manager project1]# cat f5.yml
- hosts: webservers
tasks:
- name: Create New File {{ group_host_vars }}
file:
path: /opt/{{ group_host_vars }}
state: touch
3)針對主機組定義的方式 (給所有的主機和主機組設定變量)
[root@manager project1]# cat group_vars/all
group_host_vars: all
[root@manager project1]# cat f5.yml
- hosts: webservers
tasks:
- name: Create New File {{ group_host_vars }}
file:
path: /opt/{{ group_host_vars }}
state: touch
3)通過外置傳參定義變量? -e
[root@manager project1]# ansible-playbook -i hosts f6.yml -e "web_vars=123"
變量沖突伏伐,測試優(yōu)先級
1)在plabook中定義vars變量
2)在playbook中定義vars_files變量
3)在inventory主機定義變量
4)在inventory主機組定義變量
5)在host_vars中定義變量
6)在group_vars中定義變量 單個組 all組
7)通過執(zhí)行命令傳遞變量
--->
優(yōu)先級等級(由高到低):
外置傳入參數-->playbook(vars_files(共享)--->Vars(私有))--->host_Vars -->group_vars/group_name-->group_vars/all
變量注冊
register關鍵字宠进,可以將某個task任務結果存儲到變量中,最后使用debug輸出變量內容藐翎,可用于后續(xù)排障
[root@manager project1]# cat f8.yml
- hosts: webservers
tasks:
# System_Status=$(netstat -lntp)
- name: Get Network Status
shell: netstat -lntp | grep "nginx"
register: System_Status #shell執(zhí)行的命令賦值于此
# echo "$System_Status"
- name: Debug output Variables
debug:
msg: "{{ System_Status.stdout_lines }}" #將賦值的結果輸出出來
facts變量
image.png
Ansible facts是在被管理主機上通過ansible自動采集發(fā)現的變量材蹬,facts包含每臺特定的主機信息,比如:主機名 IP地址 系統(tǒng)版本 CPU數量 內存狀態(tài)等等
使用場景
1)檢查cpu信息吝镣,生成不同的nginx配置文件
A: 1核心 work_process 1;
B: 2核心 work_process 2;
2)檢查名稱信息堤器,生成不同的zabbix配置文件
zabbix_agent
Server: ===> 指向172.16.1.61
Hostname: web01 web02
[root@manager project1]# cat ./file/zabbix_agent.conf.j2
Server={{ zabbix_server_ip }}
ServerActive={{ zabbix_server_ip }}
Hostname={{ ansible_hostname }}
[root@manager project1]# cat f11.yml
- hosts: webservers
vars:
- zabbix_server_ip: 172.16.1.61
tasks:
- name: Configure zabbix-agent.conf
template:
src: ./file/zabbix_agent.conf.j2
dest: /tmp/zabbix-agent.conf
3)檢查內存狀態(tài),生成不同的memcached的配置文件
[root@manager project1]# cat f12.yml
- hosts: webservers
tasks:
- name: Installed Memcached Server
yum:
name: memcached
state: present
- name: Configure Memcached Server
template:
src: ./file/memcached.j2
dest: /etc/sysconfig/memcached
notify: Restart Memcached Server
- name: System Memcached Server
systemd:
name: memcached
state: started
enabled: yes
handlers:
- name: Restart Memcached Server
systemd:
name: memcached
state: restarted
[root@manager project1]# cat file/memcached.j2
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="{{ ansible_memtotal_mb //2 }}"
OPTIONS=""
判斷語句
* 1.centos和ubuntu系統(tǒng)都需要安裝httpd, 判斷系統(tǒng).
* 2.安裝軟件倉庫,只有web組的安裝webtatic其他的主機全部跳過.
* 3.TASK任務, TASK1任務執(zhí)行成功,才會執(zhí)行TASK2
#根據不同的系統(tǒng),安裝不同的服務
- hosts: webservers
tasks:
- name: CentOS Installed Httpd Server
yum:
name: httpd
state: present
when: ( ansible_distribution == "CentOS" )
- name: Ubuntu Installed Httpd Server
yum:
name: httpd2
state: present
when: ( ansible_distribution == "Ubuntu" )
#安裝軟件倉庫,只有web組的安裝webtatic其他的主機全部跳過.
[root@manager project1]# cat f16.yml
- hosts: all
tasks:
- name: Add Nginx Yum Repository
yum_repository:
name: nginx
description: Nginx Repository
baseurl: http://nginx.org/packages/centos/7/$basearch/
when: ( ansible_hostname is match ("web*"))
#TASK任務, TASK1任務執(zhí)行成功,才會執(zhí)行TASK2
[root@manager project1]# cat f17.yml
- hosts: webservers
tasks:
- name: Check Httpd Server
command: systemctl is-active httpd
register: Check_Httpd
ignore_errors: yes
#判斷Check_Httpd.rc是否等于0,如果為0則執(zhí)行任務,否則不執(zhí)行
- name: Restart Httpd Server
systemd:
name: httpd
state: restarted
when: ( Check_Httpd.rc == 0 )
循環(huán)語句
#一次啟動多個服務
[root@manager project1]# cat f18.yml
- hosts: webservers
tasks:
- name: Systemd Nginx Status
systemd:
name: "{{ item }}" #調用的變量也不變,也是固定
state: started
#固定的語法格式
with_items:
- nginx
- php-fpm
#一次拷貝多個文件
[root@manager project1]# cat f19.yml
- hosts: webservers
tasks:
- name: Configure nginx.conf
copy:
src: '{{ item.src }}'
dest: '{{ item.dest }}'
mode: '{{ item.mode }}'
with_items:
- { src: ./file/nginx.conf.j2, dest: /etc/nginx/nginx.conf, mode: '0644' }
- { src: ./file/kold.oldxu.com.conf.j2, dest: /etc/nginx/conf.d/kold.oldxu.com.conf, mode: '0600' }
#創(chuàng)建多個用戶(標準型)
[root@manager project1]# cat f20.yml
- hosts: webservers
tasks:
- name: Create User
user:
name: "{{ item }}"
with_items:
- test1
- test2
- test3
- test4
#創(chuàng)建tt1 --> bin tt2 -->root tt3 --->adm 附加組
[root@manager project1]# cat f20.yml
- hosts: webservers
tasks:
- name: Create User
user:
name: "{{ item.name }}"
groups: "{{ item.groups }}"
with_items:
- { name: tt1, groups: bin }
- { name: tt2, groups: root }
- { name: tt3, groups: adm }
1.標準循環(huán) --->居多
item
with_items:
- test
2.字典循環(huán): --->居多
itme.name
with_items:
- { name: test }
3.變量循環(huán)
- hosts: webservers
tasks:
- name: ensure a list of packages installed
yum: name={{ packages }} state=present
vars:
packages:
- httpd
- httpd-tools
handlers
[root@manager project1]# cat f22.yml
- hosts: webservers
tasks:
- name: Installed Nginx and PHP Packages
yum:
name: nginx
state: present
- name: Configure nginx.conf
template:
src: ./file/nginx.conf.j2
dest: /etc/nginx/nginx.conf
#監(jiān)控-->changed狀態(tài)-->通知-->handlers--->name-->Restart Nginx Server
notify: Restart Nginx Server
#notify:
# - Restart Nginx Server
# - Restart php Server
- name: Systemd Nginx Server
systemd:
name: nginx
state: started
enabled: yes
#當nginx或php配置文件發(fā)生變更才會觸發(fā)此操作
handlers:
- name: Restart Nginx Server
systemd:
name: nginx
state: restarted
#3.handlers注意事項
1)無論多少個task通知了相同的handlers末贾,handlers僅會在所有tasks結束后運行一次闸溃。
2)只有task發(fā)生改變了才會通知handlers,沒有改變則不會觸發(fā)handlers.
3)不能使用handlers替代tasks拱撵、因為handlers是一個特殊的tasks辉川。
變量->facts-->判斷-->循環(huán)
* 1.安裝Rsyncd服務 (循環(huán))
* 2.安裝Redis (bind 本地IP地址) facts
* 3.安裝NFS (配置文件,創(chuàng)建目錄,客戶端掛載) 變量
(reverse-i-search)`setup': ansible localhost -m setup -i hosts |less