文章目錄
- 0、概述
- `優點`
- 一、ansible用法
- `1.1.安裝ansible`
- `1.2.ansible參數選項`
- 二、相關檔案介紹
- `2.1.配置檔案`
- 2.1.1./etc/ansible/ansible.cfg解釋
- 2.1.2./etc/ansible/hosts格式
- `2.2.可執行檔案`
- 三、配置基于root使用者Key的驗證
- 四、ansible指令執行過程
- 五、執行狀态
- 六、常用子產品
- 七、ansible-galaxy
- 八、ansible-vault
- 九、ansible-playbook
- `9.1.核心元素`
- `9.2.playbook格式`
- `9.3.常用技巧`
- 1、ignore_errors忽略錯誤資訊
- 2、拷貝檔案使用相對路徑
- 3、handlers+notify解決修改配置檔案不生效的問題
- 4、tags打标簽
- 5、when條件判斷
- 6、疊代:with_items
- 7、become提權
- 8、lineinfile(類似于sed)
- 9、register注冊變量,傳回shell腳本執行結果
- 10、failed_when關鍵字
- 判斷作業系統
- 比對多個條件
- 11、任務委派功能delegate_to
- 12、本地操作功能local_action或connection
- 13、判斷檔案是否存在
- 14、判斷指定路徑是否為一個目錄
- 15、include
- 16、block子產品
- 17、pre_tasks在roles之前執行
- 18、set_fact設定變量
- 19、validate: 在複制之前執行檢測,如果要引用目标檔案名,則使用 %s
- `9.4.使用變量`
- a.系統facts收集
- b.在yaml檔案中通過vars定義
- c.在/etc/ansible/group_vars/all定義[推薦使用]
- d.在/etc/ansible/hosts中定義
- e.通過ansible-playbook -e傳入變量,優先級高于/etc/ansible/hosts【不推薦】
- `9.5.常用指令`
- `9.6.模闆templates`
- 1、簡單運算
- 2、for循環+if判斷
- 3、在模闆中擷取主機組的IP
- 4、在模闆中定義清單
- 5、擷取主機組數量
- 十、roles
- `10.1.流程圖`
- `10.2.各目錄作用`
- `10.3.示例`
- `10.4.在main.yml調用其它角色的任務`
- `10.5.給角色定義标簽`
- `10.6.委托其它機器執行角色`
參考視訊:https://www.bilibili.com/video/BV18t411f7CN?p=5
參考文章:
一文掌握 Ansible 自動化運維
0、概述
原則:去中心化、“簡單就是一切”
第一個版本0.0.1,釋出于2012年3月9日,作者Michael DeHaan
優點
優點
批量管理(支援上千台)、幂等性、模闆、子產品化、無服務端和用戶端(去中心化)
一、ansible用法
1.1.安裝ansible
1.1.安裝ansible
yum -y install epel-release
yum -y install ansible
1.2.ansible參數選項
1.2.ansible參數選項
選項 | 解釋 |
-m | 指定要執行的子產品,預設為command |
-a | 指定子產品的參數 |
-u | ssh連接配接的使用者名,預設用root,ansible.cfg中可以配置 |
-b,–become | 相當于sudo |
–become-user | sudo到哪個使用者,預設為root |
-k | 提示輸入sudo密碼,當不是NOPASSWD模式時使用 |
-C | 隻是測試一下會改變什麼内容,不會真正去執行 |
-f | fork多少程序并發處理,預設為5個 |
-i | 指定hosts檔案路徑,預設default=/etc/ansible/hosts |
–list-host | 隻列印有哪些主機會執行這個指令,不會實際執行 |
–private-key | 私鑰路徑 |
-T | ssh連接配接逾時時間,預設是10秒 |
-t | 日志輸出到該目錄,日志檔案名以主機命名 |
-vvv | 顯示詳細日志 |
舉例:
ansible all --list-host #列出inventory定義的所有主機
ansible all -m ping -b --become-user root #sudo到root執行ping子產品
二、相關檔案介紹
2.1.配置檔案
2.1.配置檔案
/etc/ansible/ansible.cfg #主配置檔案
/etc/ansible/hosts #主機清單
/etc/ansible/roles/ #存放角色目錄
2.1.1./etc/ansible/ansible.cfg解釋
Ansible查找ansible.cfg檔案的位置及順序
1)ANSIBLE_CONFIG:首先,Ansible指令會檢查環境變量,及這個環境變量将指向的配置檔案
2)./ansible.cfg:其次,将會檢查目前目錄下的ansible.cfg配置檔案
3)~/.ansible.cfg:再次,将會檢查目前使用者home目錄下的.ansible.cfg配置檔案
4)/etc/ansible/ansible.cfg:最後,将會檢查在用軟體包管理工具安裝Ansible時自動産生的配置檔案
inventory = /etc/ansible/hosts #存放主機清單檔案
forks = 5 #并發執行數量
poll_interval = 15 #回頻率或輪詢間隔時間,機關s
sudo_user = root #遠端主機sudo到什麼使用者,預設為root
ask_sudo_pass = True #sudo時是否需要輸入密碼
ask_pass = True #執行ansible-playbook是否需要密碼.預設為no
transport = smart
remote_port = 22 #遠端主機端口号
module_lang = C #子產品和系統之間通信的語言
module_set_locale = False
roles_path = /etc/ansible/roles #預設下載下傳的Roles存放的目錄
host_key_checking = False #首次連接配接是否需要檢查key認證。設定為False,第一次連接配接遠端主機不需要輸入yes
timeout = 10 #SSH逾時時間
remote_user = root #使用/usr/bin/ansible-playbook連結的預設使用者名,預設使用目前使用者名稱
log_path = /var/log/ansible.log #日志檔案存放路徑
executable = /bin/sh #執行的shell環境,使用者shell子產品
jinja2_extensions = jinja2.ext.do,jinja2.ext.i18 #允許開啟jinja2擴充子產品
private_key_file = /path/to/file #私鑰檔案存儲位置
system_warnings = True #禁用系統運作Ansible潛在問題警告
deprecation_warnings = True #PlayBook輸出禁用“不建議使用”警告
nocolor = 1 #輸出帶上顔色差別,0表示開啟,1表示關閉
pipelining = False #是否開啟pipe SSH通道優化
host_key_checking = False #配置ssh免密時不提示yes/no
gathering = explicit #不收集系統資訊,預設收集
[privilege_escalation]
become=True #是否sudo
become_method=sudo #sudo方式
become_user=root #sudo後變為root使用者
become_ask_pass=False #sudo後不驗證密碼
2.1.2./etc/ansible/hosts格式
[DB] #表示DB組,下面的主機均屬于該組
192.168.1.2
192.168.1.3
[fastdfs]
192.168.1.2
192.168.1.3 GROUP_NAME="g1" #定義局部變量
[k8s]
192.168.1.[4:10] #[4:10]表示連續的主機,包含4和10
[webserver]
192.168.1.11:2222 #預設為22端口,如果不是,需指定
[groups:children] #children是ansible内置變量,可以實作多個組的調用
DB
k8s
[DB:vars]
mysql_port="3306" #組變量
[all:vars] #定義全局變量
db_master_ip="{{groups['DB'][0]}}" #取DB組中的第一個IP
2.2.可執行檔案
2.2.可執行檔案
/usr/bin/ansible #主程式
/usr/bin/ansible-doc #檢視文檔
/usr/bin/ansible-galaxy #連接配接https://galaxy.ansible.com/下載下傳相應的roles
/usr/bin/ansible-playbook #調用playbook劇本
/usr/bin/ansible-vault #檔案加密工具
三、配置基于root使用者Key的驗證
以root使用者登入到主要端機器,ssh-keygen生成密鑰對,通過ssh-copy-id 遠端主機,将公鑰拷貝到遠端主機
四、ansible指令執行過程
- 加載自己的配置檔案,預設/etc/ansible/ansible.cfg
- 加載自己對應的子產品檔案,如command,或者ping
- 通過ansible将子產品或指令生成對應的臨時py檔案,并将該檔案傳輸至遠端伺服器的對應執行使用者$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY檔案
- 給檔案+x執行
- 執行并傳回結果
- 删除臨時py檔案,退出
五、執行狀态
綠色:執行成功并且不需要做改變的操作
黃色:執行成功并且對目标主機做變更
紅色:執行失敗
六、常用子產品
ansible 192.168.1.2 -m ping -k #測試主機是否可以通信;預設通過key驗證,-k指定以使用者名密碼驗證
ansible all -m ping #檢測主機清單檔案中的所有主機
ansible db -m ping #隻檢測db組内的主機
ansible *ser* -m ping #支援通配符
ansible 'db:web' -m ping #取db和web組的并集
ansible 'db:&web' -m ping #取db和web組的交集
ansible 'db:!web' -m ping #在db,不在web
ansible-doc -l #列出所有子產品
ansible-doc ping #檢視ping子產品
ansible-doc -s ping #簡單了解ping子產品
ansible all --list #列出主機清單所有主機
ansible all -a 'ls /root' #預設使用command模闆,不支援變量、<、>、|、&、;等,需使用shell子產品
ansible all -a 'creates=/ansible mkdir /ansible' #不存在/ansible,則執行後面的mkdir
ansible all -a 'chdir=/root ls' #切換到/root下執行ls
ansible all -m shell -a 'echo $HOSTNAME'
ansible all -m script -a '/etc/ansible/scripts/host.sh' #會自動把主要端的腳本拷貝到被控端,并執行
ansible all -m copy -a 'src=/etc/hosts dest=/ansible/' #拷貝本機檔案到遠端主機
ansible 192.168.119.134 -m copy -a "src=/etc/ansible dest=/tmp owner=root group=root mode=0755" # 拷貝本機目錄到遠端用戶端
ansible all -m copy -a 'content="hello world" dest=/ansible/f1' #把content裡面的内容寫入到f1檔案,會覆寫之前的内容
ansible all -m fetch -a 'src=/etc/hosts dest=files/ flat=yes' #拷貝遠端主機檔案到目前路徑的files/目錄下;flat隻拷貝hosts檔案本身,不拷貝hosts檔案所在的絕對路徑
ansible all -m file -a 'path=/ansible/f2 state=touch' #建立檔案
ansible all -m file -a 'path=/ansible/f2 state=absent' #删除檔案
ansible all -m file -a 'path=/ansible/dir1 state=directory' #建立目錄
ansible all -m file -a 'src=/etc/hosts dest=/tmp/host state=link' #建立軟連結
ansible 10.93.62.156 -m hostname -a 'name=Master' #修改主機名
ansible all -m cron -a 'minute=* weekday=2,4 job="/usr/bin/wall test warning" name=testcron' #定時任務
ansible all -m cron -a 'disabled=true job="/usr/bin/wall test warning" name=testcron' #取消定時任務
ansible all -m cron -a 'state=absent job="/usr/bin/wall test warning" name=testcron' #删除定時任務
ansible all -m yum -a 'name=vsftpd update_cache=yes' #yum裝包,更新緩存
ansible all -m yum -a 'name=vsftpd state=removed' #解除安裝包
ansible all -m user -a 'name=zhangsan shell=/bin/bash' #建立使用者
ansible web -m command -a "chdir=/tmp pwd" #切換目錄,執行指令
ansible子產品大全
七、ansible-galaxy
ansible-galaxy collection install nginxinc.nginx_core -c #下載下傳角色;-c忽略證書認證
ansible-galaxy list #列出本機所有角色
八、ansible-vault
ansible-vault encrypt hello.yml #加密yaml檔案,需設定密碼
ansible-vault view hello.yml #檢視yaml檔案内容
ansible-vault edit hello.yml #修改yaml檔案内容
ansible-vault rekey hello.yml #修改加密密碼
ansible-vault decrypt hello.yml #解密yaml檔案
九、ansible-playbook
9.1.核心元素
9.1.核心元素
hosts #執行的遠端主機清單
tasks #任務集
templates #模闆
handlers #也是task清單,和一般的task并沒有什麼差別.Handlers由通知者進行notify, 如果沒有被notify,handlers不會執行.不管有多少個通知者進行了notify,等到 play 中的所有 task 執行完成之後,handlers 也隻會被執行一次
tags #打标簽,通過标簽調用特定的任務;多個任務可以共用一個标簽
vars #定義變量
9.2.playbook格式
9.2.playbook格式
--- #習慣寫法,區分不同的檔案
# 建立檔案
- hosts: db,myql #選擇hosts檔案中的主機;可以選擇多個主機,使用逗号分隔
remote_user: root #指定遠端主機用什麼使用者執行
gather_facts: no #收集遠端主機資訊,預設為yes
tasks: #任務清單
- name: create file #任務說明
file: path=/ansible/f2 state=touch mode=0500 #使用file子產品,建立檔案;mode設定權限
- name: test1
shell: echo "{{ groups['mysql'][0] }}" >> /tmp/t1.txt #擷取[mysql]組的第一個成員
- hosts: redis:!redis[0] #排除redis組的第一個成員
9.3.常用技巧
9.3.常用技巧
1、ignore_errors忽略錯誤資訊
任務執行失敗,不會影響後面任務的執行
- name: create file
file: path=/ansible1/f2 state=touch
ignore_errors: True
2、拷貝檔案使用相對路徑
src使用相對路徑,會去與該yaml檔案同級的files目錄下尋找,通常把要拷貝的檔案同一放到files目錄下
- name: copy hosts
copy: src=hosts dest=/ansible/ backup=yes
3、handlers+notify解決修改配置檔案不生效的問題
當執行copy模闆後,通過notify發送通知給名字為restart httpd service的handlers,執行對應的service模闆,重新開機httpd服務
tasks:
- name: copy conf file
copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes
notify:
- restart httpd service
- name: start service
service: name=httpd state=started enabled=yes
handlers:
- name: restart httpd service
service: name=httpd state=restarted
4、tags打标簽
特殊tags:always #無論如何都會運作
- name: copy hosts
copy: src=hosts dest=/ansible/
tags: copyfile
調用多個标簽用逗号分隔
ansible-playbook -t copyfile,sql file.yml
5、when條件判斷
ansible條件判斷
根據作業系統的類型來執行對應的任務
tasks:
- name: create file for RedHat
file: path=/ansible/redhat state=touch
when: ansible_os_family == "RedHat"
- name: create file for ubuntu
file: path=/ansible/ubuntu state=touch
when: ansible_os_family == "Ubuntu"
自定義條件判斷
根據action的值去判斷

