Ansible

ansible是一個能夠同時操做多臺服務器的工具 (相似工具:saltstack)python

引言:

每天說運維,到底是幹什麼的?先看看工做流程唄。通常來講,運維工程師在一家企業裏屬於個位數的崗位,甚至只有一個。面對生產中NNN臺服務器,NN我的員,工做量也是很是大的。
因此嘛,圖中的我好歹也會配置盔甲的。mysql

image

這就是我主要乾的事情(呵呵)linux

 

image

就算你會很厲害的腳本,面對成百上千,甚至上萬的主機,效率問題將會困擾你的
所以,有沒有解放的工具呢?這就是運維自動化的目的,下面咱們看下一個運維自動化工具nginx

 

 

一:Ansible的介紹

1:什麼是Ansible

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:劇本執行多個任務時,非必需可讓節點一次性運行多個任務。

2:Ansible能作什麼

ansible能夠幫助咱們完成一些批量任務,或者完成一些須要常常重複的工做。
好比:同時在100臺服務器上安裝nginx服務,並在安裝後啓動它們。
好比:將某個文件一次性拷貝到100臺服務器上。
好比:每當有新服務器加入工做環境時,你都要爲新服務器部署某個服務,也就是說你須要常常重複的完成相同的工做。
這些場景中咱們均可以使用到ansible。

  

3: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:可實現多級指揮。

 

4:Ansible架構

image

 

5:任務執行流程

 

wKiom1Rsx2uQYJZ5AAJplY08vOQ976.jpg

 

6:Ansible工做原理

image

7:Ansible主要組成部分功能說明

 

 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會好不少)
    

      

二:Ansible安裝  

請準備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配置文件

查看安裝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鏈接的公鑰文件

  

四:ansible命令格式

[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的幫助信息

 

五:命令相關模塊  

1:ping模塊 

查看模塊的幫助信息
[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中不存在的

  

2:command模塊--不支持特殊符號

查看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'

  嘗試遠程登陸是失敗的

3:shell模塊--執行被控端腳本

[root@ansible ~]# ansible web -m shell -a 'echo "123" |passwd --stdin lilz'
 

 

查看模塊幫助
[root@ansible ~]# ansible-doc -s shell
  • chdir 編譯安裝

  • 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腳本

 

4:script 模塊-運行本地端和被控端的腳本

查看模塊的參數

[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' #用來判斷被管控機上是否是存在文件,若是存在,就不執行

 

六:文件相關模塊

1:copy模塊

查看模塊幫助

[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" # 直接將文本內容注入到遠程主機的文件中

 

2:file模塊

[root@ansible ~]# ansible-doc -s file

設置文件屬性
  • state

    • 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' #用來刪除文件或者文件夾

  

3:fetch模塊

 

[root@ansible ~]# ansible-doc -s fetch

獲取遠程節點的文件

  dest 目的地址
  src 源地址

案例

ansible web -m fetch -a 'src=/var/log/cron dest=/tmp' # 下載被控節點的文件到本地,對每臺機器建立一個文件夾,並保留原來的目錄結構
  
 

七:軟件相關模塊  

1:yum模塊

[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 # 安裝包組

 

2:pip模塊  

查看模塊參數幫助信息
[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模塊

 

八:其它模塊

1:service模塊

[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

  

   

2:cron模塊

 查看模塊幫助

[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'  # 禁用計劃任務,以#表示禁用

 

3:user模塊  

[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 刪除用戶組

4:group模塊

[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' # 刪除組

5:setup模塊

[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*'

 

6:template模板.

做用:和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  運行

  

九:playbook劇本(能夠重複執行)

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

 

1:ymal語言的格式:

兩種形式:字典、列表 

至關於{host:db,vars:{user:alex},task:{}}

2:編寫ymal語言格式的任務

- 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

 

 

 

3:編寫任務---參數

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文件

 

4:條件判斷 when

(不一樣系統、不一樣版本、不一樣環境用)

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    運行文件

  

5:tags

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任務

 

6:循環 with_items

 (一次性建立多個)

[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

 

7:handlers

須要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 目錄結構 

(目錄明確、能夠互相調用)

roles文件夾

文件夾裏面是要建立的每個角色,每個角色一個文件夾
每個角色裏面都有tasks(必須的),templates,files,handlers,vars目錄
每一個目錄都要有main.yml文件,經過import_tasks來調用
其中templates文件夾中的文件能夠經過相對路徑來調用
其中files文件夾中的文件是否能夠經過相對路徑來調用

  

 1:roles目錄

[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
roles/db/tasks/createuser.yml
- name: restart
  service: name=redis state=restarted
roles/web/handlers/main.yml

 

  

- import_tasks: install.yml
- import_tasks: copyfile.yml
- import_tasks: start.yml
- import_tasks: roles/db/tasks/createuser.yml
roles/web/tasks/main.yml

 

- name: copyfile
  template: src=redis.conf.j2 dest=/etc/redis.conf
  notify: restart
  tags: copyfile
roles/web/tasks/copyfile.yml

 

- name: install
  yum: name=redis
roles/web/tasks/install.yml

 

- name: start
  service: name=redis state=started
roles/web/tasks/start.yml

 

 

2:調用roles目錄結構的任務

在與roles目錄同層下新建調用文件web.yml

- hosts: web
  remote_user: root
  roles:
  - web
web.yml

 

 

3:測試運行任務

#ansible-playbook --syntax-check web.yml
#ansible-playbook web.yml

  

 

 

 

 


 

參考資料:

Ansible中文權威指南

https://docs.ansible.com/

http://blog.51cto.com/wangfeng7399/2338621

http://blog.51cto.com/191226139/2066936

相關文章
相關標籤/搜索