欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

運(yùn)維自動化工具之Ansible-創(chuàng)新互聯(lián)

1 安裝和入門

1.1 ansible安裝
# ansible的安裝方式有多種,比如編譯安裝、git方式和pip安裝等,這里使用yum方式安裝,此種方式需要現(xiàn)有epel源
[root@ansible ~]#yum install epel-release -y
[root@ansible ~]#yum install ansible -y
1.2 確認(rèn)安裝
[root@ansible ~]#ansible --version
ansible 2.9.1
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
1.3 ansible相關(guān)文件
1.3.1 配置文件
  • /etc/ansible/ansible.cfg 主配置文件,配置ansible的工作特性
  • /etc/ansible/hosts 主機(jī)清單
  • /etc/ansible/roles/ 存放角色的目錄
1.3.2 ansible主配置文件說明
[defaults]
#inventory = /etc/ansible/hosts # 主機(jī)列表配置文件
#library = /usr/share/my_modules/ # 庫文件存放目錄
#remote_tmp = $HOME/.ansible/tmp #臨時py命令文件存放在遠(yuǎn)程主機(jī)目錄
#local_tmp = $HOME/.ansible/tmp # 本機(jī)的臨時命令執(zhí)行目錄
#forks = 5 # 默認(rèn)并發(fā)數(shù)
#sudo_user = root # 默認(rèn)sudo 用戶
#ask_sudo_pass = True #每次執(zhí)行ansible命令是否詢問ssh密碼
#ask_pass = True
#remote_port = 22
#host_key_checking = False # 檢查對應(yīng)服務(wù)器的host_key,建議取消注釋
#log_path=/var/log/ansible.log #日志文件,建議啟用
#module_name = command #默認(rèn)模塊,可以修改為shell模塊
1.3.3 inventory主機(jī)清單說明
  • ansible的主要功用在于批量主機(jī)操作,為了便捷地使用其中的部分主機(jī),可以在inventory file中將其分組命名
  • 默認(rèn)的inventory file為/etc/ansible/hosts
  • inventory file可以有多個,且也可以通過Dynamic Inventory來動態(tài)生成
1.3.4 主機(jī)清單文件格式
  • inventory文件遵循INI文件風(fēng)格,中括號中的字符為組名??梢詫⑼粋€主機(jī)同時歸并到多個不同的組中
  • 如果目標(biāo)主機(jī)使用非默認(rèn)的SSH端口,還可以在主機(jī)名稱之后使用冒號加端口號的格式來標(biāo)明
  • 如果主機(jī)名稱遵循相似的命名模式,還可以使用列表的方式標(biāo)識各主機(jī)
【范例】:
ntp.aliyun.com
[webservers]
www1.abc.com:2222
www2.abc.com

[dbservers]
db1.abc.com
db2.abc.com

[websrvs]
www[1:100].example.com

[dbsrvs]
db-[a:f].example.com

[appsrvs]
10.0.0.[1:100]
1.4 ansible相關(guān)工具
  • /usr/bin/ansible #主程序,臨時命令執(zhí)行工具
  • /usr/bin/ansible-doc #查看配置文檔,模塊功能查看工具
  • /usr/bin/ansible-galaxy #下載/上傳優(yōu)秀代碼或Roles模塊的官網(wǎng)平臺
  • /usr/bin/ansible-playbook #定制自動化任務(wù),編排劇本工具
  • /usr/bin/ansible-pull #遠(yuǎn)程執(zhí)行命令的工具
  • /usr/bin/ansible-vault #文件加密工具
  • /usr/bin/ansible-console #基于Console界面與用戶交互的執(zhí)行工具
利用ansible實(shí)現(xiàn)管理的主要方式
  • Ad-Hoc 即利用ansible命令,主要用于臨時命令使用場景
  • Ansible-playbook 主要用于長期規(guī)劃好的,大型項(xiàng)目的場景,需要有前期的規(guī)劃過程
1.4.1 ansible-doc
功能:用來顯示各模塊的幫助信息
語法:
ansible-doc [options] [module...]
-l, --list #列出可用模塊
-s, --snippet #顯示指定模塊的playbook片段
【范例】:
#列出所有模塊
ansible-doc -l
#查看指定模塊幫助用法
ansible-doc ping
#查看指定模塊幫助用法
ansible-doc -s ping
1.4.2 ansible
功能:通過ssh協(xié)議,實(shí)現(xiàn)對遠(yuǎn)程主機(jī)的配置管理、應(yīng)用部署、任務(wù)執(zhí)行等功能,建議使用前配置好key驗(yàn)證
語法:
ansible <host-pattern> [-m module_name] [-a args]
選項(xiàng)說明:
--version #顯示版本
-m module #指定模塊,默認(rèn)為command
-v #詳細(xì)過程 –vv -vvv更詳細(xì)
--list-hosts #顯示主機(jī)列表,可簡寫 --list
-k, --ask-pass #提示輸入ssh連接密碼,默認(rèn)Key驗(yàn)證
-C, --check #檢查,并不執(zhí)行
-T, --timeout=TIMEOUT #執(zhí)行命令的超時時間,默認(rèn)10s
-u, --user=REMOTE_USER #執(zhí)行遠(yuǎn)程執(zhí)行的用戶
-b, --become #代替舊版的sudo 切換
--become-user=USERNAME #指定sudo的runas用戶,默認(rèn)為root
-K, --ask-become-pass #提示輸入sudo時的口令
1.4.2.1 ansible的host-pattern
用于匹配被控制的主機(jī)的列表
All :表示所有Inventory中的所有主機(jī)
【范例】:
# all
ansible all -m ping

# *:通配符
ansible "*" -m ping
ansible 192.168.1.* -m ping

# 或關(guān)系
ansible "websrvs:appsrvs" -m ping
ansible "192.168.1.1:192.168.1.2" -m ping

# 邏輯與
#在websrvs組并且在dbsrvs組中的主機(jī)
ansible "websrvs:&dbsrvs" –m ping

#邏輯非
#在websrvs組,但不在dbsrvs組中的主機(jī)
#注意:此處為單引號
ansible 'websrvs:!dbsrvs' –m ping

#綜合邏輯
ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' –m ping

