Ansible 使用高級進階

Ansible 使用高級進階

實驗環境

分組:srvs

組內成員主機名、系統版本及IP

node1 CentOS-7-Core 172.16.253.184
node2 CentOS-7-Core 172.16.254.89
node3 CentOS-7-Core 172.16.253.47
node4 CentOS-6-Core 172.16.253.30

playbook的迭代功能

  • 簡單的item使用
---

- hosts: srvs
  remote_user: root
  tasks:
  - name: copy files
    tags: copy
    when: ansible_distribution_major_version == "7"
    copy: src=/root/ansible/{{ item }} dest=/tmp/{{ item }}
    with_items: 
    - httpd.conf
    - httpd.conf.j2
    - httpd-manager.yml
    - httpd-manager-j2.yml
  • item 多重使用

注意:playbook文件內容格式要求非常嚴格,{ user: “test1” , group: “wheel” }中, user: 與 “test1” 之間有空格

---

- hosts: srvs
  remote_user: root
  tasks:
  - name: add users
    tags: addusers
    when: ansible_distribution_major_version == "7"
    user: name={{ item.user }} group={{ item.group }} state=present
    with_items:
    - { user: "test1" , group: "wheel" }
    - { user: "test2" , group: "root" }

ansible之roles

ansible的roles用於層次性、結構化地組織palybook。roles能夠根據層次型結構自動裝載變量文件、tasks及handlers等。要使用roles只需要playbook中使用include指令即可。roles的應用場景

  • 變更指定主機或主機分組
  • 因不規範造成的維護困難或傳承成本大
  • 某些功能集需includes多個playbook方可實現
  • 代碼複用度較高時

roles的組成

root@node1 playbook]# tree  roles/
roles/ \\ansible所有的信息都放到此目錄下面對應的目錄中
└── nginx  \\角色名稱
    ├── default  \\爲當前角色設定默認變量時使用此目錄,應當包含一個main.yml文件;
    ├── files  \\存放有copy或script等模塊調用的文件
    ├── handlers \\此目錄總應當包含一個main.yml文件,用於定義各角色用到的各handler
    ├── meta \\應當包含一個main.yml,用於定義角色的特殊設定及其依賴關係;1.3及以後版本支持
    ├── tasks \\至少包含一個名爲main.yml的文件,定義了此角色的任務列表,可使用include指令
    ├── templates \\template模塊會自動在此目錄中尋找Jinja2模板文件
    └── vars  \\應當包含一個main.yml文件,用於定義此角色用到的變量

用ansible的roles來配置nginx服務

定義hosts分組

vim /etc/ansible/hosts
[srvs:vars]
webport=80

[srvs]
172.16.253.184 webport=10080 
172.16.254.89 webport=10180
172.16.253.47 webport=10280 
172.16.253.30 webport=10380

創建roles組織結構

#創建調用roles 的 .yml 文件
touch /root/ansible/nginx.yml
#創建roles目錄結構
mkdir -pv nginx/{files,tasks,templates,vars,handlers,meta,default}

建立roles:nginx

  • 定義調用哪個roles的使用範圍及用戶
vim /root/ansible/nginx.yml
---

- hosts: srvs
  remote_user: root
  roles:
  - nginx
  • 在 main.yml 文件中定義roles調用的原子級功能模塊:install , config + restart
#在 main.yml 中定義roles調用功能
vim /root/ansible/roles/nginx/tasts/main.yml
---

- include: install.yml
- include: config.yml
- include: stop.yml
  • 建立各原子級功能
#定義install功能
vim /root/ansible/roles/nginx/tasts/install.yml
---

- name: install
  yum: name=nginx state=present

#定義config功能
vim /root/ansible/roles/nginx/tasts/config.yml
---

- name: template  
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  notify: restart nginx

#定義stop的功能
vim /root/ansible/roles/nginx/tasts/stop.yml
---

- name: stop nginx
  service: name=nginx state=stopped
  • 建立handlers功能
vim /root/ansible/roles/nginx/handlers/main.yml
---
# handlers file for nginx

- name: restart nginx
  service: name=nginx state=restarted
  • 建立nginx配置文件的 .j2 模板

此步驟可以先在master主機上安裝nginx,獲取nginx的默認配置文件並修改成爲 .j2 模板文件

#先製作原始配置文件的備份
cp /etc/nginx/nginx.conf /root/ansible/roles/nginx/files/nginx.conf.bak
#使用原始配置文件製作 .j2 模板文件
cp /etc/nginx/nginx.conf /root/ansible/roles/nginx/templates/nginx.conf.j2
vim /root/ansible/roles/nginx/templates/nginx.conf.j2
#修改原始配置文件的 server{ }配置段 如下:

{% for vport in vports %}
    server {
        listen       {{ vport }};
        server_name  {{ ansible_hostname }}.achudk.com;
        root         /usr/share/nginx/html;

        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
{% endfor %}
  • 創建變量文件
vim /root/ansible/roles/nginx/vars/main.yml
---
# vars file for nginx

vports:
 - 80 
 - 8080

nginx的組織結構樹狀圖

  • ==nginx的組織樹狀圖==
[root@node1 roles]# tree /root/ansible/roles/nginx/

nginx/
├── default
├── files
│   └── nginx.conf.bak
├── handlers
│   └── main.yml
├── meta
├── tasks
│   ├── config.yml
│   ├── install.yml
│   ├── main.yml
│   └── stop.yml
├── templates
│   └── nginx.conf.j2
└── vars
    └── main.yml
  • 驗證結果
ansible-playbook /root/ansible/nginx.yml

PLAY [srvs] ********************************************************************

TASK [Gathering Facts] *********************************************************
ok: [172.16.254.89]
ok: [172.16.253.30]
ok: [172.16.253.184]
ok: [172.16.253.47]

TASK [nginx : install] *********************************************************
changed: [172.16.253.30]
changed: [172.16.253.47]
changed: [172.16.253.184]
changed: [172.16.254.89]

TASK [nginx : template] ********************************************************
changed: [172.16.253.30]
changed: [172.16.253.47]
changed: [172.16.253.184]
changed: [172.16.254.89]

TASK [nginx : stop nginx] ******************************************************
ok: [172.16.253.30]
ok: [172.16.253.47]
ok: [172.16.254.89]
ok: [172.16.253.184]

RUNNING HANDLER [nginx : restart nginx] ****************************************
changed: [172.16.253.30]
changed: [172.16.253.47]
changed: [172.16.253.184]
changed: [172.16.254.89]

PLAY RECAP *********************************************************************
172.16.253.184             : ok=5    changed=3    unreachable=0    failed=0   
172.16.253.30              : ok=5    changed=3    unreachable=0    failed=0   
172.16.253.47              : ok=5    changed=3    unreachable=0    failed=0   
172.16.254.89              : ok=5    changed=3    unreachable=0    failed=0

更多高級用法請參照《Ansible中文權威指南》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章