ansible學習筆記三:playbook和roles


參考博客:

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目錄:

image-20190320185740898

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項目

image-20190321085729247

# 大體步驟
第一步:安裝包組和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

執行結果:

image-20190321173710048

  • 待完成: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來導入

image-20190321085705865


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM