1. 程式人生 > >ansible中的playbook(劇本)

ansible中的playbook(劇本)

寫入 mas 網段 打開文件 技術分享 列表 mage ont broadcast

playbook 劇本

一、操作都是冪等的

  即操作過後就不會操作了

ymal

  配置文件

格式為:

  字典:

  key: value  (冒號後面必須有空格)

  列表

  -

playbook的格式

Usage: ansible-playbook [options] playbook.yml [playbook2 ...]

-C    --check    #白跑,執行代碼但不會有結果

--list-hosts        #列出符合的主機

-f FORKS    --forks=FORKS    #做並發

--syntax-check    #檢查語法

-k --ask-pass #輸入密碼

了解了playbook的命令的格式接下來看看怎麽使用吧

  首先新建一個文件裏面寫咱們的代碼,文件結尾為.yml的文件

touch    pb.yml
vim    pb.yml

  單個的playbook的實例文件如下,冒號後面要加空格

  創建一個用戶,用戶名為IT01,家目錄為/opt/IT01,用戶id為4000

- hosts: all    #指定要執行的主機組
   remote_user: root    #指定執行的用戶,默認是root
   tasks:    #任務列表
   - name: createuser    #任務名字,必須要有
      user: name
=IT01 home=/opt/IT01 uid=4000 #指定要使用的模塊以及模塊參數

  多個playbook的實例文件內容如下

  一個任務名稱為createuser,一個任務名稱為copyfile。playbook有冪等性不管執行多少次,得到的結果都是一樣的可以在原有的基礎上可以再寫一個任務

- hosts: all
  remote_user: root
  tasks:
  - name: createuser
    user: name=IT01 home=/opt/IT01 uid=4000
 - name:copyfile
   copy: src=/etc/fstab dest=/tmp/fs

  接下來就有新的問題了如果我原來早先的機器是這樣做,現在公司又來了一批新機器不設置用戶為IT01,要設置成IT02,我是不是還要打開這個playbook再來一遍呢。太繁瑣了,所以就需要用到傳參了,比如:

- hosts: all
  tasks:
  - name: create{{user}}
    user: name={{user}}

然後在執行這個playbook的時候用 -e 指定上面代碼中需要的user

ansible-playbook -e user=IT02 pb.yml

   上面是傳參的第一種方式,關於playbook的傳參有5種方式,首先我們需要打開 /etc/ansible/hosts 文件

vi /etc/ansible/hosts

然後找到上次咱們分組的地方

技術分享圖片

改成下面這樣的:

技術分享圖片

然後執行

ansible-playbook pb.yml

下面是介紹第三種傳遞參數的方法

還是在/etc/ansible/hosts 文件,只是改成這樣的

技術分享圖片

再去執行上面的playbook命令運行pb.yuml文件

下面是第四種方法,是在寫bp.yml文件的時候寫入到文件中去:

- hosts: web
  vars:  #默認是root,可以省略
  - user: IT02
  tasks:
  - name: create{{user}}
    user: name={{user}}

第五種傳遞參數的方法:

如果我們想讓Linux做數學計算怎麽辦呢?我們需要安裝一個叫bc的包,正好我們用playbook安裝下

- hosts: all
  tasks:
  - name: yum
    yum: name=bc
  - name: sum
    shell: echo 11+22|bc
    register: user
  - name: echo
    shell: echo {{user.stdout}} > /tmp/echo.txt #將結果寫入到文件
  - name: create{{user.stdout}}
    user: name=IT{{user.stdout}}

接下來就是五種傳遞參數的方式的優先級

-e > playbook > hosts

在執行playbook的時候我們會看到這樣一條提示

TASK [Gathering Facts]

實質上這個是在收集信息,我們可以使用下面的命令來看收集的都有什麽信息

ansible cache -m setup | more

以及他所收集的一些重要的信息
ansible_all_ipv4_addresses #所有的ipv4地址
ansible_all_ipv6_addresses #所有的ipv6地址
ansible_architecture #系統的架構
ansible_date_time #系統時間
ansible_default_ipv4 #默認的ipv4地址
    address ip地址
    alias 網卡名稱
    broadcast 廣播地址
    gateway 網關
    netmask 子網掩碼
    network 網段
