1、上集回顧html
一、運維:node
手動 --> 標準化 --> 工具化 --> 自動化 --> 智能化python
二、工具化mysql
OS Install:PXE ,Cobbler;Virutalization & Cloud Commputing linux
OS Config: ansible,fabric,puppet,saltstack,chef,cfengine,...nginx
Deployment: fabric,ansible,...web
Task Exec:fabric,ansible,func,...redis
三、Ansible:agentless(ssh),modulessql
Modules:shell
copy,file,fetch..
yum,easy_install,pip,
service,
group,user,
cron,at,..
command,shell
script,
ping,
template,...
Ad-Hoc,Playbook,...
$ ansible HOST-PATTERN -m MOD_NAME -a MOD_ARGS -C -f FORKS
2、Ansible Playbook
一、此前咱們在命令行中直接運行的方式很難複用,好比咱們管控十臺主機都裝上nginx並啓動服務,咱們使用ansible命令可直接使用,不過萬一其中某幾臺主機出現故障咱們須要從新部署這些命令咱們須要記得住而且還須要從新來一遍。因此咱們可讓每一臺主機要執行的任務將其保存在文件中,這個文件組織成爲YAML格式,必要的時候咱們只須要使用ansible命令來執行這個指定的playbook,他會讀取每個指定的操做,將其在目標主機上完成。
二、YAML
a、定義
b、功能
c、語言的構成元素
c、基本數據結構
標量、數組、關聯數組
維基百科:https:zh.wikipedia.org/wiki/YAML
三、playbook核心元素
a、Hosts:主機即關聯到的主機,即哪些主機來執行這些任務
b、Tasks:任務列表,指要唱哪幾齣戲。
c、Variables:在唱戲的過程當中若是有些數據咱們須要重複使用可使用此字段
d、Templates:生成文件時還能夠基於模板來定義,這樣對於不一樣的主機咱們就可使用不一樣的內容了。
e、Roles:咱們能夠將playbook分片之後構建成Roles。
f、Handlers:由特定條件觸發的任務。
四、Playbook的基礎組件
a、Hosts:運行指定任務的目標主機;
b、remoute_user:在遠程主機上執行任務的用戶;即目標主機上以哪一個用戶的身份來執行任務
sudo_user:若是以普通用戶來執行任務有時候須要切換到管理員才能執行
c、tasks:任務列表,咱們要執行管控任務時,咱們的任務有哪些個?每個任務的給定方法有兩種,可是不管是哪一種給法一般用來指明說調哪一個模塊傳哪些參數從而讓他完成哪一個管理任務格式以下:
(1)、action:module arguments:動做和模塊參數;action指你打算執行的是刪除仍是建立這種,調哪一個模塊,以及向這個模塊傳遞什麼參數。
(2)、module:arguments :模塊名稱和模塊參數;即直接給定模塊名稱,以及要傳遞給模塊的參數。
注意:shell 和command 模塊後面直接跟命令,而非key=value類的參數列表;
某任務的狀態在運行後爲changed時,可經過「notify」通知給相應的handlers;
任務能夠經過「tags」打標籤,然後可在ansible-playbook命令上使用 -t 指定進行調用;
五、運行playbook的方式:
a、ansible-playbook --check :只檢測可能會發生的改變,但不真正執行操做
b、ansible-playbook --list-hosts: 列出運行任務的主機;
c、運行
3、Playbook使用
一、定義Playbook
a、定義安裝redis yaml文件
[root@node3 playbooks]# cat first.yaml - hosts: all #主機列表,這表示接下來由192.168.10.13來唱第一齣戲 remote_user: root #任務由root執行 task: #執行什麼任務,下面一共執行三個任務 - name: install redis yum: name=redis state=latest - name: start redis service: name=redis state=started #- hosts: all #表示全部主機都要唱戲 #- hosts: 192.168.10.14 #主機列表,表示由192.168.10.14來唱這齣戲
b、檢查語法,查看執行任務的主機和任務
[root@node3 playbooks]# ansible-playbook --syntax-check first.yaml
playbook: first.yaml
[root@node3 playbooks]# ansible-playbook --list-hosts --list-tasks first.yaml playbook: first.yaml play #1 (all): all TAGS: [] #第一齣戲適用於all主機,標籤沒有定義,也就意味着all pattern: [u'all'] hosts (3): 192.168.10.14 192.168.10.15 192.168.10.13 tasks: install redis TAGS: [] #安裝redis任務 start redis TAGS: [] #啓動redis 任務
c、幹跑一遍(不會真正的跑,只是預跑)。跑任務時是按照任務分發給全部主機,執行完第一個再執行第二個,再執行第三個再執行第四個。若是某一個任務卡住了全部主機上的全部任務都沒法完成。
[root@node3 playbooks]# ansible-playbook -C first.yaml PLAY [all] ********************************************************************************************************************************************************************************** #收集主機上的環境信息,全部的戲都會添加進去 TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.13] ok: [192.168.10.15] ok: [192.168.10.14] TASK [install redis] ************************************************************************************************************************************************************************ changed: [192.168.10.15] changed: [192.168.10.14] changed: [192.168.10.13] TASK [start redis] ************************************************************************************************************************************************************************** changed: [192.168.10.13] changed: [192.168.10.14] changed: [192.168.10.15] #統計結果 PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=3 changed=2 unreachable=0 failed=0 192.168.10.14 : ok=3 changed=2 unreachable=0 failed=0 192.168.10.15 : ok=3 changed=2 unreachable=0 failed=0
d、真正執行任務
[root@node3 playbooks]# ansible-playbook first.yaml
查看redis是否安裝上
[root@node3 playbooks]# ansible all -m shell -a "netstat -anpt|grep 6379" 192.168.10.15 | SUCCESS | rc=0 >> tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 15620/redis-server 192.168.10.13 | SUCCESS | rc=0 >> tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 10712/redis-server 192.168.10.14 | SUCCESS | rc=0 >> tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 10716/redis-server
e、將192.168.10.14的redis.conf配置文件複製到當前目錄下
[root@node3 playbooks]# ansible 192.168.10.14 -m fetch -a "src=/etc/redis.conf dest=./" 192.168.10.14 | SUCCESS => { "changed": true, "checksum": "07eedef3014b6ed6d95b95b38577dff5ac3ecf12", "dest": "/root/playbooks/192.168.10.14/etc/redis.conf", "md5sum": "d98629fded012cd2a25b9db0599a9251", "remote_checksum": "07eedef3014b6ed6d95b95b38577dff5ac3ecf12", "remote_md5sum": null } [root@node3 playbooks]# ls 192.168.10.14/etc/ redis.conf [root@node3 playbooks]# cp 192.168.10.14/etc/redis.conf ./
修改配置文件兩項參數。注意,參數後面不要加#註釋,否則服務會起不來。被坑了一下午。
[root@node3 playbooks]# cat redis.conf |grep -E "^bind|^requ" bind 0.0.0.0 requirepass wohaoshuai
二、handlers關鍵字:任務在特定條件下觸發。接收到其它任務的通知時被觸發。notify: HANDLER TASK NAME
a、定義yaml文件替換redis.conf文件
[root@node3 playbooks]# cat first.yaml - hosts: all #主機列表,這表示接下來由192.168.10.13來唱第一齣戲 remote_user: root #任務由root執行 tasks: #執行什麼任務,下面一共執行三個任務 - name: install redis yum: name=redis state=latest - name: copy config file copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=redis - name: start redis service: name=redis state=started #- hosts: all #表示全部主機都要唱戲 #- hosts: 192.168.10.14 #主機列表,表示由192.168.10.14來唱這齣戲 [root@node3 playbooks]# ansible-playbook --syntax-check first.yaml playbook: first.yaml [root@node3 playbooks]# ansible-playbook first.yaml PLAY [all] ********************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.14] ok: [192.168.10.15] ok: [192.168.10.13] TASK [install redis] ************************************************************************************************************************************************************************ ok: [192.168.10.15] ok: [192.168.10.14] ok: [192.168.10.13] TASK [copy config file] ********************************************************************************************************************************************************************* changed: [192.168.10.13] changed: [192.168.10.15] changed: [192.168.10.14] TASK [start redis] ************************************************************************************************************************************************************************** ok: [192.168.10.15] ok: [192.168.10.14] ok: [192.168.10.13] PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=4 changed=1 unreachable=0 failed=0 192.168.10.14 : ok=4 changed=1 unreachable=0 failed=0 192.168.10.15 : ok=4 changed=1 unreachable=0 failed=0
b、定義某一任務只要發生改變另外一個任務就要觸發,即條件式觸發
[root@node3 playbooks]# cat second.yaml - hosts: all #主機列表,這表示接下來由192.168.10.13來唱第一齣戲 remote_user: root #任務由root執行 tasks: #執行什麼任務,下面一共執行三個任務 - name: install redis yum: name=redis state=latest - name: copy config file copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=redis notify: restart redis #通知,通知給任務restart redis,即任務copy config file任務執行後只要redis.conf複製成功那麼就執行 restart redis這個任務,不過只有redis.conf改變纔會執行,若重複執行 該任務則restart redis任務不會重複執行。
- name: start redis service: name=redis state=started handlers: #處理器 - name: restart redis service: name=redis state=restarted
c、假如咱們如今只想把redis.conf文件送到每個節點而不啓動其它任務,能夠這樣幹,先把任務copy config file打上標籤而後在執行的時候加上標籤名稱
[root@node3 playbooks]# cat second.yaml - hosts: all #主機列表,這表示接下來由192.168.10.13來唱第一齣戲 remote_user: root #任務由root執行 tasks: #執行什麼任務,下面一共執行三個任務 - name: install redis yum: name=redis state=latest - name: copy config file copy: src=/root/playbooks/redis.conf dest=/etc/redis.conf owner=redis notify: restart redis #通知,通知給任務restart redis,即任務copy config file任務執行後只要redis.conf複製成功那麼就執行 restart redis這個任務,不過只有redis.conf改變纔會執行,若重複執行 該任務則restart redis任務不會重複執行。
tags: configfile - name: start redis service: name=redis state=started handlers: #處理器 - name: restart redis service: name=redis state=restarted
[root@node3 playbooks]# ansible-playbook -t configfile second.yaml PLAY [all] ********************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.13] ok: [192.168.10.14] ok: [192.168.10.15] TASK [copy config file] ********************************************************************************************************************************************************************* changed: [192.168.10.15] changed: [192.168.10.14] changed: [192.168.10.13] RUNNING HANDLER [restart redis] ************************************************************************************************************************************************************* changed: [192.168.10.13] changed: [192.168.10.14] changed: [192.168.10.15] PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=3 changed=2 unreachable=0 failed=0 192.168.10.14 : ok=3 changed=2 unreachable=0 failed=0 192.168.10.15 : ok=3 changed=2 unreachable=0 failed=0
若是兩個任務標籤都同樣那麼這兩個任務都會執行
三、variables:變量
a、facts:由於經過ansible-playbook執行任務時會提早收集節點相應變量信息所以可直接調用,可以使用setup模塊直接獲取目標主機的facters;
[root@node3 playbooks]# ansible 192.168.10.15 -m setup
[root@node3 playbooks]# cat third.yaml - hosts: 192.168.10.14 remote_user: root tasks: - name: copy file copy: content={{ ansible_env }} dest=/tmp/ansible.env [root@node3 playbooks]# ansible-playbook third.yaml PLAY [192.168.10.14] ************************************************************************************************************************************************************************ #此步驟爲收集節點相應配置信息信息 TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.14] TASK [copy file] **************************************************************************************************************************************************************************** changed: [192.168.10.14] PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.14 : ok=2 changed=1 unreachable=0 failed=0 [root@node3 playbooks]# ansible 192.168.10.14 -m shell -a "cat /tmp/ansible.env" 192.168.10.14 | SUCCESS | rc=0 >> {"LANG": "en_US.utf8", "TERM": "xterm", "SHELL": "/bin/bash", "XDG_RUNTIME_DIR": "/run/user/0", "MAIL": "/var/mail/root", "SHLVL": "2", "SSH_TTY": "/dev/pts/0", "SSH_CLIENT": "192.168.10.15 44546 22", "LESSOPEN": "||/usr/bin/lesspipe.sh %s", "PWD": "/root", "LOGNAME": "root", "USER": "root", "PATH": "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin", "HOME": "/root", "LS_COLORS": "rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:", "XDG_SESSION_ID": "197", "_": "/usr/bin/python", "SSH_CONNECTION": "192.168.10.15 44546 192.168.10.14 22"}
b、用戶自定義變量
1)、ansible-playbook命令的命令行中的自定義變量:-e VARS, --extra-vars=VARS
[root@node3 playbooks]# cat forth.yaml - hosts: all remote_user: root tasks: - name: install package yum: name={{ pkgname }} state=latest [root@node3 playbooks]# ansible-playbook -e pkgname=memcached -C forth.yaml PLAY [all] ********************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.13] ok: [192.168.10.14] ok: [192.168.10.15] TASK [install package] ********************************************************************************************************************************************************************** changed: [192.168.10.14] changed: [192.168.10.15] changed: [192.168.10.13] PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=2 changed=1 unreachable=0 failed=0 192.168.10.14 : ok=2 changed=1 unreachable=0 failed=0 192.168.10.15 : ok=2 changed=1 unreachable=0 failed=0
2)、在playbook中定義變量
c、經過roles傳遞變量
d、經過主機清單來傳遞變量(Host Inventory)
1)、向不一樣的主機傳遞不一樣的變量:
IP/HOSTNAME varaiable=value var2-=value2
2)、向組中的主機傳遞相同的變量;
[groupname:vars]
variable=value
3)、注意,invertory參數用於定義ansible遠程鏈接目標主機時使用的參數,而非傳遞給playbook的變量。對於主機清單而言,咱們ansible要管控哪些主機必須實現把其定義到主機清單中,不然是不能做爲管控目標的,而定義在主機清單文件中的方式咱們還能夠嘗試着把其定義爲主機組,用角色來進行命名
[root@node3 ansible]# cat /etc/ansible/hosts |grep -Ev "^$|^#" [websrvs] 192.168.10.13 192.168.10.14 [dbsrvs] 192.168.10.15 192.168.10.14 #IP能夠複用 [root@node3 ansible]# ansible websrvs --list-hosts hosts (2): 192.168.10.13 192.168.10.14
ansible_ssh_host
ansible_ssh_port
ansible_ssh_user
ansible_ssh_pass
ansible_sudo_pass
4)、放在中括號中叫作主機清單的組名,而這個組名在定義內部的主機時還可使用通配符的方式進行定義。
[root@node3 ansible]# cat /etc/ansible/hosts |grep -Ev "^$|^#" [websrvs] node[1:7].wohaoshuai.com [dbsrvs] 192.168.10.15 192.168.10.14 #IP能夠複用 [root@node3 ansible]# ansible websrvs --list-hosts hosts (7): node1.wohaoshuai.com node2.wohaoshuai.com node3.wohaoshuai.com node4.wohaoshuai.com node5.wohaoshuai.com node6.wohaoshuai.com node7.wohaoshuai.com
5)、還能夠在主機清單中自定義參數
首先咱們給每一個主機建立一個用戶
[root@node3 playbooks]# cat /etc/ansible/hosts |grep -Ev "^$|^#" [websrvs] 192.168.10.13 #ansible_ssh_port=22122 ansible_ssh_user=wohaoshuai ansible_ssh_password=wohaoshuai 192.168.10.14 [dbsrvs] 192.168.10.15 192.168.10.14 #IP能夠複用 [root@node3 playbooks]# cat users.yaml - hosts: all remote_user: root tasks: - name: add_user user: name=wohaoshuai system=no state=present - name: set password shell: echo wohaoshuai |passwd --stdin wohaoshuai [root@node3 playbooks]# ansible-playbook users.yaml PLAY [all] ********************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.13] ok: [192.168.10.14] ok: [192.168.10.15] TASK [add_user] ***************************************************************************************************************************************************************************** changed: [192.168.10.15] changed: [192.168.10.13] changed: [192.168.10.14] TASK [set password] ************************************************************************************************************************************************************************* changed: [192.168.10.14] changed: [192.168.10.13] changed: [192.168.10.15] PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=3 changed=2 unreachable=0 failed=0 192.168.10.14 : ok=3 changed=2 unreachable=0 failed=0 192.168.10.15 : ok=3 changed=2 unreachable=0 failed=0
接下來咱們經過在主機清單中設置鏈接用戶來鏈接管控的機器
[root@node3 playbooks]# cat /etc/ansible/hosts |grep -Ev "^$|^#" [websrvs] 192.168.10.13 ansible_ssh_user=wohaoshuai ansible_ssh_pass=wohaoshuai 192.168.10.14 ansible_ssh_user=wohaoshuai ansible_ssh_pass=wohaoshuai [dbsrvs] 192.168.10.15 192.168.10.14 #IP能夠複用 [root@node3 playbooks]# ansible websrvs -m shell -a "whoami" 192.168.10.13 | SUCCESS | rc=0 >> wohaoshuai 192.168.10.14 | SUCCESS | rc=0 >> wohaoshuai
6)、咱們在向主機傳遞參數時是能夠直接傳遞變量的,接下來咱們給組定義變量
[root@node3 playbooks]# cat /etc/ansible/hosts |grep -Ev "^$|^#" [websrvs] 192.168.10.13 192.168.10.14 [websrvs:vars] http_port=8080 #表示websrvs這個組有一個共同的全部主機都有的變量叫http_port且其值爲8080 [dbsrvs] 192.168.10.15 192.168.10.14 #IP能夠複用
e、關於變量的實例
包含命令行,主機清單,playbook的變量實例
[root@node3 playbooks]# cat /etc/ansible/hosts |grep -Ev "^$|^#" [websrvs] 192.168.10.13 http_port=8080 192.168.10.14 http_port=10080 [dbsrvs] 192.168.10.15 192.168.10.14 #IP能夠複用 [root@node3 playbooks]# cat vars.yaml - hosts: websrvs remote_user: root vars: - pbvar: playbook variable testing tasks: - name: command line variables copy: content={{ cmdvar }} dest=/tmp/cmd.var - name: playbook variables copy: content={{ pbvar }} dest=/tmp/pb.var - name: host iventory variables copy: content={{ http_port }} dest=/tmp/hi.var [root@node3 playbooks]# ansible-playbook -e cmdvar="commandlinevariabletesting" vars.yaml PLAY [websrvs] ****************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.14] ok: [192.168.10.13] TASK [command line variables] *************************************************************************************************************************************************************** changed: [192.168.10.13] changed: [192.168.10.14] TASK [playbook variables] ******************************************************************************************************************************************************************* changed: [192.168.10.13] changed: [192.168.10.14] TASK [host iventory variables] ************************************************************************************************************************************************************** changed: [192.168.10.14] changed: [192.168.10.13] PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=4 changed=3 unreachable=0 failed=0 192.168.10.14 : ok=4 changed=3 unreachable=0 failed=0
[root@node3 playbooks]# ansible websrvs -m shell -a "cat /tmp/cmd.var && cat /tmp/pb.var && cat /tmp/hi.var" 192.168.10.14 | SUCCESS | rc=0 >> commandlinevariabletestingplaybook variable testing10080 192.168.10.13 | SUCCESS | rc=0 >> commandlinevariabletestingplaybook variable testing8080
4、模板(Templates)
一、在說模板以前要先說一說模板模塊。模板是指包含了模板語法的文本文件,而模板文件的生成要靠模板模塊。
a、咱們能夠經過引用fector中的變量來定義配置文件
[root@node3 playbooks]# cat redis.conf.j2 |grep -E "^bind" bind {{ ansible_ens33.ipv4.address }} [root@node3 playbooks]# cat template.yaml - hosts: 192.168.10.13 remote_user: root tasks: - name: install config file template: src=/root/playbooks/redis.conf.j2 dest=/tmp/redis.conf [root@node3 playbooks]# ansible-playbook template.yaml PLAY [192.168.10.13] ************************************************************************************************************************************************************************ TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.13] TASK [install config file] ****************************************************************************************************************************************************************** changed: [192.168.10.13] PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=2 changed=1 unreachable=0 failed=0 [root@node3 playbooks]# ansible 192.168.10.13 -m shell -a "cat /tmp/redis.conf|grep -E ^bind" 192.168.10.13 | SUCCESS | rc=0 >> bind 192.168.10.13
b、利用template安裝httpd,讓不一樣的主機擁有不一樣的配置項,這就須要主機清單中的變量了,若是是一樣的配置項可使用組變量來定義。
[root@node3 playbooks]# cat /root/playbooks/mylisten.conf Listen {{ http_port }} [root@node3 playbooks]# cat /root/playbooks/httpd.yaml - hosts: websrvs remote_user: root tasks: - name: install httpd yum: name=httpd state=latest - name: install config file template: src=/root/playbooks/mylisten.conf dest=/etc/httpd/conf.d/mylisten.conf - name: start httpd service: name=httpd state=started [root@node3 playbooks]# ansible-playbook --syntax-check httpd.yaml playbook: httpd.yaml [root@node3 playbooks]# ansible-playbook httpd.yaml PLAY [websrvs] ****************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.13] ok: [192.168.10.14] TASK [install httpd] ************************************************************************************************************************************************************************ changed: [192.168.10.13] changed: [192.168.10.14] TASK [install config file] ****************************************************************************************************************************************************************** changed: [192.168.10.14] changed: [192.168.10.13] TASK [start httpd] ************************************************************************************************************************************************************************** changed: [192.168.10.14] changed: [192.168.10.13] PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=4 changed=3 unreachable=0 failed=0 192.168.10.14 : ok=4 changed=3 unreachable=0 failed=0 [root@node3 playbooks]# ansible websrvs -m shell -a "cat /etc/httpd/conf.d/mylisten.conf && netstat -anpt|grep 80" 192.168.10.13 | SUCCESS | rc=0 >> Listen 8080 tcp6 0 0 :::8080 :::* LISTEN 17726/httpd tcp6 0 0 :::80 :::* LISTEN 17726/httpd 192.168.10.14 | SUCCESS | rc=0 >> Listen 10080 tcp 0 0 192.168.10.14:22 192.168.10.15:44820 ESTABLISHED 18061/sshd: root@pt tcp6 0 0 :::80 :::* LISTEN 18048/httpd tcp6 0 0 :::443 :::* LISTEN 18048/httpd tcp6 0 0 :::10080 :::* LISTEN 18048/httpd
5、Roles
一、在講roles以前須要先介紹task中的其它高級使用方式,好比咱們要安裝nginx,tomcat,redis,mysql等構建一個簡單的lnmp,同時還能基於redis作緩存或鍵值存儲。任務相同可是包名不同,此時咱們能夠在playbook的任務中可以使用迭代功能或判斷機制
a、when,條件判斷
[root@node3 playbooks]# cat os.yaml - hosts: websrvs remote_user: root tasks: - name: install httpd yum: name=httpd state=latest when: ansible_os_family == "RedHat" - name: install apache2 apt: name=apache2 state=latest when: ansible_os_family == "Debian"
[root@node3 playbooks]# ansible-playbook -C os.yaml PLAY [websrvs] ****************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.14] ok: [192.168.10.13] TASK [install httpd] ************************************************************************************************************************************************************************ ok: [192.168.10.14] ok: [192.168.10.13] TASK [install apache2] ********************************************************************************************************************************************************************** skipping: [192.168.10.13] skipping: [192.168.10.14] PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=2 changed=0 unreachable=0 failed=0 192.168.10.14 : ok=2 changed=0 unreachable=0 failed=0
b、循環,迭代
[root@node3 playbooks]# cat iter.yaml - hosts: websrvs remote_user: root tasks: - name: install {{ item }} package yum: name={{ item }} state=latest with_items: - tomcat - tomcat-webapps - tomcat-admin-webapps [root@node3 playbooks]# ansible-playbook iter.yaml
[root@node3 playbooks]# ansible-playbook iter.yaml PLAY [websrvs] ****************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.13] ok: [192.168.10.14] TASK [install {{ item }} package] *********************************************************************************************************************************************************** changed: [192.168.10.13] => (item=[u'tomcat', u'tomcat-webapps', u'tomcat-admin-webapps']) changed: [192.168.10.14] => (item=[u'tomcat', u'tomcat-webapps', u'tomcat-admin-webapps']) PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=2 changed=1 unreachable=0 failed=0 192.168.10.14 : ok=2 changed=1 unreachable=0 failed=0
二、roles:角色
a、以nginx爲例,咱們要嘗試去啓動nginx,用ansible來實現大致包含以下幾個步驟。首先須要安裝epel倉庫,而後須要裝程序包,而後提供nginx配置文件,而後啓動服務。提供配置文件也有兩種方式,直接複製或用模板生成。所以你須要三四個步驟。更重要的是他還須要一個文件來複制,這個文件應該是你的ansible主機之上,他在ansible主機之上的哪一個目錄下呢?未來ansible主機壞了咱們把對應的playbook挪到另一個主機上的時候他仍是否能正常執行,還要不要把配置文件一塊兒複製過去,若是忘了複製怎麼辦呢?因此咱們爲了完成某一特定任務最好把爲了建立一個爲了完成任務所須要的各類內容都放在一塊兒,好比:tasks任務列表,handler觸發器列表,包括模板文件自己等放在一個自包含的目錄結構中,這個自包含的目錄結構就叫角色。好比咱們定義一個角色就叫nginx,裏面有tasks專門聽任務,vars專門放變量,templates專門放模板文件,files裏面各類文件都是咱們的純文本文件專門用於複製的。
b、ansible在配置文件中已經說明他的角色應該放在/etc/ansible/roles目錄下或/usr/share/ansible/roles目錄下
[root@node3 ~]# cat /etc/ansible/ansible.cfg |grep -Ev "^#|^$" [defaults] roles_path = /etc/ansible/roles:/usr/share/ansible/roles [inventory] [privilege_escalation] [paramiko_connection] [ssh_connection] [persistent_connection] [accelerate] [selinux] [colors] [diff]
c、接下來咱們建立一個nginx的role,這裏面除了tasks是必須的以外其它都不是必須的
[root@node3 ~]# mkdir -pv /etc/ansible/roles/nginx/{files,templates,tasks,vars,handlers,meta,default} mkdir: created directory ‘/etc/ansible/roles/nginx’ mkdir: created directory ‘/etc/ansible/roles/nginx/files’ mkdir: created directory ‘/etc/ansible/roles/nginx/templates’ mkdir: created directory ‘/etc/ansible/roles/nginx/tasks’ mkdir: created directory ‘/etc/ansible/roles/nginx/vars’ mkdir: created directory ‘/etc/ansible/roles/nginx/handlers’ mkdir: created directory ‘/etc/ansible/roles/nginx/meta’ mkdir: created directory ‘/etc/ansible/roles/nginx/default’
咱們先只在nginx角色的tasks中編寫任務而後編寫安裝nginx的playbook文件
[root@node3 ~]# cat /etc/ansible/roles/nginx/tasks/main.yml - name: install nginx yum: name=nginx state=latest when: ansible_os_family == "RedHat" [root@node3 ~]# cat nginx.yml - hosts: websrvs remote_user: root roles: - nginx [root@node3 ~]# ansible-playbook -C nginx.yml PLAY [websrvs] ****************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.14] ok: [192.168.10.13] TASK [nginx : install nginx] **************************************************************************************************************************************************************** changed: [192.168.10.13] changed: [192.168.10.14] PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=2 changed=1 unreachable=0 failed=0 192.168.10.14 : ok=2 changed=1 unreachable=0 failed=0
d、其還有其它更爲強大的表現,好比nginx起碼要有配置文件,假如這個配置文件咱們自建一個虛擬主機,所以,在原有配置文件的基礎之上咱們額外加一個配置文件好比監聽在80端口上,而對應的servername是這個主機的自身的主機名此時就須要用ansible的變量來獲取主機名並保存在配置文件中,因而咱們來開幹
[root@node3 ~]# cat /etc/ansible/roles/nginx/templates/vhost1.conf.j2 server { listen 80; server_name {{ ansible_fqdn }}; location / { root "/ngxdata/vhost1"; } } [root@node3 ~]# cat /etc/ansible/roles/nginx/tasks/main.yml - name: install nginx yum: name=nginx state=latest when: ansible_os_family == "RedHat" - name: install conf template: src=vhost1.conf.j2 dest=/etc/nginx/conf.d/vhost1.conf #這兒直接寫vhost1.conf.j2他就會自動到templates目錄下去找該文件 [root@node3 ~]# cat nginx.yml - hosts: websrvs remote_user: root roles: - nginx [root@node3 ~]# ansible-playbook -C nginx.yml PLAY [websrvs] ****************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.14] ok: [192.168.10.13] TASK [nginx : install nginx] **************************************************************************************************************************************************************** changed: [192.168.10.14] changed: [192.168.10.13] TASK [nginx : install conf] ***************************************************************************************************************************************************************** changed: [192.168.10.13] changed: [192.168.10.14] PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=3 changed=2 unreachable=0 failed=0 192.168.10.14 : ok=3 changed=2 unreachable=0 failed=0
e、接下來咱們介紹一個包含變量的任務
[root@node3 ~]# cat /etc/ansible/roles/nginx/tasks/main.yml - name: install nginx yum: name=nginx state=latest when: ansible_os_family == "RedHat" - name: install conf template: src=vhost1.conf.j2 dest=/etc/nginx/conf.d/vhost1.conf #這兒直接寫vhost1.conf.j2他就會自動到templates目錄下去找該文件 tags: conf notify: restart nginx - name: install site home directory file: path={{ ngxroot }} state=directory - name: install index page copy: src=index.html dest={{ ngxroot }}/ - name: start nginx service: name=nginx state=started [root@node3 ~]# cat /etc/ansible/roles/nginx/handlers/main.yml - name: restart nginx service: name=nginx state=restarted [root@node3 ~]# vim /etc/ansible/roles/nginx/vars/main.yml [root@node3 ~]# cat /etc/ansible/roles/nginx/vars/main.yml ngxroot: /ngxdata/vhost1 [root@node3 ~]# cat /etc/ansible/roles/nginx/files/index.html <h1>Vhost1<h1> [root@node3 ~]# cat /etc/ansible/roles/nginx/templates/vhost1.conf.j2 server { listen 80; server_name {{ ansible_fqdn }}; location / { root "/ngxdata/vhost1"; } }
[root@node3 ~]# ansible-playbook -C nginx.yml PLAY [websrvs] ****************************************************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************************************** ok: [192.168.10.14] ok: [192.168.10.13] TASK [nginx : install nginx] **************************************************************************************************************************************************************** changed: [192.168.10.14] changed: [192.168.10.13] TASK [nginx : install conf] ***************************************************************************************************************************************************************** changed: [192.168.10.13] changed: [192.168.10.14] TASK [nginx : install site home directory] ************************************************************************************************************************************************** changed: [192.168.10.13] changed: [192.168.10.14] TASK [nginx : install index page] *********************************************************************************************************************************************************** changed: [192.168.10.13] changed: [192.168.10.14] TASK [nginx : start nginx] ****************************************************************************************************************************************************************** changed: [192.168.10.14] changed: [192.168.10.13] RUNNING HANDLER [nginx : restart nginx] ***************************************************************************************************************************************************** changed: [192.168.10.13] changed: [192.168.10.14] PLAY RECAP ********************************************************************************************************************************************************************************** 192.168.10.13 : ok=7 changed=6 unreachable=0 failed=0 192.168.10.14 : ok=7 changed=6 unreachable=0 failed=0
將templates目錄下文件中監聽端口改成8080後再次執行任務後會發現nginx服務重啓了並更新了監聽端口