劇本編寫擴展功能
a 在劇本中設(shè)置變量信息
b 在劇本中設(shè)置注冊信息
c 在劇本中設(shè)置判斷信息
d 在劇本中設(shè)置循環(huán)信息
e 在劇本中設(shè)置錯誤忽略
f 在劇本中設(shè)置標簽信息
g 在劇本中設(shè)置觸發(fā)信息
設(shè)置變量方法一: 在劇本中設(shè)置變量
- hosts: 172.16.1.41
vars:
data_dir: /oldboy
tasks:
- name: copy file 01
copy: src={{ data_dir }}/oldboy01.txt dest=/tmp
- name: copy file 02
copy: src={{ data_dir }}/oldboy02.txt dest=/opt
- name: copy file 03
copy: src={{ data_dir }}/oldboy03.txt dest=/usr/local/
設(shè)置變量方法二: 在命令中設(shè)置變量
ansible-playbook -e data_dir=/oldboy test_變量配置功能.yml
設(shè)置變量方法三: 在主機清單中設(shè)置
a: 單個主機設(shè)置變量
172.16.1.41 data_dir=/oldboy
b: 多個主機設(shè)置變量
[oldboy]
172.16.1.41
[oldboy:vars]
data_dir=/oldboy
問題: 三種變量設(shè)置方式, 之間優(yōu)先級關(guān)系是什么
創(chuàng)建環(huán)境:
mkdir /oldboy/ -p
mkdir /oldgirl/ -p
mkdir /olddog/ -p
結(jié)論:
命令配置變量 最優(yōu)先
劇本配置變量 其次優(yōu)先
主機清單配置 最后選擇
[root@m01 ansible_playbook]# cat test_注冊功能配置.yml
- hosts: nfs_client
tasks:
- name: mount dir
mount: src=172.16.1.31:/data path=/mnt fstype=nfs state=mounted
- name: check mount
shell: df -h
register: oldboy
- name: display mount info
debug: msg={{ oldboy.stdout_lines }}
常見主機信息:
ansible_all_ipv4_addresses: 僅顯示ipv4的信息。
ansible_devices: 僅顯示磁盤設(shè)備信息。
ansible_distribution: 顯示是什么系統(tǒng),例:centos,suse等。
ansible_distribution_major_version: 顯示是系統(tǒng)主版本。
ansible_distribution_version: 僅顯示系統(tǒng)版本。
ansible_machine: 顯示系統(tǒng)類型,例:32位,還是64位。
ansible_eth0: 僅顯示eth0的信息。
ansible_hostname: 僅顯示主機名。
ansible_kernel: 僅顯示內(nèi)核版本。
ansible_lvm: 顯示lvm相關(guān)信息。
ansible_memtotal_mb: 顯示系統(tǒng)總內(nèi)存。
ansible_memfree_mb: 顯示可用系統(tǒng)內(nèi)存。
ansible_memory_mb: 詳細顯示內(nèi)存情況。
ansible_swaptotal_mb: 顯示總的swap內(nèi)存。
ansible_swapfree_mb: 顯示swap內(nèi)存的可用內(nèi)存。
ansible_mounts: 顯示系統(tǒng)磁盤掛載情況。
ansible_processor: 顯示cpu個數(shù)(具體顯示每個cpu的型號)。
ansible_processor_vcpus: 顯示cpu個數(shù)(只顯示總的個數(shù))。
- hosts: all
tasks:
- name: install software
yum: name=nfs-utils state=installed
- name: create data dir
file: path=/data/ state=directory
when: (ansible_hostname == "nfs01")
判斷語法結(jié)構(gòu)信息:
01. 匹配單個信息:
when: (ansible_hostname == "nfs01")
02. 匹配多個信息 ???
when: (ansible_hostname == "nfs01") or (ansible_hostname == "backup")
when: (ansible_hostname == "nfs01") and (ansible_eth0 == "10.0.0.31")
03. 對匹配信息進行取反
when: (ansible_hostname != "nfs01")
編寫循環(huán)功能:
編寫方式一: 列表方式設(shè)置循環(huán)
- hosts: 172.16.1.41
tasks:
- name: install software
yum: name={{ item }} state=installed
with_items:
- rsync
- nfs-utils
- telnet-server
編寫方式二: 字典方式設(shè)置循環(huán)
- hosts: 172.16.1.41
tasks:
- name: create user
user: name={{ item.old01 }} uid={{ item.old02 }} shell={{ item.old03 }}
with_items:
- {old01: 'oldboy01', old02: '5001', old03: '/sbin/nologin'}
- {old01: 'oldboy02', old02: '5002', old03: '/sbin/nologin'}
- e.劇本忽略錯誤功能 劇本中shell模塊使用時錯誤問題
[root@m01 ansible_playbook]# cat test_忽略錯誤配置.yml
- hosts: 172.16.1.41
tasks:
- name: install software
shell: yum install -y htop
- name: create user
shell: useradd oldboy
ignore_errors: yes 開啟忽略錯誤功能
- name: boot server
shell: systemctl start rsyncd
=====================================================
補充: 使用shell萬能模塊會出現(xiàn)的問題:
01. 實現(xiàn)批量管理操作會更加麻煩
02. 實現(xiàn)劇本任務(wù)功能,不具有冪等性
=====================================================
- name: create user
user: name=rsync shell=/sbin/nologin create_home=no
tags: oldboy01
ansible-playbook test_標簽功能配置.yml -t oldboy01 --- 只執(zhí)行標記任務(wù)
ansible-playbook test_標簽功能配置.yml --skip-tags oldboy01 --- 跳過標記任務(wù)
[root@m01 ansible_playbook]# cat test_觸發(fā)功能配置.yml
- hosts: 172.16.1.41
tasks:
- name: push config file
copy: src=/tmp/rsyncd.conf dest=/etc/
notify: rsync_restart
- name: boot server
service: name=rsyncd state=started
handlers:
- name: rsync_restart
service: name=rsyncd state=restarted
PS: 觸發(fā)器任務(wù)會在所有任務(wù)執(zhí)行完畢之后才執(zhí)行
劇本提高執(zhí)行效率
取消劇本收集主機信息功能
- hosts: 172.16.1.41
gather_facts: no --- 提升劇本執(zhí)行效率
tasks:
PS: 取消了收集信息功能, 判斷功能也無法使用了
==============================================================
總結(jié): 劇本執(zhí)行慢的原因
01. SSH遠程連接優(yōu)化沒有配置 關(guān)閉認證功能 關(guān)閉DNS反向解析功能
02. yum下面軟件慢 使用本地yum倉庫
03. 劇本執(zhí)行收集信息慢
04. 劇本執(zhí)行過程必須完整 yum -- 慢 -- ctrl+c -- yum lockfile is 調(diào)用
==============================================================
ansible劇本整合功能
方式一:include_tasks: f1.yml
- hosts: all
remote_user: root
tasks:
- include_tasks: f1.yml
- include_tasks: f2.yml
方式二:include: f1.yml
- include:f1.yml
- include:f2.yml
方式三:- import_playbook: 推薦
[root@m01 ansible-playbook]# cat main.yml
- import_playbook: base.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml
如何配置角色功能
第一個歷程: 配置好主機清單
vim /etc/ansible/roles/hosts
[rsync_server]
172.16.1.41
[rsync_client]
172.16.1.31
172.16.1.7
[nfs_server]
172.16.1.31
[nfs_client]
172.16.1.41
172.16.1.7
第二個歷程: 創(chuàng)建角色目錄
mkdir /etc/ansible/roles/rsync
mkdir /etc/ansible/roles/rsync/{tasks,files,vars,handlers,templates}
tasks: 目錄中定義任務(wù)的劇本信息
files: 保存要分發(fā)文件信息
vars: 目錄保存定義變量劇本文件
handlers: 目錄中保存觸發(fā)器劇本信息
templates: 目錄中保存模板文件(jinja2) ???
ansible-galaxy init nginx --- 創(chuàng)建角色目錄路徑信息
第三個歷程: 配置角色目錄中劇本信息
1) 編寫tasks/main.yml
編寫方式一: 直接編寫任務(wù)信息
- name: install software
yum: name=rsync state=installed
- name: push file info
copy: src={{ file_dir }}/{{ item.src }} dest={{ conf_dir }} mode={{ item.mode }}
notify:
- rsync_restart
- rsync_port
- rsync_port_info
with_items:
- {src: 'rsyncd.conf', mode: '644'}
- {src: 'rsync.password', mode: '600'}
when: ansible_eth0.ipv4.address == "10.0.0.41"
- name: create user
user: name=rsync shell=/sbin/nologin create_home=no
when: ansible_eth0.ipv4.address == "10.0.0.41"
- name: create backup dir
file: path=/backup state=directory owner=rsync group=rsync
...省略信息...
# cat copy_file.yml
- name: push file info
copy: src={{ file_dir }}/{{ item.src }} dest={{ conf_dir }} mode={{ item.mode }}
notify:
- rsync_restart
- rsync_port
- rsync_port_info
with_items:
- {src: 'rsyncd.conf', mode: '644'}
- {src: 'rsync.password', mode: '600'}
# cat install_rsync.yml
- name: install software
yum: name=rsync state=installed
進行多個任務(wù)劇本整合:
vim main.yml
- include_tasks: install_rsync.yml
- include_tasks: copy_file.yml
2) 保存files/文件信息
[root@m01 files]# ll
總用量 8
-rw-r--r-- 1 root root 409 8月 26 19:00 rsyncd.conf
-rw-r--r-- 1 root root 23 8月 26 18:23 rsync.password
3) 配置vars/main.yml
# cat ../vars/main.yml
conf_dir: /etc/
file_dir: /ansible_playbook/file
4) 配置handlers/main.yml
[root@m01 files]# cat ../handlers/main.yml
- name: rsync_restart
service: name=rsyncd state=restarted
- name: rsync_port
shell: netstat -lntup|grep rsync
register: rsync_port
- name: rsync_port_info
debug: msg={{ rsync_port.stdout_lines }}
第四個步驟: 調(diào)取角色信息
[root@m01 ansible]# cat roles/site.yml
- hosts: rsync_server,rsync_client
roles:
- rsync
第五個步驟: 執(zhí)行角色匯總劇本
ansible-playbook /etc/ansible/roles/site.yml -i /etc/ansible/roles/hosts
放置存儲模板文件
第一個歷程: 修改配置文件 變成 模板文件
vim rsyncd.conf
port = {{ prot }}
第二個歷程: 需要將模板文件移動到templates/目錄中
mv rsync/files/rsyncd.conf rsync/templates/
第三個歷程: 修改復制數(shù)據(jù)的模塊
copy 復制文件數(shù)據(jù) == '' 所見即所得
template 復制文件數(shù)據(jù) == "" 可以解析{{}}調(diào)取變量信息