ansible初識三

1、setup模塊

ansible的 setup模塊主要用來收集信息, 查看參數:html

[root@localhost ~]# ansible-doc -s setup        # 查看參數,部分參數以下:
filter         # 過濾,篩選

  示例一:查看全部信息python

ansible  cache  -m  setup     #  查看cache組的被管控機的信息,  可查到部分信息以下
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

示例二:搜索某個信息nginx

ansible  cache -m setup  -a  'filter=*processor*'    #用來搜索,  *表明匹配任意個任意字符,可自行回顧正則表達式相關知識,可得以下信息
192.168.133.132 | SUCCESS => {
"ansible_facts": {
"ansible_processor": [
"0",
"GenuineIntel",
"Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz"
],
"ansible_processor_cores": 1,
"ansible_processor_count": 1,
"ansible_processor_threads_per_core": 1,
"ansible_processor_vcpus": 1
},
"changed": false
}

2、ansible劇本

一、條件判斷

  ansible的playbook 支持條件判斷, 當針對不一樣系統, 不一樣版本, 不一樣環境, 不一樣用戶有不一樣操做時,可使用 when  作條件判斷, 示例以下:web

[root@localhost yaml]# vi p5.yml               # 寫一個yml文件,內容以下:
- hosts: db
  remote_user: root
  tasks: 
  - name: createfile3
    copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt
    when: a=="3"
  - name: createfile4
    copy: content="小弦切切如私語" dest=/tmp/a.txt
    when: a=="4"
[root@localhost yaml]# ansible-playbook --syntax-check p5.yml         # 驗證語法合法性

playbook: p5.yml
[root@localhost yaml]# ansible-playbook -e 'a="3"' p5.yml           # 只執行name爲 createfile3 的任務,結果自行驗證

三、循環with_items

一般你想在一個任務中幹不少事,好比建立一羣用戶、安裝不少包、或者重複一個輪詢步驟直到收到某個特定結果,這時就可使用循環。正則表達式

循環裏面只能是  item  redis

示例一:單個循環apache

[root@localhost yaml]# vi p7.yml 
- hosts: web
  tasks:
  - name: createuser
    user: name={{ item }}
    with_items: - zhangsan
    - lisi
    - wangwu
[root@localhost yaml]# ansible-playbook --syntax-check p7.yml

playbook: p7.yml
[root@localhost yaml]# ansible-playbook p7.yml 

示例二:多個循環django

[root@localhost yaml]# vi p8.yml               # 寫入以下內容
- hosts: web
  tasks:
  - name: createuser
    user: name={{ item }}
    with_items: - zs
    - lss
    - ww
  - name: creategroup
    group: name={{ item }}
    with_items: - yunwei
    - kaifa
    - ceshi
[root@localhost yaml]# vi p8.yml
[root@localhost yaml]# ansible-playbook --syntax-check p8.yml 

playbook: p8.yml
[root@localhost yaml]# ansible-playbook p8.yml      # 執行命令,結果自行驗證

  示例三:循環嵌套安全

[root@localhost yaml]# vi p9.yml          # 寫入以下內容
- hosts: web
  tasks:
  - name: creategroup
    group: name={{ item }}
    with_items: - yunwei
    - kaifa
    - ceshi
  - name: createuser
    user: name={{ item.name }} group={{ item.group }}
    with_items: - {'name':zs,'group':yunwei} - {'name':lss,'group':kaifa} - {'name':ww,'group':ceshi}
[root@localhost yaml]# ansible-playbook p9.yml         # 結果自行驗證

playbook: p9.yml
[root@localhost yaml]# ansible-playbook p9.yml

四、template模塊

  先來回憶一下redis的安裝,爲了安全起見,咱們一般在redis安裝完成後要更改redis的配置文件redis.conf,其中有一項是更改bind參數,讓redis能夠遠程訪問,實際開發中bind 參數爲本機對外ip地址,而不能使用0.0.0.0開啓,這時,問題來了,使用ansible批量傳輸配置文件時,如何將bind參數設置爲被管控機的ip地址?架構

首先,咱們使用setup模塊查詢一下被管控機的ip地址,以下:

 

 

 

 

 

 

 

 

 

在管控機上安裝redis後,編輯配置文件redis.conf,更改bind參數以下:

vi  /etc/redis.conf    # 編輯redis配置文件,更改bind參數爲以下內容

 

 

 

 示例:

[root@localhost yaml]# vi p10.yml 
- hosts: web
  tasks:
  - name: install
    yum: name=redis
  - name: copyfile
    template: src=/etc/redis.conf dest=/etc/redis.conf
  - name: start
    service: name=redis state=started
[root@localhost yaml]# ansible-playbook --syntax-check p10.yml 

playbook: p10.yml
[root@localhost yaml]# ansible-playbook p10.yml

  驗證:查看web組的被管控機的redis配置文件中bind參數

 

 

 

 

 

 