#正則表達(dá)式
ansible "websrvs:&dbsrvs" –m ping
ansible "~(web|db).*\.abc\.com" –m ping
1.4.2.2 ansible命令執(zhí)行過程
1.加載自己的配置文件 默認(rèn)/etc/ansible/ansible.cfg
2.加載自己對應(yīng)的模塊文件,如:command
3.通過ansible將模塊或命令生成對應(yīng)的臨時py文件,并將該文件傳輸至遠(yuǎn)程服務(wù)器的對應(yīng)執(zhí)行用戶$HOME/.ansible/tmp/ansible-tmp-數(shù)字/XXX.PY文件
4.給文件+x執(zhí)行
5.執(zhí)行并返回結(jié)果
6. 刪除臨時py文件,退出
1.4.2.3 ansible的執(zhí)行狀態(tài)
[root@ansible ~]#grep -A 14 '\[colors\]' /etc/ansible/ansible.cfg
[colors]
#highlight = white
#verbose = blue
#warn = bright purple
#error = red
#debug = dark gray
#deprecate = purple
#skip = cyan
#unreachable = red
#ok = green
#changed = yellow
#diff_add = green
#diff_remove = red
#diff_lines = cyan

綠色:執(zhí)行成功并且不需要做改變的操作
黃色:執(zhí)行成功并且對目標(biāo)主機(jī)做變更
紅色:執(zhí)行失敗
1.4.2.4 ansible使用范例
#以zhangsan用戶執(zhí)行ping存活檢測
ansible all -m ping -u zhangsan -k
#以zhangsan sudo至root執(zhí)行ping存活檢測
ansible all -m ping -u zhangsan -k -b
#以zhangsan sudo至lisi用戶執(zhí)行ping存活檢測
ansible all -m ping -u zhangsan -k -b --become-user=lisi
#以zhangsan sudo至root用戶執(zhí)行l(wèi)s
ansible all -m command -u zhangsan -a 'ls /root' -b --become-user=root -k -K
1.4.3 ansible-galaxy
功能:連接https://galaxy.ansible.com 下載相應(yīng)的roles
【范例】:
#列出所有已安裝的galaxy
ansible-galaxy list
#安裝galaxy
ansible-galaxy install geerlingguy.redis
#刪除galaxy
ansible-galaxy remove geerlingguy.redis
1.4.4 ansible-pull
功能:推送ansible的命令至遠(yuǎn)程,效率無限提升,對運(yùn)維要求較高
1.4.5 ansible-playbook
功能:具用于執(zhí)行編寫好的playbook任務(wù)
【范例】:
ansible-playbook hello.yml
cat hello.yml
---
# hello world yml file
- hosts: websrvs
  remote_user: root

  tasks:
    - name: hello world
      command: /usr/bin/wall hello world
1.4.6 ansible-vault
功能:用于加解密yml文件
語法:
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
【范例】:
ansible-vault encrypt hello.yml #加密
ansible-vault decrypt hello.yml #解密
ansible-vault view hello.yml #查看
ansible-vault edit hello.yml #編輯加密文件
ansible-vault rekey hello.yml #修改口令
ansible-vault create new.yml #創(chuàng)建新文件
1.4.7 ansible-console
功能:
可交互執(zhí)行命令,支持tab補(bǔ)全,ansible 2.0+新增
提示符格式:
執(zhí)行用戶@當(dāng)前操作的主機(jī)組 (當(dāng)前組的主機(jī)數(shù)量)[f:并發(fā)數(shù)]$
常用子命令:
設(shè)置并發(fā)數(shù): forks n 例如: forks 10
切換組: cd 主機(jī)組 例如: cd web
列出當(dāng)前組主機(jī)列表: list
列出所有的內(nèi)置命令: ?或help
【范例】:
[root@ansible ansible]#ansible-console
Welcome to the ansible console.
Type help or ? to list commands.

root@all (3)[f:5]$ list
192.168.7.71
192.168.7.72
192.168.7.73
root@all (3)[f:5]$ cd websrvs
root@websrvs (3)[f:5]$ list
192.168.7.71
192.168.7.72
192.168.7.73
root@websrvs (3)[f:5]$ yum name=httpd state=present
1.5 ansible常用模塊
參考資料:https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
1.5.1 command模塊
功能:在被控機(jī)執(zhí)行命令,ansible的默認(rèn)模塊,可忽略-m選項(xiàng)
注意:此模塊的命令不支持$VARNAME < > | ; &等,需要用shell模塊實(shí)現(xiàn)
【范例】:
[root@ansible ~]#ansible websrvs -m command -a 'echo 123.com | passwd --stdin zhangsan'
[root@ansible ~]#ansible websrvs -a 'wall echo hello'
1.5.2 shell模塊
功能:近似command,用shell執(zhí)行命令
【范例】:
[root@ansible ~]#ansible websrvs -m shell -a 'echo 123.com | passwd --stdin zhangsan'
1.5.3 script模塊
功能:在被控機(jī)上運(yùn)行ansible服務(wù)器上的腳本
【范例】:
[root@ansible ~]#ansible websrvs -m script -a '/data/test.sh'
1.5.4 copy模塊
功能:從ansible服務(wù)器復(fù)制文件到被控機(jī)
【范例】:
#如目標(biāo)存在,默認(rèn)覆蓋,此處指定先備份
[root@ansible ~]#ansible websrvs -m copy -a " src=/data/test.sh dest=/tmp/test2.sh owner=zhangsan mode=600 backup=yes" 

#指定內(nèi)容,直接生成目標(biāo)文件
[root@ansible ~]#ansible websrvs -m copy -a "content='test content\n' dest=/tmp/test.txt"

#復(fù)制/etc/下的文件,不包括/etc/目錄自身
ansible srv -m copy -a " src=/etc/ dest=/backup"
# 注:如果目標(biāo)目錄不存在會自動創(chuàng)建
1.5.5 fetch模塊
功能:從被控機(jī)提取文件至ansible主控端,copy相反,目前不支持目錄
【范例】:
[root@ansible ~]#ansible websrvs -m fetch -a 'src=/tmp/test.txt dest=/data'
1.5.6 file模塊
功能:管理文件和文件屬性
【范例】:
# 創(chuàng)建空文件
[root@ansible ~]#ansible websrvs -m file -a 'path=/data/test.sh state=touch owner=hechunping mode=755'

# 創(chuàng)建目錄
[root@ansible ~]#ansible websrvs -m file -a 'path=/data/dir1 state=directory owner=hechunping group=hechunping'

