ansible是一個能夠同時操做多臺服務器的工具 (相似工具:saltstack)python
每天說運維,到底是幹什麼的?先看看工做流程唄。通常來講,運維工程師在一家企業裏屬於個位數的崗位,甚至只有一個。面對生產中NNN臺服務器,NN我的員,工做量也是很是大的。
因此嘛,圖中的我好歹也會配置盔甲的。mysql
這就是我主要乾的事情(呵呵)linux
就算你會很厲害的腳本,面對成百上千,甚至上萬的主機,效率問題將會困擾你的。
所以,有沒有解放的工具呢?這就是運維自動化的目的,下面咱們看下一個運維自動化工具nginx
Ansible是自動化運維和DevOps中持續部署的必備神器,經過Playbook的自動化任務能夠解放運維工做量web
Ansible 簡單的說是一個配置管理系統(configuration management system)。你只須要可使用 ssh 訪問你的服務器或設備就行。它也不一樣於其餘工具,由於它使用推送的方式,而不是像 puppet 等 那樣使用拉取安裝agent的方式。你能夠將代碼部署到任意數量的服務器上!redis
Ansible實現了批量系統配置、批量程序部署、批量運行命令等功能。ansible是基於模塊工做的,自己沒有批量部署的能力。真正具備批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:sql
(1)、鏈接插件connection plugins:負責和被監控端實現通訊;mongodb
(2)、host inventory:指定操做的主機,是一個配置文件裏面定義監控的主機;shell
(3)、各類模塊核心模塊、command模塊、自定義模塊;django
(4)、藉助於插件完成記錄日誌郵件等功能;
(5)、playbook:劇本執行多個任務時,非必需可讓節點一次性運行多個任務。
ansible能夠幫助咱們完成一些批量任務,或者完成一些須要常常重複的工做。 好比:同時在100臺服務器上安裝nginx服務,並在安裝後啓動它們。 好比:將某個文件一次性拷貝到100臺服務器上。 好比:每當有新服務器加入工做環境時,你都要爲新服務器部署某個服務,也就是說你須要常常重複的完成相同的工做。 這些場景中咱們均可以使用到ansible。
(1)、no agents:不須要在被管控主機上安裝任何客戶端;
(2)、no server:無服務器端,使用時直接運行命令便可;
(3)、modules in any languages:基於模塊工做,可以使用任意語言開發模塊;
(4)、yaml,not code:使用yaml語言定製劇本playbook;
(5)、ssh by default:基於SSH工做;
(6)、strong multi-tier solution:可實現多級指揮。
PLAYBOOKS: 任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序依次執行,一般是JSON格式的YML文件 INVENTORY: Ansible管理主機的清單/etc/anaible/hosts MODULES: Ansible執行命令的功能模塊,多數爲內置的核心模塊,也可自定義,ansible-doc –l 可查看模塊 PLUGINS: 模塊功能的補充,如鏈接類型插件、循環插件、變量插件、過濾插件等,該功能不經常使用 API: 供第三方程序調用的應用程序編程接口 ANSIBLE: 組合INVENTORY、 API、 MODULES、PLUGINS的綠框,能夠理解爲是ansible命令工具,其爲核心執行工具
注意:
執行ansible的主機通常稱爲主控端,中控,master或堡壘機 主控端Python版本須要2.6或以上 被控端Python版本小於2.4須要安裝python-simplejson 被控端如開啓SELinux須要安裝libselinux-python windows不能作爲主控端
8:Ansible與salt對比
相同 都是爲了同時在多臺機器上執行相同的命令 都是python開發 不一樣 agent(saltstack須要安裝、ansible不須要) 配置(salt配置麻煩,ansible基本不用配置) 學習路線(salt比較陡峭,ansible比較平緩) 第三方工具(salt比較少) 開源社區的對接(salt比較少) 現有用戶(salt仍是ansible少一些) 二次開發擴展的能力(ansible比較差,尤爲是2.0之後) 大規模併發(200之內同樣,200以上salt會好一些,固然咱們也能夠對ansible作一些配置使其在200以上追上salt) Windows的支持(salt會好不少)
請準備4臺centos7.5虛擬機
【主控端】(被控端不須要作什麼)
1:準備好epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2:安裝ansible
yum install -y ansible
3:生成密鑰對並拷貝公鑰到被控端,目的免祕鑰對登陸
ansible 經過ssh來鏈接並控制被控節點
ssh-keygen # 用來生成ssh的密鑰對 ssh-copy-id 192.168.107.131 # 複製祕鑰到遠程主機
能夠遠程登陸試一下是否成功
查看安裝ansible生成的文件
[root@ansible ~]# rpm -ql ansible|more
配置文件或指令 | 描述 |
---|---|
/etc/ansible/ansible.cfg | 主配置文件,配置ansible工做特性 |
/etc/ansible/hosts | 主機清單 |
/etc/ansible/roles/ | 存放角色的目錄 |
/usr/bin/ansible | 主程序,臨時命令執行工具 |
/usr/bin/ansible-doc | 查看配置文檔,模塊功能查看工具 |
/usr/bin/ansible-galaxy | 下載/上傳優秀代碼或Roles模塊的官網平臺 |
/usr/bin/ansible-playbook | 定製自動化任務,編排劇本工具 |
/usr/bin/ansible-pull | 遠程執行命令的工具 |
/usr/bin/ansible-vault | 文件加密工具 |
/usr/bin/ansible-console | 基於Console界面與用戶交互的執行工具 |
Ansible 配置文件/etc/ansible/ansible.cfg (通常保持默認) [defaults] #inventory = /etc/ansible/hosts # 主機列表配置文件 #library = /usr/share/my_modules/ # 庫文件存放目錄 #remote_tmp = $HOME/.ansible/tmp #臨時py命令文件存放在遠程主機目錄 #local_tmp = $HOME/.ansible/tmp # 本機的臨時命令執行目錄 #forks = 5 # 默認併發數 #sudo_user = root # 默認sudo 用戶 #ask_sudo_pass = True #每次執行ansible命令是否詢問ssh密碼 #ask_pass = True #鏈接時提示輸入ssh密碼 #remote_port = 22 #遠程主機的默認端口,生產中這個端口應該會不一樣 #log_path = /var/log/ansible.log #日誌 #host_key_checking = False # 檢查對應服務器的host_key,建議取消註釋。也就是不會彈出
ansible hosts文件:
# This is the default ansible 'hosts' file. # # It should live in /etc/ansible/hosts # # - Comments begin with the '#' character # 用#來表示註釋 # - Blank lines are ignored # 空白行被忽略 # - Groups of hosts are delimited by [header] elements # 主機組 須要在【】下面 # - You can enter hostnames or ip addresses #能夠寫主機名或者ip地址 # - A hostname/ip can be a member of multiple groups # 一臺主機能夠在多個組裏面 www[001:006].example.com #表示從www001到www006的機器
能夠在host文件中填寫的內容
ansible_ssh_host ansible經過ssh鏈接的IP或者FQDN ansible_ssh_port SSH鏈接端口 ansible_ssh_user 默認SSH鏈接用戶 ansible_ssh_pass SSH鏈接的密碼(這是不安全的,ansible極力推薦使用--ask-pass選項或使用SSH keys) ansible_sudo_pass sudo用戶的密碼 ansible_connection SSH鏈接的類型:local,ssh,paramiko,在ansible 1.2以前默認是paramiko,後來智能選擇,優先使用基於ControlPersist的ssh(支持的前提) ansible_ssh_private_key_file SSH鏈接的公鑰文件
[root@ansible ~]# ansible -h 查看幫助文檔
ansible <host-pattern> [options] -a MODULE_ARGS, --args=MODULE_ARGS #模塊的參數 -C, --check # 檢查 -f FORKS, --forks=FORKS #用來作高併發的 --list-hosts #列出主機列表 -m MODULE_NAME #模塊名稱 --syntax-check # 語法檢查 -k 輸入密碼
-v 輸出詳細信息
[root@ansible ~]# ansible-doc -h -j #以json的方式返回ansible的全部模塊 -l, --list#列出全部的ansible的模塊 -s#以片斷式顯示ansible的幫助信息
查看模塊的幫助信息 [root@ansible ~]# ansible-doc -s ping
操做:首先要相互ping通
[root@ansible ~]# ansible 192.168.107.121 -m ping
上面錯誤是由於在 /etc/ansible/hosts 文件中並無對應的被控端IP,所以須要修改/etc/ansible/hosts
能夠查看被控端主機列表
[root@ansible ~]# ansible web --list-hosts
測試單個主機
[root@ansible ~]# ansible 192.168.13.121 -m ping
測試全部
[root@ansible ~]# ansible all -m ping
測試單個組
[root@ansible ~]# ansible web -m ping
測試多個組 --並集
[root@ansible ~]# ansible 'web:db' -m ping [root@ansible ~]# ansible web,db -m ping
測試多個組 --交集
[root@ansible ~]# ansible 'web:&db' -m ping
測試多個組 --差集
[root@ansible ~]# ansible 'web:!db' -m ping web中存在但db中不存在的
查看command模塊幫助信息
[root@ansible ~]# ansible-doc -s command
-chdir 運行命令以前切換目錄
-creates 文件名若是已經存在,這一步不會執行
-removes 文件名若是已經存在,這一步會執行
詳細查看 [root@ansible ~]# ansible-doc command
不支持特殊符號
案例
ansible web -a 'ls /' ansible web -a 'pwd' ansible web -a 'chdir=/tmp pwd'# 切換目錄執行命令,使用場景是編譯安裝時使用 ansible web -a 'creates=/tmp pwd' # 用來判斷/tmp目錄是否存在,存在就不執行操做 ansible web -a 'creates=/data pwd' # 由於data不存在,全部纔會執行pwd命令 ansible web -a 'removes=/tmp pwd' #用來判斷tmp目錄是否存在,存在就執行操做 ansible web -a 'removes=/data pwd' #由於data不存在,全部纔不會執行
對web組裏全部主機上建立用戶 [root@ansible ~]# ansible web -a 'useradd lilz'
[root@ansible ~]# ansible web -a 'echo "123" |passwd --stdin lilz'
嘗試遠程登陸是失敗的
[root@ansible ~]# ansible web -m shell -a 'echo "123" |passwd --stdin lilz'
查看模塊幫助 [root@ansible ~]# ansible-doc -s shell
creates 文件存在,則不執行
removes 文件存在,就執行
shell、python、ruby、perl 被管控機
案例
ansible 192.168.107.131 -m shell -a 'bash a.sh' # 執行遠程文件方式一 ansible 192.168.107.131 -m shell -a '/root/a.sh' #執行遠程文件方式二,文件必須有執行權限 ansible 192.168.107.131 -m shell -a '/root/a.py' # 執行遠端的Python腳本
查看模塊的參數
[root@ansible ~]# ansible-doc -s script
案例
ansible web -m script -a '/root/m.sh' # 執行本地的文件,在被管控機上運行 ansible web -m script -a 'removes=/root/m.sh /root/m.sh' # 用來判斷被管控機上是否是存在文件,若是存在,存在就執行,不存在就不執行 ansible web -m script -a 'creates=/root/a.sh /root/m.sh' #用來判斷被管控機上是否是存在文件,若是存在,就不執行
查看模塊幫助
[root@ansible ~]# ansible-doc -s copy
把本地文件拷貝到遠程機器上
backup 備份,以時間戳結尾
dest 目的地址
group 文件的屬組
mode 文件的權限 r 4 w 2 x 1
owner 文件的屬主
src 源文件
content 直接把文字輸入到遠程端文件中
# 經過md5碼來判斷是否須要複製
案例:
ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh' #複製本地文件的到遠程主機 ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755' #修改文件的權限 ansible web -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755 owner=alex' 修改文件的屬主 ansible web -m copy -a 'src=/etc/init.d dest=/tmp/ mode=755 owner=alex' # 複製本地目錄到遠程主機,若是改變文件的屬性,則文件夾內的文件也會被改變 ansible web -m copy -a 'src=/etc/init.d/ dest=/tmp/ mode=755 owner=alex' # 複製本地目錄內的全部文件到遠程主機 ansible web -m copy -a "content='大弦嘈嘈如急雨,小弦切切如私語\n' dest=/tmp/b.txt" # 直接將文本內容注入到遠程主機的文件中
[root@ansible ~]# ansible-doc -s file
設置文件屬性
directory
touch
link
hard
absent
file
src
link
hard
path
案例
ansible db -m file -a 'path=/lzmly2 state=directory' #在遠程機器上建立文件夾 ansible db -m file -a 'path=/root/q.txt state=touch' #用來在遠程機器上建立文件 ansible db -m file -a 'path=/tmp/f src=/etc/fstab state=link' #建立軟鏈接src是源地址,path是目標地址 ansible db -m file -a 'path=/tmp/f state=absent' #用來刪除文件或者文件夾
[root@ansible ~]# ansible-doc -s fetch
獲取遠程節點的文件
dest 目的地址
src 源地址
案例
ansible web -m fetch -a 'src=/var/log/cron dest=/tmp' # 下載被控節點的文件到本地,對每臺機器建立一個文件夾,並保留原來的目錄結構
[root@ansible ~]# ansible-doc -s yum
disablerepo #禁用源
enablerepo #啓用源
name #包名
state
absent #卸載 installed #安裝 latest #安裝最新的版本 present #安裝 removed #卸載
案例
ansible web -m yum -a 'name=wget' # 安裝wget
ansible web -m yum -a 'name=python2-pip' # 安裝python2-pip
ansible web -m yum -a 'name=wget state=absent' # 卸載軟件包
ansible web -m yum -a 'name="@Development Tools"' # 安裝包組
回顧 yum grouplist # 查看包組信息 yum groupinstall # 安裝包組
查看模塊參數幫助信息 [root@ansible ~]# ansible-doc -s pip
回顧
pip install 安裝包 pip freeze > a.txt 將python的環境打包到文件中 pip install -r a.txt 安裝文件中的包 pip list 查看全部的以安裝成功的包
案例
ansible web -m pip -a 'name=flask' # 安裝flask模塊
[root@ansible ~]# ansible-doc -s service name state
restarted
reloaded
started
stopped
enabled
案例
ansible web -m service -a 'name=nginx state=started' # 啓動nginx ansible web -m service -a 'name=nginx state=stopped' # 關閉nginx
回顧
ps -ef|grep nginx #查看進程 ss -tnlp # 查看端口信息 systemctl start nginx # centos7 service nginx start # centos6 systemctl enabled nginx # centos7 開機自啓動 chkconfig nginx on # centos6開機自啓動
默認端口
nginx 80 http 80 https 443 mongodb 27017 redis 6379 mysql 3306 ssh 22 ftp 21 oracle 1521 window 遠程桌面3389 windows iis 80 django 8000 flask 5000
查看模塊幫助
[root@ansible ~]# ansible-doc -s cron day 天 disabled 禁用,被註釋掉了 hour 小時 job 任務 minute 分鐘 month 月 name 任務名字 weekday 周
state absent #刪除 present #建立
回顧
* * * * * job 分 時 日 月 周 任務 0 */2 * * * job 每隔兩個小時 0 12,13 * * * job 12點和13點 0 12-17 * * * job 12點到17點 0 12-17/2 * * 1,3,6,0 周1,周3,周6,周7 12點到17點每隔兩個小時 crontab -e # 編輯計劃任務 crontab -l # 查看計劃任務 crontab -r # 刪除計劃任務
案例
[root@ansible ~]# ansible web -m cron -a 'minute=26 job="touch aa.text" name=touchfile' 在被控端檢查 [root@localhost ~]# crontab -l #Ansible: touchfile 26 * * * * touch aa.text
ansible db -m cron -a 'minute=26 job="touch /tmp/xzmly.txt" name=touchfile' # 新建一個計劃任務 ansible db -m cron -a 'name=touchfile state=absent' # 刪除一個計劃任務 ansible db -m cron -a 'minute=26 job="touch /tmp/xzmly.txt" name=touchfile disabled=yes' # 禁用計劃任務,以#表示禁用
[root@ansible ~]# ansible-doc -s user group 組 groups 附加組 home 家目錄 name 用戶名 password 密碼 remove 刪除用戶並刪除用戶家目錄 shell 用戶登陸後使用的shell system 建立一個系統用戶 uid 用來指定用戶的id state 狀態
案例
ansible db -m user -a 'name=wulaoshi uid=4000 home=/opt/wulaoshi groups=root shell=/sbin/nologin' #建立一個用戶,並指定用戶的id,用戶的家目錄,用戶的附加組,用戶的shell ansible db -m user -a 'name=wulaoshi state=absent' #刪除用戶可是不刪除用戶的家目錄 ansible db -m user -a 'name=wulaoshi3 state=absent remove=yes' # 刪除用戶並刪除用戶的家目錄
回顧
用戶: 管理員 root 0 普通用戶 系統用戶 不能登陸 1-999 centos7 1-499 centos6 登陸用戶 能夠登陸 1000-65535 centos7 500-65535 centos6 用戶組: 管理員組 root 0 系統用戶組 1-999 centos7 1-499 centos6 登陸用戶組 1000-65535 centos7 500-65535 centos6 -d 指定用戶的家目錄 -g 指定用戶的組 -G 執行用戶的附加組 -s 指定登陸後使用的shell -r 建立一個系統組 useradd -r wusir 建立系統用戶, 從999倒序 useradd -s /sbin/nologin alexsb 建立的是普通用戶,從1000開始升序 useradd -d /opt/alexsb2 alexsb2 建立用戶時指定用戶的家目錄 useradd -u 3000 alexsb6 # 建立用戶並指定用戶的uid userdel alex 刪除用戶 userdel -r alexsb2 刪除用戶並刪除用戶的家目錄 groupadd yuchao 建立用戶組 groupdel yuchao 刪除用戶組
[root@ansible ~]# ansible-doc -s group gid 組的id name 組名 system 系統組 state
案例
ansible db -m group -a 'name=wulaoshi system=yes' #建立系統組 ansible db -m group -a 'name=wulaoshi state=absent' # 刪除組
[root@ansible ~]# ansible-doc -s setup 查看幫助,(setup功能:收集遠程主機信息)
查看web組遠程端的主機信息
[root@ansible ~]# ansible web -m setup
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
搜索信息(支持正則)
[root@ansible ~]# ansible web -m setup -a 'filter=*processor*'
做用:和copy模板相似,將文件模板拷貝到遠程服務器
copy和tamplate的區別
copy模塊不替代參數
template模塊替代參數
上面所說的參數就是系統參數,copy對於文件中的參數原封不動,而template則把根據遠程端信息替換對應參數,以下圖redis的配置文件,用參數替換IP,用template拷貝到遠程端就會被對應的IP替換掉
案例:
a.yml
- 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
這裏用了相對路徑: 在當前目錄(yml文件的那個目錄)下新建一個templates目錄,而後把要拷貝的文件放在templates目錄裏面
[root@ansible ~]# ansible-playbook --syntax-check a.yml 語法檢查 [root@ansible ~]# ansible-playbook a.yml 運行
Playbooks 與 ad-hoc 相比,是一種徹底不一樣的運用 ansible 的方式,是很是之強大的.
簡單來講,playbooks 是一種簡單的配置管理系統與多機器部署系統的基礎.與現有的其餘系統有不一樣之處,且很是適合於複雜應用的部署.
Playbooks 可用於聲明配置,更強大的地方在於,在 playbooks 中能夠編排有序的執行過程,甚至於作到在多組機器間,來回有序的執行特別指定的步驟.而且能夠同步或異步的發起任務.
playbook用yaml語言寫的
[root@ansible ~]# ansible-playbook -h -C, --check # 檢查,白跑,幹跑 -f FORKS, --forks=FORKS #用來作併發 --list-hosts # 列出主機列表 --syntax-check # 語法檢查
-t TAGS
兩種形式:字典、列表
至關於{host:db,vars:{user:alex},task:{}}
- hosts: web tasks: - name: creategroup group: name=alex10 - name: cretaeuser user: name=wusir10
注意:這個語言的格式及其嚴格
執行順序: 從上往下
特性:冪等性 無論執行多少遍,結果都是同樣的
等號後面不能有空格
- 後面也要有空格
嚴格對齊
a.yml
- hosts: web tasks: - name: creategroup group: name=alex10 - name: cretaeuser user: name=wusir10
[root@ansible ~]# ansible-playbook --syntax-check a.yml 檢測語法
運行
[root@ansible ~]# ansible-playbook a.yml
a.yml
- hosts: web tasks: - name: create{{ user }} user: name={{ user}}
方式一:
ansible-playbook -e 'user=alexsb10' a.yml
方式二:
[root@ansible ~]# vim /etc/ansible/hosts [web] 192.168.13.121 user=wusi 192.168.13.71 user=wusi 192.168.13.217 user=wusi
[root@ansible ~]# ansible-playbook a.yml 運行
方式三:
[root@ansible ~]# vim /etc/ansible/hosts [web] 192.168.13.121 192.168.13.71 192.168.13.217 [web:vars] #表示組的參數 user=wusi [root@ansible ~]# ansible-playbook a.yml
方式四:
[root@ansible ~]# vim a.yml - hosts: web vars: - user: wusi tasks: - name: create{{ user }} user: name={{ user }} [root@ansible ~]# ansible-playbook a.yml
方式五:
[root@ansible ~]# vim a.yml
- hosts: db
tasks:
- name: sum
shell: echo 7+8|bc
register: user #這個是shell運行結果產生的變量
- name: createuser
user: name={{user.stdout}} #若是把shell運行的結果放到一個文件中你就會發現ustdout=u結果 (Unicode存儲)
[root@ansible ~]# ansible-playbook a.yml
優先級:
-e > playbook vars > hosts文件
(不一樣系統、不一樣版本、不一樣環境用)
a.yml
- hosts: web
remote_user: root
tasks:
- name: createfile
copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt
when: a=="3"
- name: cratefile
copy: content="小弦切切如私語" dest=/tmp/a.txt
when: a=="4"
當執行的時候知足對應的when值就執行對應的任務
[root@ansible ~]# ansible-playbook --syntax-check a.yml 語法檢查 [root@ansible ~]# ansible-playbook -e "a=3" a.yml 運行文件
a.yml
- hosts: web
remote_user: root
tasks:
- name: createfile
copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt
tags: createfile
- name: cratefile
copy: content="小弦切切如私語" dest=/tmp/a.txt
[root@ansible ~]# ansible-playbook --syntax-check a.yml 語法檢查
[root@ansible ~]# ansible-playbook -t createfile a.yml 執行createfile任務
(一次性建立多個)
[root@ansible ~]# vim a.yml - hosts: web tasks: - name: crateuser user: name={{item}} with_items: - alex20 - alex21 - alex22 [root@ansible ~]# ansible-playbook --syntax-check a.yml playbook: a.yml [root@ansible ~]# ansible-playbook a.yml 運行
嵌套循環(須要多個屬性時用)
[root@ansible ~]# vim a.yml - hosts: web tasks: - name: crategroup group: name={{item}} with_items: - wulaoshi30 - wulaoshi31 - wulaoshi32 - name: createuser user: name={{item.name}} group={{item.group}} with_items: - {'name':alex40,'group':wulaoshi30} - {'name':alex41,'group':wulaoshi31} - {'name':alex42,'group':wulaoshi32} [root@ansible ~]# ansible-playbook --syntax-check a.yml playbook: a.yml [root@ansible ~]# ansible-playbook a.yml
須要notify觸發的任務,經常使用在修改配置文件重啓應用
a.yml
- 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
[root@ansible ~]# ansible-playbook --syntax-check a.yml 語法檢查 [root@ansible ~]# ansible-playbook a.yml 運行
(目錄明確、能夠互相調用)
roles文件夾 文件夾裏面是要建立的每個角色,每個角色一個文件夾 每個角色裏面都有tasks(必須的),templates,files,handlers,vars目錄 每一個目錄都要有main.yml文件,經過import_tasks來調用 其中templates文件夾中的文件能夠經過相對路徑來調用 其中files文件夾中的文件是否能夠經過相對路徑來調用
[root@ansible roles]# tree . ├── db #db組 │ └── tasks #任務目錄 │ └── createuser.yml #具體任務 └── web #web組 ├── files #不須要系統參數拷貝的文件,用copy模塊 ├── handlers #須要觸發的任務 │ └── main.yml ├── tasks #任務目錄 │ ├── copyfile.yml │ ├── install.yml │ ├── main.yml #這些任務文件最後在main.yml文件裏集合,必需要有 │ ├── p1.yml │ └── start.yml ├── templates #須要系統參數拷貝的文件,用template模塊 │ └── redis.conf.j2 └── vars #變量目錄
- name: createuser
user: name=alex50
- name: restart
service: name=redis state=restarted
- import_tasks: install.yml - import_tasks: copyfile.yml - import_tasks: start.yml - import_tasks: roles/db/tasks/createuser.yml
- name: copyfile template: src=redis.conf.j2 dest=/etc/redis.conf notify: restart tags: copyfile
- name: install
yum: name=redis
- name: start
service: name=redis state=started
在與roles目錄同層下新建調用文件web.yml
- hosts: web
remote_user: root
roles:
- web
#ansible-playbook --syntax-check web.yml #ansible-playbook web.yml
參考資料:
https://docs.ansible.com/
http://blog.51cto.com/wangfeng7399/2338621
http://blog.51cto.com/191226139/2066936