copy 模塊與template 模塊的區別:  copy 模塊不替換參數, 而template模塊替換參數.使用相對路徑:  在上面p10.yml 中, template模塊的src參數使用的是絕對路徑, 除此以外,咱們還可使用相對路徑,以下 :

[root@localhost yaml]# vi p10.yml 
- hosts: web
  tasks:
  - name: install
    yum: name=redis
  - name: copyfile
    template: src=redis.conf dest=/etc/redis.conf
  - name: start
    service: name=redis state=started
[root@localhost yaml]# ansible-playbook --syntax-check p10.yml 

playbook: p10.yml
[root@localhost yaml]# ansible-playbook p10.yml

注意:  使用相對路徑的前提是在當前目錄  (p10.yml 文件所在目錄)  下 新建一個templates  (必須叫這個)  目錄, 而後把文件redis.conf放在templates目錄裏面

 

 五、handlers

上面咱們曾提到過, modul 具備 "冪等" 性,  因此當遠端系統被人修改時, 能夠重放 playbooks 達到恢復的目的, playbooks 自己能夠識別這種改動, 而且有一個基本的event sysem(事件系統), 能夠響應這種改動, (當發生改動時)  'notify'  actions 會在playbook的每個task結束時觸發, 並且即便有多個不一樣的task 通知改動的發生 , notify   actions 只會被觸發一次.

  舉例來講,好比多個 resources 指出由於一個配置文件被改動,因此 apache 須要從新啓動,可是從新啓動的操做只會被執行一次。

  'notify' 下列出的便是 handlers。Handlers 也是一些 task 的列表,經過名字來引用,它們和通常的 task 並無什麼區別。Handlers 是由通知者進行 notify,若是沒有被 notify,handlers 不會執行,無論有多少個通知者進行了 notify,等到 play 中的全部 task 執行完成以後,handlers 也只會被執行一次。

示例:

[root@localhost yaml]# vi p11.yml 
- hosts: web
  tasks:
  - name: install
    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
[root@localhost yaml]# 
[root@localhost yaml]# ansible-playbook --syntax-check p11.yml 

playbook: p11.yml
[root@localhost yaml]# 
[root@localhost yaml]# ansible-playbook p11.yml                       
[root@localhost yaml]# ansible-playbook -t copyfile p11.yml           # 執行copyfile任務 和 restart任務,即修改完配置文件後重啓redis服務

 

3、roles

如今咱們已經學過 tasks 和 handlers,那怎樣組織 playbook 纔是最好的方式呢?簡單的回答就是:使用 roles ! roles 基於一個已知的文件結構,去自動的加載某些 vars_files,tasks 以及 handlers。基於 roles 對內容進行分組,使得咱們能夠容易地與其餘用戶分享 roles 。

  roles的優勢:

  - 目錄清晰

  - 能夠互相調用

  roles目錄結構:

  - 文件夾裏面是要建立的每個角色,每個角色一個文件夾;

  - 每個角色裏面都有tasks(必須的),templates,files,handlers,vars目錄;

  - 每一個目錄都要有main.yml文件,經過import_tasks來調用;

  - 其中templates文件夾中的文件能夠經過相對路徑來調用;

  其中files文件夾中的文件是否能夠經過相對路徑來調用?

  示例:

root
 ├── roles
 │   ├── cache
 │   ├── db
 │   └── web
 │       ├── files
 │       ├── handlers
 │       │   └── main.yml
 │       ├── tasks
 │       │   ├── copy_redis_conf.yml
 │       │   ├── install_redis.yml
 │       │   ├── main.yml
 │       │   └── start_redis.yml
 │       ├── templates
 │       │   └── redis.conf.j2
 │       └── vars
 └── web.yml
- name: install_redis
  yum: name=redis
root/roles/web/tasks/install_redis.yml
- name: copy_redis_conf
  template: src=redis.conf.j2  dest=/etc/redis.conf
  tags:  copy_redis_conf
  notify:  restart_redis
root/roles/web/tasks/copy_redis_conf.yml
- name:  start_redis
  service:  name=redis  state=started
root/roles/web/tasks/start_redis.yml
- import_tasks: install_redis.yml
- import_tasks:  copy_redis_conf.yml
- import_tasks:  start_redis.yml
root/roles/web/tasks/main.yml
- name:  restate_redis
  service:  name=redis   state=restarted
root/roles/web/handlers/main.yml
- hosts: web
  remote_user:  root
  roles:
  - web
root/web.yml
ansible-playbook  web.yml
ansible-playbook -t copy_redis_conf  web.yml   # 修改配置文件後加參數-t,觸發handler中任務

4、nginx基於uwsgi部署django

參考博客:https://blog.51cto.com/wangfeng7399/2341281

思考:如何用roles 來安裝nginx+uwsgi+mariadb + redis?

相關文章
相關標籤/搜索