# 創(chuàng)建軟連接
[root@ansible ~]#ansible websrvs -m file -a 'src=/data/test.sh dest=/data/test.sh-link state=link'
1.5.7 unarchive模塊
功能:解包解壓縮
實(shí)現(xiàn)有兩種用法:
1.將ansible主機(jī)上的壓縮包傳到遠(yuǎn)程主機(jī)后解壓縮至特定目錄,設(shè)置copy=yes
2.將遠(yuǎn)程主機(jī)上的某個壓縮包解壓縮到指定路徑下,設(shè)置copy=no
常見參數(shù):
  • copy:默認(rèn)為yes,當(dāng)copy=yes,拷貝的文件是從ansible主機(jī)復(fù)制到遠(yuǎn)程主機(jī)上,如果設(shè)置為copy=no,會在遠(yuǎn)程主機(jī)上尋找src源文件
  • remote_src:和copy功能一樣且互斥,yes表示在遠(yuǎn)程主機(jī),不在ansible主機(jī),no表示文件在ansible主機(jī)上
  • src:源路徑,可以是ansible主機(jī)上的路徑,也可以是遠(yuǎn)程主機(jī)上的路徑,如果是遠(yuǎn)程主機(jī)上的路徑,則需要設(shè)置copy=no
  • dest:遠(yuǎn)程主機(jī)上的目標(biāo)路徑
  • mode:設(shè)置解壓縮后的文件權(quán)限
【范例】:
# 將ansible服務(wù)器上的壓縮文件解壓縮到被控機(jī)上
[root@ansible ~]#ansible websrvs -m unarchive -a 'src=/data/test.sh.tar.gz dest=/usr/local'

# 解壓被控機(jī)上的壓縮文件到它本地
[root@ansible ~]#ansible 192.168.7.72 -m unarchive -a 'src=/data/test.sh.tar.gz dest=/usr/local copy=no mode=0777'

# 解壓網(wǎng)絡(luò)壓縮文件到被控機(jī)
[root@ansible ~]#ansible websrvs -m unarchive -a 'src=https://nginx.org/download/nginx-1.14.2.tar.gz dest=/usr/local copy=no'
1.5.8 archive模塊
功能:打包壓縮
【范例】:
[root@ansible ~]#ansible websrvs -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=hechunping mode=0600'
1.5.9 hostname模塊
功能:管理主機(jī)名
【范例】:
[root@ansible ~]#ansible 192.168.7.71 -m hostname -a 'name=web'
1.5.10 cron模塊
功能:計(jì)劃任務(wù)
支持時間:minute,hour,day,month,weekday
【范例】:
# 創(chuàng)建任務(wù),周一至周五每天2:30執(zhí)行mysql_backup.sh腳本
ansible dbsrvs -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup
mysql" job=/root/mysql_backup.sh'

# 禁用計(jì)劃任務(wù)
ansible dbsrvs -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup
mysql" job=/root/mysql_backup.sh disabled=yes'

# 啟用計(jì)劃任務(wù)
ansible dbsrvs -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup
mysql" job=/root/mysql_backup.sh disabled=no'

# 刪除任務(wù)
ansible dbsrvs -m cron -a "name='backup mysql' state=absent"
1.5.11 yum模塊
功能:管理軟件包
【范例】:
# 安裝
[root@ansible ~]#ansible websrvs -m yum -a 'name=redis state=present'
# 刪除
[root@ansible ~]#ansible websrvs -m yum -a 'name=redis state=absent'
1.5.12 service模塊
功能:管理服務(wù)
【范例】:
# 啟動,并設(shè)置開機(jī)啟動
[root@ansible ~]#ansible websrvs -m service -a 'name=redis state=started enabled=yes'

# 停止
[root@ansible ~]#ansible websrvs -m service -a 'name=redis state=stopped'

# 重啟
[root@ansible ~]#ansible websrvs -m service -a 'name=redis state=restarted'
1.5.13 user模塊
功能:管理用戶
【范例】:
# 創(chuàng)建
[root@ansible ~]#ansible websrvs -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'
# 刪除用戶及其及目錄等數(shù)據(jù)
[root@ansible ~]#ansible websrvs -m user -a 'name=user1 state=absent remove=yes'
1.5.14 group模塊
功能:管理組
【范例】:
# 創(chuàng)建
[root@ansible ~]#ansible websrvs -m group -a 'name=nginx gid=88 system=yes'
# 刪除
[root@ansible ~]#ansible websrvs -m group -a 'name=nginx state=absent'
1.5.15 setup模塊
功能:返回系統(tǒng)狀態(tài)信息
【范例】:
ansible websrvs -m setup
ansible websrvs -m setup -a "filter=ansible_nodename"
ansible websrvs -m setup -a "filter=ansible_hostname"
ansible websrvs -m setup -a "filter=ansible_domain"
ansible websrvs -m setup -a "filter=ansible_memtotal_mb"
ansible websrvs -m setup -a "filter=ansible_memory_mb"
ansible websrvs -m setup -a "filter=ansible_memfree_mb"
ansible websrvs -m setup -a "filter=ansible_os_family"
ansible websrvs -m setup -a "filter=ansible_distribution_major_version"
ansible websrvs -m setup -a "filter=ansible_distribution_version"
ansible websrvs -m setup -a "filter=ansible_processor_vcpus"
ansible websrvs -m setup -a "filter=ansible_all_ipv4_addresses"
ansible websrvs -m setup -a "filter=ansible_architecture"

2 Playbook

2.1 Playbook介紹
1.playbook 劇本是由一個或多個“play”組成的列表
2.play的主要功能在于將預(yù)定義的一組主機(jī),裝扮成事先通過ansible中的task定義好的角色。Task實(shí)際是調(diào)用ansible的一個module,將多個play組織在一個playbook中,即可以讓它們聯(lián)合起來,按事先編排的機(jī)制執(zhí)行預(yù)定義的動作
3.Playbook文件是采用YAML語言編寫的
2.2 Playbook核心元素
  • Hosts 執(zhí)行的遠(yuǎn)程主機(jī)列表
  • Tasks 任務(wù)集
  • Variables 內(nèi)置變量或自定義變量在playbook中調(diào)用
  • Templates 模板,可替換模板文件中的變量并實(shí)現(xiàn)一些簡單邏輯的文件
  • Handlers 和 notify 結(jié)合使用,由特定條件觸發(fā)的操作,滿足條件方才執(zhí)行,否則不執(zhí)行
  • tags 標(biāo)簽 指定某條任務(wù)執(zhí)行,用于選擇運(yùn)行playbook中的部分代碼。ansible具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼為測試其確實(shí)沒有發(fā)生變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷
2.2.1 hosts組件
功能:playbook中的每一個play的目的都是為了讓特定主機(jī)以某個指定的用戶身份執(zhí)行任務(wù)。hosts用于指定要執(zhí)行指定任務(wù)的主機(jī),須事先定義在主機(jī)清單中
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
Websrvs:dbsrvs #或者,兩個組的并集
Websrvs:&dbsrvs #與,兩個組的交集
websrvs:!dbsrvs #在websrvs組,但不在dbsrvs組
【范例】:
- hosts: websrvs:dbsrvs
2.2.2 remote_user組件
功能:可用于host和task中。也可以指定其通過sudo的方式在遠(yuǎn)程主機(jī)上執(zhí)行任務(wù),其可用于play全局或某任務(wù);此外,甚至可以在sudo時使用sudo_user指定sudo時切換的用戶
- hosts: websrvs
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: zhangsan
      sudo: yes #默認(rèn)sudo為root
      sudo_user: lisi #sudo為lisi