6、疊代:with_items
當需要有重複性執行的任務時,可以使用疊代機制
示例:建立多個檔案
tasks:
- name: create files
file: path=/ansible/{{ item }} state=touch
with_items:
- file1
- file2
示例:疊代嵌套子變量
tasks:
- name: create group
group: name={{ item }}
with_items:
- g1
- g2
- name: create user
user: name={{ item.name }} group={{ item.group }}
with_items:
- { name: "user1", group: "g1"}
- { name: "user2", group: "g2"}
7、become提權
- name: copy hosts
copy: src=hosts dest=/ansible/
become: yes
become_user: root #提升為root權限,類似sudo
8、lineinfile(類似于sed)
regexp正則比對,如果比對上,則整行替換,類似sed的c操作;如果未比對,則在末尾添加,類似sed的a操作
- name: modify file
lineinfile: dest=/ansible/file1 regexp="zabbix soft" line="zabbix soft nproc 65535"
playbook的一個bug:如果内容中有:号會報錯,用下面的寫法可以避免
- name: add paas sudo
lineinfile:
path: /etc/sudoers
regexp: "paas ALL=(ALL) NOPASSWD: ALL"
line: "paas ALL=(ALL) NOPASSWD: ALL"
9、register注冊變量,傳回shell腳本執行結果
使用 register 注冊變量,名為 result,會把shell子產品的輸出存入到result
debug子產品使用result的值進行判斷
tasks:
- name: install mysql
shell: cd /data/shell/ && sh InstallMySql.sh
register: result
- name: show install mysql debug
debug: var=result.stdout_lines verbosity=0
result.stdout #标準正确輸出儲存到字元串中
result.stdout_lines #标準正确輸出儲存到清單中,輸出更美觀
result.stderr_lines #标準錯誤輸出儲存到清單中
verbosity #為1,代表-v;為2,代表-vv;為3,代表-vvv
10、failed_when關鍵字
’ failed_when’不會影響shell子產品的執行過程,隻會在條件成立時影響shell子產品最終的執行狀态,以便停止playbook的運作。
---
- hosts: db
remote_user: root
tasks:
- debug:
msg: "I execute normally"
- shell: "echo 'This is a string for testing error' && exit 1"
register: result
failed_when: result.rc != 0
- debug:
msg: "I never execute,Because the playbook has stopped
類似于shell中的
if [[ $? -ne 0 ]];then
exit 1
fi
判斷作業系統
- hosts: redhat
gather_facts: True
tasks:
- name: copy redhat7 packages
copy:
src: /tmp/redhat7.tar
dest: /tmp/redhat7.tar
mode: '0755'
when: ansible_distribution == "RedHat" and ansible_distribution_major_version == "7"
比對多個條件
1、兩個條件都滿足
failed_when: ' "error" in result.stdout and "fail" in result.stdout'
2、滿足兩個條件中的任意一個
failed_when: ' "error" in result.stdout or "fail" in result.stdout'
11、任務委派功能delegate_to
實作在目前playbook主機組外的機器上執行操作
run_noce: true 在一個主機上面隻執行一次一個任務. ,如果沒有這個參數的話,每個playbook中的組的主機都會執行一次
- name: test
shell: echo "1" >> /root/a.txt
delegate_to: 127.0.0.1
run_once: true
委派Ansible所在的機器(即主要端)執行shell裡面的操作
12、本地操作功能local_action或connection
ansible的delegate_to、connection、和local_action
13、判斷檔案是否存在
如果不存在,則建立
- name: Check a.txt exists
stat:
path: /etc/ansible/a.txt
register: file_status
- name: create a.txt
shell: touch a.txt
when: file_status.stat.exists == False
14、判斷指定路徑是否為一個目錄
- hosts: test
vars:
testpath1: "/testdir/test"
testpath2: "/testdir"
tasks:
- debug:
msg: "file"
when: testpath1 is file
- debug:
msg: "directory"
when: testpath2 is directory
15、include
1、調用其它yml
例如:在tasks目錄有main.yml和upgrade_sql.yml,則可以在main.yml中調用upgrade_sql.yml
- include: upgrade_sql.yml
16、block子產品
将多個任務組合成一個塊,并且可以對這個塊做條件判斷,以及當塊裡面的任務失敗時,進行失敗處理
1、當when的判斷語句一樣時,可以将任務合并
- name: block的用法
hosts: node
tasks:
- debug:
msg: "task1 not in block"
- block:
- debug:
msg: "task2 in block1"
- debug:
msg: "task3 in block1"
when: 2 > 1
2、"錯誤處理"功能
- hosts: testuser
remote_user: root
tasks:
- block:
- command: /bin/false
- debug:
msg: 'I never execute, due to the above task failing'
rescue: #當上面的塊失敗時,該關鍵字下面的任務将被執行
- command: /bin/false
- debug:
msg: 'I also never execute'
always: #不管block塊是否執行成功,該關鍵字定義的任務都要被執行。
- debug:
msg: "This always executes"
when: 2>1
17、pre_tasks在roles之前執行
如果想在調用roles之前執行tasks任務,得用pre_task,不然會跳過tasks,直接調用roles
- hosts: web
pre_tasks:
- name: pre check
shell: echo "預檢查"
roles:
- nginx
18、set_fact設定變量
擷取本機IP位址,并指派給變量host_ip_address
- hosts: mysql
tasks:
- name: get host ip address
shell: "ip addr |awk '/inet /' |sed -n '2p' |awk -F' ' '{print $2}' |awk -F'/' '{print $1}'"
register: host_ip
changed_when: false
- name: set host_ip_address variable
set_fact:
host_ip_address: "{{ host_ip.stdout }}"
- name: show host_ip_address
debug: msg={{ host_ip_address }}
19、validate: 在複制之前執行檢測,如果要引用目标檔案名,則使用 %s
- name: copy nginx.conf to {{ NGINX_DATA }}/conf
template:
src: nginx.conf.j2
dest: "{{ NGINX_DATA }}/conf/nginx.conf"
backup: yes
validate: 'nginx -t -c %s'
9.4.使用變量
9.4.使用變量
變量名由字母、數字、下劃線組成,隻能以字母開頭
列印所有變量
ansible web -m debug -a 'var=vars'
a.系統facts收集
系統變量在playbook中可以直接通過{{ 名字 }}調用,如{{ ansible_hostname }}
ansible web -m setup #列印所有系統資訊
ansible web -m setup -a 'filter=ansible_hostname' #擷取主機名
ansible web -m setup -a 'filter=ansible_all_ipv4_addresses' #擷取IP位址
b.在yaml檔案中通過vars定義
- hosts: db
remote_user: root
vars:
- filename: f4
tasks:
- name: create file
file: path=/ansible/{{ filename }} state=touch
c.在/etc/ansible/group_vars/all定義[推薦使用]
定義的是全局變量,主機清單中的主機均可以調用
ANSIBLE_DIR: "/opt/ansible" #存放ansible拷貝的檔案
SERVICE_USER: "admin" #啟動服務的使用者
DATA_DIR: "/app" #資料主目錄
JDK_DIR: "{{ DATA_DIR }}/jdk" #jdk資料路徑
d.在/etc/ansible/hosts中定義
http_port為針對單台主機設定的變量,nodename為針對web組所有主機設定的變量
[web]
10.93.91.80 http_port=80
10.93.65.2 http_port=81
[web:vars]
nodename=www
[all:vars] #定義全局變量
web_master_ip="{{groups['web'][0]}}" #取web組中的第一個IP
e.通過ansible-playbook -e傳入變量,優先級高于/etc/ansible/hosts【不推薦】
playbook調用變量(兩個雙花括号裡面寫變量名)
- name: create file
file: path=/ansible/{{ filename }} state=touch
通過-e傳入變量
ansible-playbook -e 'filename=f3' file.yml
9.5.常用指令
9.5.常用指令
選項 | 解釋 |
-f | 并發執行數量,預設為5 |
–ssh-common-args | 指定要傳遞給sftp/scp/ssh的公共參數(例如ProxyCommand) |
-i | 指定主機清單檔案,如果安裝了ansible工具,不指定預設使用/etc/ansible/hosts檔案 |
ansible-playbook -C file.yml #隻檢測可能會發生的改變,并不真正執行
ansible-playbook file.yml #執行playbook
ansible-playbook file.yml --list-hosts #列出運作任務的主機
ansible-playbook file.yml --limit 10.93.65.2 #隻在指定的主機執行
ansible-playbook file.yml --list-tasks #檢視任務清單
ansible-playbook file.yml --list-tags #檢視标簽清單
python ./ansible-playbook -f 3 -i hosts-192.168.137.3 /tmp/test.yml #通過python調用ansible-playbook,把ansible-playbook的内容放到ansible-playbook目錄下即可
9.6.模闆templates
9.6.模闆templates
使用jinjia2語言
在與playbook同級的目錄下建立templates目錄
檔案名以.j2結尾
1、簡單運算
vi templates/nginx.conf.j2
這裡面做了一個簡單的計算,讓遠端主機CPU的個數乘以2
user nginx
workproceess {{ ansible_processor_vcpus*2 }}
playbook寫法
- name: copy templates
template: src=nginx.conf.j2 dest=/ansible/nginx.conf
執行之後的結果,CPU的個數是8
2、for循環+if判斷
for循環格式:
{% for port in ports %}
語句塊1
語句塊2
...
{% endfor %}
if判斷格式:
單分支
{% if p.name is defined %} #如果變量不為空,則執行裡面的語句塊
語句塊
{% endif %}
#多分支
{% if db_type== "mysql" %}
DB_IP=192.168.1.2
{% elif db_type== "oracle" %}
DB_IP=192.168.1.3
{% endif %}
playbook寫法:
- hosts: all
remote_user: root
vars:
ports:
- port: 80
name: web1
- port: 81
tasks:
- name: copy templates
template: src=nginx.conf.j2 dest=/ansible/nginx.conf
模闆檔案:
{% for p in ports %}
server {
listen {{ p.port }}
{% if p.name is defined %}
servername {{ p.name }}
{% endif %}
}
{% endfor %}
執行結果:
3、在模闆中擷取主機組的IP
groups[‘web’]可以擷取hosts檔案中的web主機組定義的主機
{% if groups['web'] is defined and groups['web'][0] is defined %} #如果web組定義,且至少有一個主機
upstream web {
{% for ip in groups['web'] %}
server {{ ip }}:{{ WEB_PORT}} fail_timeout=5s max_fails=3;
{% endfor %}
{% endif %}
4、在模闆中定義清單
{% for service_name in ['web','mysql'] %}
{{ service_name }}
{% endfor %}
5、擷取主機組數量
"{{ groups['master'] | length }}"
十、roles
用于層次性、結構化地組織playbook,可以看成是一大堆playbook的集合。
分别将變量、檔案、模闆、任務放置于單獨的目錄中
10.1.流程圖
10.1.流程圖
10.2.各目錄作用
10.2.各目錄作用
10.3.示例
10.3.示例
調用role的playbook需要與roles目錄位于同級目錄下
nginx_role.yml内容:
- hosts: web
remote_user: root
roles:
- nginx
roles目錄結構
main.yml内容,作為任務總入口,用來調用子任務
- include: group.yml
- include: user.yml
- include: config.yml
- include: copy.yml
ansible-playbook nginx_role.yml
10.4.在main.yml調用其它角色的任務
10.4.在main.yml調用其它角色的任務
- include: roles/mysql/tasks/install.yml
10.5.給角色定義标簽
10.5.給角色定義标簽
- hosts: web
remote_user: root
roles:
- { role: nginx, tags: ['web', 'nginx'] }
- { role: httpd, tags: ['web', 'httpd'], when: ansible_os_family == "RedHat" } #根據when條件執行角色
10.6.委托其它機器執行角色
10.6.委托其它機器執行角色
- hosts: web
remote_user: root
roles:
- { role: nginx, delegate_to: 127.0.0.1 }