ansible_default_ipv6 #默認的ipv6地址
ansible_device_links #系統的磁盤信息
ansible_distribution #系統名稱
ansible_distribution_file_variety #系統的基於公司
ansible_distribution_major_version #系統的主版本
ansible_distribution_version #系統的全部版本
ansible_dns #系統的dns 默認udp 端口53
ansible_domain #系統的域 ldap
ipv4 #ipv4地址
ansible_env #系統的環境
ansible_fqdn #系統的完整主機名
ansible_hostname #系統的簡寫主機名
ansible_kernel #系統的內核版本
ansible_machine #系統的架構
ansible_memtotal_mb #系統的內存
ansible_memory_mb #系統的內存使用情況
ansible_mounts #系統的掛載信息
ansible_os_family #系統家族
ansible_pkg_mgr #系統的包管理工具
ansible_processor #系統的cpu
ansible_processor_cores #每顆cpu的核數
ansible_processor_count #cpu的顆數
ansible_processor_vcpus #cpu的個數=cpu的顆數*每顆cpu的核數
ansible_python #系統python信息
ansible_python_version #系統python的版本
ansible_system #系統名字

接下來就是,如果我們之前執行過的命令因為冪等會有跳過不會再次執行但是即便是那樣也會覺得很別扭比如我們寫的有yum安裝的命令和copy的命令,但是後面我們需要執行下playbook中的copy怎麽辦呢???那麽就引出了我們的

  tags標簽

  比如有如下一個playbook的文件:

- hosts: all
  tasks:
  - name: install
    yum: name=redis

  - name: copyfile
    copy: dest=/etc/redis.conf src=/etc/redis.conf
    tags: copy       #我們可以是使用tags定義一個標簽並取上名字

  - name: start
    service: name=redis state=started

  那麽我們如果只是需要copy文件的命令的時候就直接使用 -t 加上標簽名就執行了

ansible-playbook -t copy pb.yml

  那麽問題又來比如我們像上面一樣把主控機的redis.conf文件修改後copy到被控機上了然後我們需要重啟redis服務還需我們打開文件修改再運行什麽的,或者還要手動重啟redis,有麽有一種方法可以直接在文件改變了就自動重啟呢???就是下面的handlers了自動觸發的命令

- hosts: web
  tasks:
  - name: install
    yum: name=redis
  - name: copyfile
    copy: dest=/etc/redis.conf src=/etc/redis.conf
    tags: copy
notify: restart  #觸發
- name: start service: name=redis state=started
handlers:  #觸發執行的命令
- name: restart service: name=redis state=restarted

  當執行了copy命令後會觸發去執行handlers下面的代碼

  template可以動態的傳遞參數,可以在setup中獲取

  絕對路徑的寫法

- hosts: all
  tasks:
  - name: install
    yum: name=redis
  - name: copyfile
    template: dest=/etc/redis.conf src=/etc/redis.conf
    tags: copy
    notify: restart
  - name: start
    service: name=redis state=started
  handlers:
  - name: restart
    service: name=redis state=restarted

  當然相對的還有個相對路徑的寫法

- hosts: all
  tasks:
  - name: install
    yum: name=redis
  - name: copyfile
    template: dest=/etc/redis.conf src=redis.conf.j2
    tags: copy
    notify: restart
  - name: start
    service: name=redis state=started
  handlers:
  - name: restart
    service: name=redis state=restarted

  需要在當前目錄下創建一個templates的目錄,就可以使用相對路徑了

如何在playbook中寫判定語句

用 when

- hosts: all
  tasks:
  - name: copyfile
    copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt
    when: ansible_distribution_major_version=="7"    #如果系統的主版本是7那麽執行上面的代碼
  - name: copyfile
    copy: content="小弦切切如私語" dest=/tmp/a.txt
    when: ansible_distribution_major_version=="6"    #如果系統的主版本是6那麽執行上面的代碼

如何在playbook中寫循環語句

使用with_items就可以做到循環,是一個列表

- hosts: all
  tasks:
  - name: createuser
    user: name={{item}}
    with_items:
    - IT01
    - IT02
    - IT03

循環出來的元素都是寫item是固定的寫法

我是創建用戶可以這樣寫每個機器上都創建三個用戶,但是我不滿足現狀我想在創建用戶的同時可以指定組名該怎麽寫呢???這樣就用到了嵌套循環,具體寫法如下

- hosts: web
  tasks:
  - name: crateuser
    user: name={{item.name}}  group={{item.group}}
    with_items:
    - {"name":alex52,"group":alex60}
    - {"name":wusir52,"group":wusir60}
    - {"name":taibai52,"group":taibai60}

這種就是一個列表中套了三個字典

技術分享圖片

  

ansible中的playbook(劇本)