2.2.3 task列表和action組件
1.play的主體部分是task list,task list中有一個或多個task,各個task按次序逐個在hosts中指定的所有主機(jī)上執(zhí)行,即在所有主機(jī)上完成第一個task后,再開始第二個task
2.task的目的是使用指定的參數(shù)執(zhí)行模塊,而在模塊參數(shù)中可以使用變量。模塊執(zhí)行是冪等的,這意味著多次執(zhí)行是安全的,因?yàn)槠浣Y(jié)果均一致
3.每個task都應(yīng)該有其name,用于playbook的執(zhí)行結(jié)果輸出,建議其內(nèi)容能清晰地描述任務(wù)執(zhí)行步驟。如果未提供name,則action的結(jié)果將用于輸出
task兩種格式:
1)action:module arguments
2)module:arguments  (推薦使用)
注:shell和command模塊后面跟命令,而非key=value
【范例】:
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: install httpd
      yum: name=httpd
    - name: start httpd
      service: name=httpd state=started enabled=yes
2.2.4 其它組件
某任務(wù)的狀態(tài)在運(yùn)行后為changed時,可通過"notify"通知給相應(yīng)的handlers
任務(wù)可以通過"tags"打標(biāo)簽,可在ansible-playbook命令上使用-t指定進(jìn)行調(diào)用
2.2.5 shell scripts VS playbook案例
### 安裝Apache ###
#SHELL腳本實(shí)現(xiàn)
#!/bin/bash
yum install --quiet -y httpd
# 復(fù)制配置文件
cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
cp/tmp/vhosts.conf /etc/httpd/conf.d/
# 啟動Apache,并設(shè)置開機(jī)啟動
systemctl enable --now httpd

#Playbook實(shí)現(xiàn)
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: "安裝Apache"
      yum: name=httpd
    - name: "復(fù)制配置文件"
      copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/
    - name: "復(fù)制配置文件"
      copy: src=/tmp/vhosts.conf dest=/etc/httpd/conf.d/
    - name: "啟動Apache,并設(shè)置開機(jī)啟動"
      service: name=httpd state=started enabled=yes
2.3 Playbook命令
語法:
ansible-playbook <filename.yml> ... [options]
常用選項(xiàng)
--check -C #只檢測可能會發(fā)生的改變,但不真正執(zhí)行操作
--list-hosts #列出運(yùn)行任務(wù)的主機(jī)
--list-tags #列出tag
--list-tasks #列出task
--limit 主機(jī)列表 #只針對主機(jī)列表中的主機(jī)執(zhí)行
-v -vv -vvv #顯示過程
【范例】:
ansible-playbook file.yml --check #只檢測
ansible-playbook file.yml
ansible-playbook file.yml --limit websrvs
2.4 Playbook初步
【范例】:yum安裝httpd
#install_httpd.yml
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: "安裝httpd"
      yum: name=httpd state=present
    - name: "復(fù)制httpd.conf配置文件"
      copy: src=files/httpd.conf dest=/etc/httpd/conf
    - name: "啟動httpd,并設(shè)置開機(jī)啟動"
      service: name=httpd state=started enabled=yes
【范例】:卸載yum安裝的httpd
#remove_httpd.yml
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: remove httpd package
      yum: name=httpd state=absent                     
    - name: remove apache user
      user: name=apache state=absent
    - name: remove data file
      file: name=/etc/httpd state=absent
【范例】:創(chuàng)建MySQL組和用戶
---
# 創(chuàng)建MySQL組和用戶
- hosts: dbsrvs
  remote_user: root

  tasks:
  - {name: 創(chuàng)建組, group: name=mysql system=yes gid=306}   
  - name: 創(chuàng)建用戶
    user: name=mysql shell=/sbin/nologin system=yes group=mysql uid=306 create_home=no
【范例】:安裝mysql-5.6.46-linux-glibc2.12
[root@ansible ~]#ll /data/ansible/files/mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz 
-rw-r--r-- 1 root root 403177622 Dec  4 13:05 /data/ansible/files/mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
[root@ansible ~]#cat /data/ansible/files/my.cnf 
[mysqld]
socket=/tmp/mysql.sock
user=mysql
symbolic-links=0
datadir=/data/mysql
innodb_file_per_table=1
log-bin

[client]
port=3306
socket=/tmp/mysql.sock

[mysqld_safe]
log-error=/var/log/mysqld.log
[root@ansible ~]#cat /data/ansible/install_mysql.yml 
---
# install mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
- hosts: websrvs
  remote_user: root

  tasks:
    - name: "安裝依賴包"
      yum: name=libaio,perl-Data-Dumper,perl-Getopt-Long
    - name: "創(chuàng)建mysql組"
      group: name=mysql gid=306
    - name: "創(chuàng)建mysql用戶"
      user: name=mysql uid=306 group=mysql shell=/sbin/nologin system=yes create_home=no home=/data/mysql
    - name: "將本地二進(jìn)制安裝包解壓縮到目標(biāo)主機(jī)的/usr/local目錄下,并修改屬主、屬組為root"
      unarchive: src=/data/ansible/files/mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz dest=/usr/local owner=root group=root
    - name: "為解壓縮的二進(jìn)制包目錄創(chuàng)建軟連接"
      file: src=/usr/local/mysql-5.6.46-linux-glibc2.12-x86_64 dest=/usr/local/mysql state=link
    - name: "初始化數(shù)據(jù)庫"
      shell: chdir=/usr/local/mysql ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
      tags: data
    - name: "復(fù)制本地my.cnf配置文件到被控主機(jī)"
      copy: src=/data/ansible/files/my.cnf dest=/etc/my.cnf
    - name: "復(fù)制本地的mysql服務(wù)腳本到被控主機(jī)的/etc/init.d目錄下"
      shell: /bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
    - name: "啟動mysql服務(wù),并且設(shè)置開機(jī)啟動"
      shell: /etc/init.d/mysqld start;chkconfig --add mysqld;chkconfig mysqld on
      tags: service
    - name: "將mysql的二進(jìn)制可執(zhí)行程序添加到PATH變量"
      copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
    - name: "執(zhí)行安全加固腳本"
      script: /data/ansible/files/secure_mysql.sh
      tags: script
