mage Ansible學習2 Playbook

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服務重啓了並更新了監聽端口

相關文章
相關標籤/搜索