參考博客:
Ansible 系列之 Playbooks 劇本 -飛走不可(博客園)
linux運維學習之ansible的playbook及roles的使用 - 51CTO博客
nginx 基於uwsgi部署Django - 51CTO博客
一、playbook相關模塊
1、setup
$ ansible cache -m setup | more
ansible_all_ipv4_addresses # ipv4的所有地址
ansible_all_ipv6_addresses # ipv6的所有地址
ansible_date_time # 獲取到控制節點時間
ansible_default_ipv4 # 默認的ipv4地址
ansible_distribution # 系統
ansible_distribution_major_version # 系統的大版本
ansible_distribution_version # 系統的版本號
ansible_domain #系統所在的域
ansible_env #系統的環境變量
ansible_hostname #系統的主機名
ansible_fqdn #系統的全名
ansible_machine #系統的架構
ansible_memory_mb #系統的內存信息
ansible_os_family # 系統的家族
ansible_pkg_mgr # 系統的包管理工具
ansible_processor_cores #系統的cpu的核數(每顆)
ansible_processor_count #系統cpu的顆數
ansible_processor_vcpus #系統cpu的總個數=cpu的顆數*CPU的核數
ansible_python # 系統上的python
$ ansible cache -m setup -a 'filter=*processor*' # 用來搜索
正則表達式回顧:
* 匹配數量,表示0或者多次
? 匹配數量,表示0或者1次
. 除換行符以外的所有字符
+ 至少一次
[123abc] 中括號,匹配內容,里面的內容是或關系
() 分組
{m} 次數,出現m次
{m,} 至少m次
{m,n}出現m-n次
# 舉例:
a*.b a出現0次或任意次,后面緊跟着任意的單個字符
2、when-條件判斷
- hosts: web
tasks:
- name: content
copy: content="大弦嘈嘈如急雨" dest=/tmp/x.txt
when: data=="3"
- name: content
copy: content="小弦切切如私語" dest=/tmp/x.txt
when: data=="4"
# 使用-e進行條件判斷
ansible-playbook -e data=3 p6.yml
- 不同的系統
- 不同的版本
- 不同的環境
- 不同的用戶
- hosts: web
tasks:
- name: createfile
file: path=/tmp/redhat.txt state=touch
when: ansible_os_family == "RedHat"
- name: createfile
file: path=/tmp/openbsd.txt state=touch
when: ansible_os_family == "OpenBSD" #ubuntu
3、tags
- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
copy: dest=/etc/redis.conf src=/root/playbook/redis.conf
tags: copyfile
- name: startredis
service: name=redis state=restarted
# 執行
ansible-playbook -t copyfile p7.yml
4、with_item-循環
一次性創建多個
- hosts: web
tasks:
- name: crateuser
user: name={{item}}
with_items:
- alex20
- alex21
- alex22
- hosts: web
tasks:
- name: createuser
user: name={{item}}
with_items:
- alex32
- alex33
- alex34
- name: creategroup
group: name={{item}}
with_items:
- wusir23
- wusir24
- wusir25
嵌套循環
- hosts: web
tasks:
- name: creategroup
group: name={{item}}
with_items:
- wusir33
- wusir34
- wusir35
- name: createuser
user: name={{item.user}} groups={{item.group}}
with_items:
- {"user":alex53,"group":wusir33}
- {"user":alex54,"group":wusir34}
- {"user":alex55,"group":wusir35}
5、template:
jinja2
- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=/root/playbook/redis.conf dest=/etc/redis.conf
- name: start
service: name=redis state=started
# redis.conf
配置文件: bind {{ ansible_default_ipv4.address }}
copy和tamplate的區別
- copy模塊不替代參數
- template模塊替代參數
- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
- name: start
service: name=redis state=started
ps:寫相對路徑: 在當前目錄下新建一個templates
(注意是復數啊)目錄,然后把文件放在templates目錄里面
6、handlers
修改配置文件
- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
tags: copyfile
notify: restart
- name: start
service: name=redis state=started
handlers:
- name: restart
service: name=redis state=restarted
回顧 playbook
傳參
條件判斷 when
循環 with_items item
嵌套循環 字典 通過點來取值
標簽 tags -t 來傳遞標簽
模板 template
handlers 不會執行, notify
二、roles
1.特點:
- 目錄清晰
- 可以互相調用
2.roles文件夾
文件夾里面是要創建的每一個角色,每一個角色一個文件夾
- 每一個角色里面都有tasks(必須的),templates,files,handlers,vars目錄
- 每個目錄都要有main.yml文件,通過import_tasks來調用
- 其中templates文件夾中的文件可以通過相對路徑來調用
目錄結構:
nginx/
├── files #靜態文件
├── handlers #被觸發的動作
│ └── main.yml
├── tasks #任務列表
│ ├── copyfile.yml
│ ├── installnginx.yml
│ ├── main.yml #入口文件
│ └── start.yml
├── templates #模板文件
│ └── nginx.conf
└── vars #變量
查找順序
1. roles目錄,對應的文件夾
2. tasks:先找tasks目錄里面的main.yml文件,看到import_tasks來導入別的yml文件,這個是必須的
3. templates: 找這個目錄里面的模板文件,在tasks里面是可以用相對路徑來寫
4. vars:先找main.yml文件,如果找到就找變量替換
5. hanlers:先找main.yml文件,如果找到,則在tasks里面通過notify來觸發
6. files: 放的是靜態文件
相互調用
通過import_tasks
來相互調用: roles/{nginx|uwsgi|···}/tasks/taskfile.yml
其中files文件夾中的文件是否可以通過相對路徑來調用?
3.怎么使用
跟roles同級目錄下,寫nginx.yml文件
- hosts: web
roles:
- nginx
4.使用roles安裝nginx和uwsgi:
1.創建nginx的roles目錄:
2.在tasks文件夾下編輯任務:
3.更改nginx.conf
配置
worker_connections 102400; #最大連接數
worker_processes {{ansible_processor_vcpus}}; #工作進程數
4.目錄結構
nginx/
├── files #靜態文件
├── handlers #被觸發的動作
│ └── main.yml
├── tasks #任務列表
│ ├── copyfile.yml
│ ├── installnginx.yml
│ ├── main.yml #入口文件
│ └── start.yml
├── templates #模板文件
│ └── nginx.conf
└── vars #變量
安裝uwsgi
[root@centos7-0 ~/roles/uwsgi]#: !mkdir #執行上一次mkdir的操作
mkdir -v {tasks,templates,files,vars,handlers}
mkdir: created directory ‘tasks’
mkdir: created directory ‘templates’
mkdir: created directory ‘files’
mkdir: created directory ‘vars’
mkdir: created directory ‘handlers’
Linux知識點補充:
iptables -F # 臨時關閉防火牆
setenforce 0 #用來臨時關閉selinux
vi /etc/selinux/config #永久關閉SELinux
SELINUX=disabled
5.nginx +uwsgi配置方式
第一種
uwsgi配置文件里面是http= 0.0.0.0:8000
nginx配置文件是proxy_pass http://127.0.0.1:8000;
第二種方式
uwsgi配置文件里面是socket= 0.0.0.0:8000
nginx配置文件是
include /etc/nginx/uwsgi.conf
uwsgi_pass 127.0.0.1:8000;
第三種方式
uwsgi配置文件里面是socket=/data/mysite/mysite.socket
nginx配置文件是
include /etc/nginx/uwsgi.conf
uwsgi_pass unix:/data/mysite/mysite.socket;
6.用roles安裝Redis
# 需求:
# - 監聽地址為本機的內網IP地址
# - 設置密碼
# - 設置落地方式
- hosts: web
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
- name: startredis
service: name=redis state=started
handlers:
- name: restartredis
service: name=redis state=restarted
7.用roles安裝MariaDB
- hosts: web
tasks:
- name: copyfile
template: src=/etc/yum.repos.d/Mariadb.repo dest=/etc/yum.repos.d/Mariadb.repo
- name: installmariadb
yum: name=mariadb-server,mariadb
- name: startmaridb
service: name=mariadb state=started
handlers:
- name: restartmariadb
service: name=mariadb state=restarted
mysql/
├── files
├── handlers
├── tasks
│ ├── copyfile.yml
│ ├── installmariadb.yml
│ ├── main.yml
│ └── startmariadb.yml
├── templates
│ └── Mariadb.repo
└── vars
PS:打包命令
tar -zcvf roles.tar.gz roles #將roles文件夾打包為roles.tar.gz文件
8.用roles來完成nginx+uwsgi配置django項目
# 大體步驟
第一步:安裝包組和pip
yum groupinstall "Development tools"
yum install python2-pip
ansible web -m yum -a 'name=python2-pip'
ansible web -m yum -a 'name="@Development Tools"' # 用來安裝包組
第二步:安裝django
pip install django
ansible web -m pip -a "name=flask"
第三步:安裝uwsgi
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
yum install python-devel
pip install uwsgi
第四步:配置好django項目
copy - 將django項目mysite文件夾存放到files文件夾下
其中,已配置好的uwsgi.ini文件已存放在mysite文件下了
第五步:啟動uwsgi
uwsgi --ini uwsgi.ini
第六步:配置nginx信息
第七步:關閉SELinux
vim /etc/selinux/config
SELinux=disabled
systemctl restart nginx
uwsgi的配置目錄:
uwsgi/
├── files
│ └── mysite #django項目
├── handlers
├── tasks
│ ├── copyfile.yml
│ ├── install.yml
│ ├── main.yml
│ ├── startuwsgi.yml
│ └── stopiptables.yml
├── templates
└── vars
其中,install.yml
文件:
- name: installtools
yum: name="@Development Tools"
- name: installpythondev
yum: name=python2-pip,zlib-devel,bzip2-devel,pcre-devel,openssl-devel,ncurses-devel,sqlite-devel,readline-devel,tk-devel,python-devel
- name: installdjango
pip: name=django version=1.11.16
- name: installuwsgi
pip: name=uwsgi
執行結果:
- 待完成:nginx的roles配置,並且和uwsgi相互調用
PS:上面的roles配置過程並不詳細,只是大體的思路
內容總結
- when
- with_items item
- 循環嵌套
- template 支持jinja2的語法
- tags 指定標簽,給某個任務加上標簽
- handlers 執行別觸發的任務
- notify 來觸發
- setup 獲取的被控節點上的一些系統的參數
- roles
- 目錄結構清晰
- 可以相互調用
- tasks
- files
- templates
- vars
- handlers
先找main.yml,用improt_tasks來導入