2.5 Playbook中使用handlers和notify
Handlers本質(zhì)是task list ,其中的task與前述的task并沒有本質(zhì)上的不同,用于當(dāng)關(guān)注的資源發(fā)生變化時,才會采取一定的操作.Notify對應(yīng)的action可用于在每個play的最后被觸發(fā),這樣可避免多次有改變發(fā)生時每次都執(zhí)行指定的操作,僅在所有的變化發(fā)生完成后一次性地執(zhí)行指定操作。在notify中列出的操作稱為handler,也即notify中調(diào)用handler中定義的操作
【范例】:
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: "安裝httpd"
      yum: name=httpd state=present
    - name: "復(fù)制httpd.conf配置文件,并且重啟httpd"
      copy: src=files/httpd.conf dest=/etc/httpd/conf
      notify: restart httpd
    - name: "啟動httpd,并設(shè)置開機(jī)啟動"
      service: name=httpd state=started enabled=yes
  handlers:
    - name: restart httpd
      service: name=httpd state=restarted
2.6 Playbook中使用tags組件
功能:在playbook文件中,可以利用tags組件,為特定task指定標(biāo)簽,當(dāng)在執(zhí)行playbook時,可以只執(zhí)行特定tags的task,而非整個playbook文件
【范例】:
[root@ansible ansible]#cat install_httpd.yml
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: "安裝httpd"
      yum: name=httpd state=present
    - name: "復(fù)制httpd.conf配置文件,并且重啟httpd"
      copy: src=files/httpd.conf dest=/etc/httpd/conf
      tags: conf                      
    - name: "啟動httpd,并設(shè)置開機(jī)啟動"
      service: name=httpd state=started enabled=yes
      tags: service

[root@ansible ansible]#ansible-playbook -t conf,service install_httpd.yml
2.7 Playbook中使用變量
變量名:僅能由字母、數(shù)字和下劃線組成,且只能以字母開頭
變量定義:
key=value
【范例】:
http_port=80
變量調(diào)用方式:
通過{{ variable_name }} 調(diào)用變量,且變量名前后建議加空格,有時用"{{ variable_name }}"才生效
變量來源
1)ansible的setup facts遠(yuǎn)程主機(jī)的所有變量都可以直接調(diào)用
2)通過命令行指定變量,優(yōu)先級高
ansible-playbook -e varname=value
3)在playbook文件中定義
vars:
  - var1: value1
  - var2: value2
4)在獨(dú)立的變量yml文件中定義
- hosts: all
  vars_files:
    - vars.yml
5)在/etc/ansible/hosts文件中定義
主機(jī)(普通)變量:主機(jī)組中主機(jī)單獨(dú)定義,優(yōu)先級高于公共變量
組(公共)變量:針對主機(jī)組中所有主機(jī)定義同一變量
6)在role中定義
2.7.1 使用setup模塊中變量
【范例】:
[root@ansible ansible]#cat var.yml 
---
# var.yml
- hosts: websrvs
  remote_user: root

  tasks:
    - name: "創(chuàng)建日志文件"
      file: name=/var/log/{{ ansible_fqdn }} state=touch

[root@ansible ansible]#ansible-playbook var.yml
2.7.2 在playbook命令行中定義變量
【范例】:
[root@ansible ansible]#cat var.yml
---
# var.yml
- hosts: websrvs
  remote_user: root

  tasks:
    - name: "安裝包變量"
      yum: name={{ pkname }} state=absent

[root@ansible ansible]#ansible-playbook -e pkname=httpd var.yml
2.7.3 在playbook文件中定義變量
【范例】:
[root@ansible ansible]#cat var.yml
---
- hosts: websrvs
  remote_user: root
  vars:
    - username: user1
    - groupname: group1

  tasks:
    - name: create group
      group: name={{ groupname }} state=present
    - name: create user
      user: name={{ username }} state=present

[root@ansible ansible]#ansible-playbook var.yml
2.7.4 使用變量文件
可以在一個獨(dú)立的playbook文件中定義變量,在另一個playbook文件中引用變量文件中的變量,比playbook中定義的變量優(yōu)化級高
【范例】:
[root@ansible ansible]#cat vars.yml  
---
# variables file
var1: vsftpd
var2: nginx

[root@ansible ansible]#cat var2.yml 
---
- hosts: websrvs
  remote_user: root
  vars_files: vars.yml

  tasks:
    - name: "vsftpd日志文件"
      file: name=/data/{{ var1 }}.log state=touch
    - name: "nginx日志文件"
      file: name=/data/{{ var2 }}.log state=touch
2.7.5 主機(jī)清單文件中定義變量
2.7.5.1 主機(jī)變量
在inventory主機(jī)清單文件中為指定的主機(jī)定義變量以便于在playbook中使用
【范例】:
[websrvs]
www1.abc.com http_port=80
www2.abc.com http_port=8080
2.7.5.2 組(公共)變量:
在inventory主機(jī)清單文件中賦予給指定組內(nèi)所有主機(jī)在playbook中可用的變量
【范例】:
[websrvs]
www1.abc.com
www2.abc.com

[websrvs:vars]
ntp_server=ntp.aliyun.com
【范例】:
[root@ansible ansible]#vim /etc/ansible/hosts
[websrvs]
192.168.7.71 hname=ansible
192.168.7.72 hname=web1
192.168.7.73 hname=web2

[websrvs:vars]
http_port=808
mark="-"

[root@ansible ansible]#ansible websrvs –m hostname –a 'name={{ hname }}{{ mark }}{{ http_port }}'
# 命令行指定變量
[root@ansible ansible]#ansible websrvs -e http_port=8000 –m hostname –a 'name={{ hname }}{{ mark }}{{ http_port }}'
2.8 Template模板
模板是一個文本文件,可以作為生成文件的模板,并且模板文件中還可以嵌套jinja語法
2.8.1 jinja語言
jinja2語言使用字面量,有下面形式:
字符串:使用單引號或雙引號
數(shù)字:整數(shù),浮點(diǎn)數(shù)
列表:[item1,item2,...]
元組:(item1,item2,...)
字典:{key1:value1,key2:value2,...}
布爾型:true/false
算術(shù)運(yùn)算:+, -, *, /, //, %, **
比較操作:==, !=, >, >=, <, <=
邏輯運(yùn)算:and,or,not
流表達(dá)式:For,If,When

jinja2相關(guān)說明:
字面量:
表達(dá)式最簡單的形式就是字面量。字面量表示諸如字符串和數(shù)值的 Python 對象。如“Hello World”
雙引號或單引號中間的一切都是字符串。無論何時你需要在模板中使用一個字符串(比如函數(shù)調(diào)用、過濾器或只是包含或繼承一個模板的參數(shù)),如42,42.23
數(shù)值可以為整數(shù)和浮點(diǎn)數(shù)。如果有小數(shù)點(diǎn),則為浮點(diǎn)數(shù),否則為整數(shù)。在 Python 里, 42 和 42.0 是不一樣的

算術(shù)運(yùn)算:
Jinja 允許用計(jì)算值。支持下面的運(yùn)算符
+:把兩個對象加到一起。通常對象是素質(zhì),但是如果兩者是字符串或列表,你可以用這 種方式來銜接它們。無論如何這不是選的連接字符串的方式!連接字符串見 ~ 運(yùn)算符。 {{ 1 + 1 }} 等于 2
-:用第一個數(shù)減去第二個數(shù)。 {{ 3 - 2 }} 等于 1
/:對兩個數(shù)做除法。返回值會是一個浮點(diǎn)數(shù)。 {{ 1 / 2 }} 等于 {{ 0.5 }}
//:對兩個數(shù)做除法,返回整數(shù)商。 {{ 20 // 7 }} 等于 2
%:計(jì)算整數(shù)除法的余數(shù)。 {{ 11 % 7 }} 等于 4
*:用右邊的數(shù)乘左邊的操作數(shù)。 {{ 2 * 2 }} 會返回 4 。也可以用于重 復(fù)一個字符串多次。 {{ ‘=’ * 80 }}
會打印 80 個等號的橫條\
**:取左操作數(shù)的右操作數(shù)次冪。 {{ 2**3 }} 會返回 8

比較操作符
== 比較兩個對象是否相等
!= 比較兩個對象是否不等
> 如果左邊大于右邊,返回 true
>= 如果左邊大于等于右邊,返回 true
< 如果左邊小于右邊,返回 true
<= 如果左邊小于等于右邊,返回 true

邏輯運(yùn)算符
對于 if 語句,在 for 過濾或 if 表達(dá)式中,它可以用于聯(lián)合多個表達(dá)式
and 如果左操作數(shù)和右操作數(shù)同為真,返回 true
or 如果左操作數(shù)和右操作數(shù)有一個為真,返回 true
not 對一個表達(dá)式取反
(expr)表達(dá)式組
true / false true 永遠(yuǎn)是 true ,而 false 始終是 false
2.8.2 template
template功能:可以根據(jù)和參考模塊文件,動態(tài)生成相類似的配置文件
template文件必須存放于templates目錄下,且命名為 .j2 結(jié)尾
yaml/yml 文件需和templates目錄平級,目錄結(jié)構(gòu)如下:
./
├── temnginx.yml
└── templates
    └── nginx.conf.j2
【范例】:利用template同步nginx配置文件
# 準(zhǔn)備templates/nginx.conf.j2文件
[root@ansible ansible]#cat temnginx.yml
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: "利用template模板文件配置被控主機(jī)"
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

[root@ansible ansible]#ansible-playbook temnginx.yml
【范例】:template變更替換
#修改templates/nginx.conf.j2文件
[root@ansible ansible]#vim templates/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }};

[root@ansible ansible]#cat temnginx.yml
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: "利用template模板文件配置被控主機(jī)"
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

[root@ansible ansible]#ansible-playbook temnginx.yml
【范例】:template算術(shù)運(yùn)算
[root@ansible ansible]#vim templates/nginx.conf.j2
worker_processes {{ ansible_processor_vcpus * 2}};
worker_processes {{ ansible_processor_vcpus + 2}};
【范例】:template中使用流程控制for和if
for循環(huán)
【例1】:
[root@ansible ansible]#cat temnginx1.yml 
---
- hosts: websrvs
  remote_user: root
  vars:
    nginx_vhosts:
      - listen: 8081
        server_name: www.hechunping.tech
  tasks:
    - name: "template模板文件配置被控主機(jī)"
      template: src=nginx.conf1.j2 dest=/data/nginx.conf

[root@ansible ansible]#cat templates/nginx.conf1.j2 
{% for vhost in nginx_vhosts %}
server {
  listen {{ vhost.listen }};
  server_name {{ vhost.server_name }};
}
{% endfor %}

# 生成結(jié)果
[root@ansible ansible]#ansible-playbook temnginx1.yml 
[root@ansible ansible]#cat /data/nginx.conf 
server {
  listen 8081;
  server_name www.hechunping.tech;
}
【例2】:
[root@ansible ansible]#cat temnginx3.yml 
---
- hosts: websrvs
  remote_user: root
  vars:
    nginx_vhosts:
      - listen: 8081
        server_name: "web1.hechunping.tech"
        root: "/var/www/nginx/web1"
      - listen: 8082
        server_name: "web2.hechunping.tech"
        root: "/var/www/nginx/web2"
      - listen: 8083
        server_name: "web3.hechunping.tech"
        root: "/var/www/nginx/web3"
  tasks:
    - name: "template模板文件配置被控主機(jī)"
      template: src=nginx.conf3.j2 dest=/data/nginx2.conf

[root@ansible ansible]#cat templates/nginx.conf3.j2 
{% for vhost in nginx_vhosts %}
server {
  listen {{ vhost.listen }};
  server_name {{ vhost.server_name }};
  root {{ vhost.root }};
}
{% endfor %}

# 生成結(jié)果
[root@ansible ansible]#ansible-playbook temnginx3.yml
[root@ansible ansible]#cat /data/nginx2.conf 
server {
  listen 8081;
  server_name web1.hechunping.tech;
  root /var/www/nginx/web1;
}
server {
  listen 8082;
  server_name web2.hechunping.tech;
  root /var/www/nginx/web2;
}
server {
  listen 8083;
  server_name web3.hechunping.tech;
  root /var/www/nginx/web3;
}
if判斷
【例1】:
[root@ansible ansible]#cat temnginx4.yml 
---
- hosts: websrvs
  remote_user: root
  vars:
    nginx_vhosts:
      - web1:
        listen: 8080
        root: "/var/www/nginx/web1"
      - web2:
        listen: 8080
        server_name: "web2.hechunping.tech"
        root: "/var/www/nginx/web2"
  tasks:
    - name: "template模板文件配置被控主機(jī)"
      template: src=nginx.conf2.j2 dest=/data/nginx3.conf

[root@ansible ansible]#cat templates/nginx.conf2.j2 
{% for vhost in nginx_vhosts %}
server{
  listen {{ vhost.listen }};
  {% if vhost.server_name is defined %}
server_name {{ vhost.server_name }};
  {% endif %}
root {{ vhost.root }}
}
{% endfor %}

#生成結(jié)果
[root@ansible ansible]#ansible-playbook temnginx4.yml
[root@ansible ansible]#cat /data/nginx3.conf 
server{
  listen 8080;
  root /var/www/nginx/web1
}
server{
  listen 8080;
  server_name web2.hechunping.tech;
  root /var/www/nginx/web2
}
2.9 Playbook使用when
功能:when語句,可以實(shí)現(xiàn)條件測試。如果需要根據(jù)變量、facts或此前任務(wù)的執(zhí)行結(jié)果來做為某task執(zhí)行與否的前提時要用到條件測試,通過在task后添加when子句即可使用條件測試
【范例】:
[root@ansible ansible]#cat when.yml 
---
- hosts: websrvs
  remote_user: root
  tasks:
    - name: "打印hello redhat"
      command: /usr/bin/wall hello redhat
      when: ansible_os_family == "RedHat"
2.10 Playbook使用迭代with_items
迭代:當(dāng)有需要重復(fù)性執(zhí)行的任務(wù)時,可以使用迭代機(jī)制
對迭代項(xiàng)的引用,固定變量名為"item"
要在task中使用with_items給定要迭代的元素列表
列表元素格式:
  • 字符串
  • 字典
【范例】:
---
- hosts: 192.168.7.71
  remote_user: root

  tasks:
    - name: "備份文件"
      copy: src=/data/{{ item }} dest=/backup/{{ item }}
      with_items:
        - nginx.conf
        - nginx2.conf

#上面語句的功能等同于下面的語句
- name: "備份/data/nginx.conf文件到/backup目錄"
  copy: src=/data/nginx.conf dest=/backup
- name: "備份/data/nginx2.conf文件到/backup目錄"
  copy: src=/data/nginx2.conf dest=/backup
迭代嵌套子變量:在迭代中,還可以嵌套子變量,關(guān)聯(lián)多個變量在一起使用
【范例】:
---
- hosts: websrvs
  remote_user: root

  tasks:
    - name: "創(chuàng)建組"
      group: name={{ item }} state=present
      with_items:
        - a1
        - a2
        - a3
    - name: "創(chuàng)建用戶"
      user: name={{ item.name }} group={{ item.group }} state=present
      with_items:
        - { name: 'a1',group: 'a1' }
        - { name: 'a2',group: 'a2' }
        - { name: 'a3',group: 'a3' }

3 roles角色

角色是ansible自1.2版本引入的新特性,用于層次性、結(jié)構(gòu)化地組織playbook。roles能夠根據(jù)層次型結(jié)構(gòu)自動裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單來講,roles就是通過分別將變量、文件、任務(wù)、模板及處理器放置于單獨(dú)的目錄中,并可以便捷地include它們的一種機(jī)制。角色一般用于基于主機(jī)構(gòu)建服務(wù)的場景中,但也可以是用于構(gòu)建守護(hù)進(jìn)程等場景中
roles:多個角色的集合,可以在roles目錄下為每個role建立單獨(dú)的子目錄
roles
├── httpd
├── mysql
├── nginx
└── redis
3.1 Ansible Roles目錄編排
roles目錄結(jié)構(gòu)如下所示

運(yùn)維自動化工具之Ansible

明水ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
每個角色,以特定的層級目錄結(jié)構(gòu)進(jìn)行組織
roles目錄結(jié)構(gòu)
playbook.yml
roles/
   project/
     tasks/
     handlers/
     files/
     templates/
     vars/
     defaults/
     meta/
注:playbook文件需要和roles目錄同級
roles各目錄作用
/roles/project/ :項(xiàng)目名稱,有以下子目錄
files/ :存放由copy或script模塊等調(diào)用的文件
templates/:template模塊查找所需要模板文件的目錄
tasks/:定義task,role的基本元素,至少應(yīng)該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進(jìn)行包含
handlers/:至少應(yīng)該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進(jìn)行包含
vars/:定義變量,至少應(yīng)該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進(jìn)行包含
meta/:定義當(dāng)前角色的特殊設(shè)定及其依賴關(guān)系,至少應(yīng)該包含一個名為main.yml的文件,其它文件需在此文件中通過include進(jìn)行包含
default/:設(shè)定默認(rèn)變量時使用此目錄中的main.yml文件
3.2 創(chuàng)建role
創(chuàng)建role的步驟
(1) 創(chuàng)建以roles命名的目錄
(2) 在roles目錄中分別創(chuàng)建以各角色名稱命名的目錄,如webservers等
(3) 在每個角色命名的目錄中分別創(chuàng)建files、handlers、meta、tasks、templates和vars目錄;用不到的目錄可以創(chuàng)建為空目錄,也可以不創(chuàng)建
(4) 在playbook文件中,調(diào)用各角色
【范例】:roles的目錄結(jié)構(gòu)
role_httpd.yml
roles/
├── httpd
│?? ├── files
│?? │?? ├── httpd.conf
│?? │?? └── index.html
│?? ├── handlers
│?? │?? └── main.yml
│?? └── tasks
│??     ├── config.yml
│??     ├── index.yml
│??     ├── install.yml
│??     ├── main.yml
│??     └── service.yml
3.3 playbook調(diào)用角色
調(diào)用角色方法1:
---
- hosts: websrvs
  remote_user: root
  roles:
    - mysql
    - memcached
    - nginx
調(diào)用角色方法2:
鍵role用于指定角色名稱,后續(xù)的k/v用于傳遞變量給角色
---
- hosts: all
  remote_user: root
  roles:
    - mysql
    - { role: nginx, username: nginx }
調(diào)用角色方法3:
還可以基于條件測試實(shí)現(xiàn)角色調(diào)用
---
- hosts: all
  remote_user: root
  roles:
    - { role: nginx, username: nginx, when: ansible_distribution_major_version == '7' }
3.4 roles中tags使用
#nginx-role.yml
---
- hosts: websrvs
  remote_user: root
  roles:
    - { role: nginx ,tags: [ 'nginx','web' ], when: ansible_distribution_major_version == "6" }
    - { role: httpd ,tags: [ 'httpd','web' ] }
    - { role: mysql ,tags: [ 'mysql','db' ] }
    - { role: mariadb ,tags: [ 'mariadb','db' ] }

[root@ansible ansible]#ansible-playbook --tags="nginx,httpd,mysql" nginx-role.yml
3.5 實(shí)戰(zhàn)案例
3.5.1 案例1:實(shí)現(xiàn)httpd角色
[root@ansible ansible]#pwd
/data/ansible
[root@ansible ansible]#ls roles/httpd/
files  handlers  tasks

# 創(chuàng)建角色
[root@ansible ansible]#cd roles/httpd/
[root@ansible httpd]#cat tasks/main.yml 
- include: install.yml
- include: config.yml
- include: index.yml
- include: service.yml

[root@ansible httpd]#cat tasks/install.yml 
- name : install httpd package
  yum:
    name: httpd

[root@ansible httpd]#cat tasks/config.yml 
- name: config file
  copy: 
    src: httpd.conf
    dest: /etc/httpd/conf
    backup: yes

[root@ansible httpd]#cat tasks/index.yml 
- name: index.html
  copy:
    src: index.html
    dest: /var/www/html

[root@ansible httpd]#cat tasks/service.yml 
- name: start service
  service:
    name: httpd
    state: started
    enabled: yes

[root@ansible httpd]#cat handlers/main.yml 
- name: restart
  service:
    name: httpd
    state: restarted

# 在files目錄下準(zhǔn)備兩個文件
[root@ansible httpd]#ls files/
httpd.conf  index.html
[root@ansible httpd]#tree ./
./
├── files
│?? ├── httpd.conf
│?? └── index.html
├── handlers
│?? └── main.yml
└── tasks
    ├── config.yml
    ├── index.yml
    ├── install.yml
    ├── main.yml
    └── service.yml

3 directories, 8 files

# 在playbook中調(diào)用角色
[root@ansible httpd]#cat ../../role_httpd.yml 
---
# httpd role
- hosts: appsrvs
  remote_user: root

  roles:
    - role: httpd

# 運(yùn)行playbook
[root@ansible httpd]#ansible-playbook ../../role_httpd.yml
3.5.2 案例2:實(shí)現(xiàn)nginx角色
[root@ansible ~]#ls /data/ansible/roles/nginx/
files  handlers  tasks  templates  vars
# 創(chuàng)建task文件
[root@ansible ~]#cd /data/ansible/roles/nginx/
[root@ansible nginx]#cat tasks/main.yml 
- include: install.yml
- include: config.yml
- include: file.yml
- include: service.yml
[root@ansible nginx]#cat tasks/install.yml 
- name: install
  yum: name=nginx
[root@ansible nginx]#cat tasks/config.yml 
- name: config file for centos7
  template:
    src: nginx7.conf.j2
    dest: /etc/nginx/nginx.conf
  when: ansible_distribution_major_version=="7"
  notify: restart

- name: config file for centos8
  template:
    src: nginx8.conf.j2
    dest: /etc/nginx/nginx.conf
  when: ansible_distribution_major_version=="8"
  notify: restart
[root@ansible nginx]#cat tasks/file.yml 
- name: index.html
  copy:
    src: index.html
    dest: /usr/share/nginx/html
[root@ansible nginx]#cat tasks/service.yml 
- name: start service
  service:
    name: nginx
    state: started
    enabled: yes

# 創(chuàng)建handlers文件
[root@ansible nginx]#cat handlers/main.yml 
- name: restart
  service:
    name: nginx
    state: restarted

# 創(chuàng)建兩個template文件
[root@ansible nginx]#cat templates/nginx7.conf.j2
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user {{user}}; #修改此行
worker_processes {{ansible_processor_vcpus**2}}; #修改此行
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        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 {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        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 {
#        }
#    }

}

[root@ansible nginx]#cat templates/nginx8.conf.j2
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes {{ansible_processor_vcpus+2}}; #修改此行
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        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 {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        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 {
#        }
#    }

}

# 創(chuàng)建變量文件
[root@ansible nginx]#cat vars/main.yml 
user: daemon

# 在files目錄下創(chuàng)建index.html文件
[root@ansible nginx]#cat files/index.html 
<h2>hello nginx </h2>

# 目錄結(jié)構(gòu)如下
[root@ansible nginx]#tree ./
./
├── files
│?? └── index.html
├── handlers
│?? └── main.yml
├── tasks
│?? ├── config.yml
│?? ├── file.yml
│?? ├── install.yml
│?? ├── main.yml
│?? └── service.yml
├── templates
│?? ├── nginx7.conf.j2
│?? └── nginx8.conf.j2
└── vars
    └── main.yml

5 directories, 10 files

# 在playbook中調(diào)用角色
[root@ansible nginx]#cat ../../role_nginx.yml 
---
# nginx role
- hosts: appsrvs

  roles:
    - role: nginx

# 運(yùn)行playbook
[root@ansible nginx]#ansible-playbook /data/ansible/role_nginx.yml
3.5.3 案例3:實(shí)現(xiàn)多角色的選擇
[root@ansible nginx]#cat /data/ansible/role_httpd_nginx.yml
---
- hosts: appsrvs
  roles:
    - { role: httpd,tags: [httpd,web], when: ansible_distribution_major_version=="7" }
    - { role: nginx,tags: [nginx,web], when: 
    ansible_distribution_major_version=="8" }

[root@ansible nginx]#ansible-playbook -t nginx /data/ansible/role_httpd_nginx.yml

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前題目:運(yùn)維自動化工具之Ansible-創(chuàng)新互聯(lián)
URL分享:http://aaarwkj.com/article0/cchsio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、電子商務(wù)、服務(wù)器托管、軟件開發(fā)、動態(tài)網(wǎng)站、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
国产老太婆精品久久久久| 国产一区二区精品小视频| 欧美色欧美亚洲另类视频| 91色九色吧在线观看| av天堂资源在线播放| 最新国产精品欧美激情| 一区二区三区不卡中文字幕| 91超碰这里只有精品国产| 国产亚洲精品精品国产亚洲| 国产亚洲精品a久久7777| 久久精品亚洲夜色国产av| 久久国产精品欧美熟妇| 欧美+亚洲+精品+三区| 中文字幕av在线有码| 成人午夜在线免费观看| 久热99在线视频免费观看| 亚洲黄色一区大陆av剧情| 国产一区二区三区免费有码视频| 好吊妞视频这里只有精| 久久成人激情免费视频| 午夜福利欧美日本视频| 亚洲精品永久在线观看| 亚洲视频在线的视频在| 亚洲国产精品视频中文字幕| 91免费人成网站在线观看| 欧美国产一级二级三级| 成年女人大片免费观看版| 初爱视频教程完整版韩国 | 日本在线人妻一区二区| 久久国产亚洲精品赲碰热| 欧美午夜激情片在线观看| 朝桐光日韩一区二区三区| 91黄色国产在线播放| 一区二区三区亚洲精品在线| 亚洲精品偷拍在线观看| 日韩人妻精品在线一区二区| 国产三级国产剧情国产av| 美女张开腿让男人插进去| 久久亚洲欧美国产精品观看| 欧美日韩国产一下老妇| 91亚洲蜜桃内射后入在线观看|