Ansible_yaml劇本

YAML語法
YAML最初是Yet Another Markup Language(另一種標記語言)的縮寫,後來爲了強調yaml是以數
據爲中心重新命名爲遞歸寫法YAML Ain’t
Markup Language(YAML 不是一種標記語言)。

散列表:(又叫哈希表),有鍵值對組成。
    示例:
        name: aaa
        age: 12
        或者
        {name: aaa, age: 12}
列表:
    示例:
        - list1
        - list2
        - list3
        或者
        [list1, list2, list3]
散列表中是引用列表:
    示例:
        name:
            - name1
            - name2
列表中使用散列項:
    示例:
        - name: aaa
          age: 18
        或者
        - {name: aaa, age: 18}
列表中使用列表項:
    示例:
        - [name, age, ]
        或者
        -
          - name1
          - name2
散列表中使用散列表:
    示例:
        names1:
            name1: aaa
            name2: bbb
            name3: ccc
        names2:
            .....: ..
            .....: ..
playbook組成結構:
        Inventory
        Modules
        Ad Hoc Command
        hosts
        Playbook
            Task:任務,即調用模塊完成的某操作
            Variables:變量
            Templates:模板
            Handlers:處理器,由某事件觸發執行的操作
            Roles:角色
示例:
- hosts: webnodes   # hosts用於指定要執行指定任務的主機,其可以是一個或多個由冒號分隔主機組
  vars:
    http_port: 80
    max_clients: 256
  remote_user: root # remote_user則用於指定遠程主機上的執行任務的用戶。remote_user也可用於各task中
  tasks:    # 任務列表task list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成
              第一個任務後再開始第二個如果中途發生錯誤,所有已執行任務都有可能將回滾
  - name: ensure apache is at the latest version    # 在衆多模塊中,只有command和shell模塊僅需要給定
  一個列表而無需使用“key=value
                                                      command: /sbin/setenforce 0
    yum: name=httpd state=latest
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

運行playbook的方式:
    (1) 測試
        ansible-playbook  --check
            只檢測可能會發生的改變,但不真正執行操作;
        ansible-playbook  --list-hosts
            列出運行任務的主機;
        ansible-playbook  --list-tasks
            列出要運行的任務列表
        ansible-playbook --syntax-check 
            語法檢查
handlers:
       任務,在特定條件下觸發;
       接收到其它任務的通知時被觸發;
           notify: HANDLER TASK NAME

條件式觸發器

- hosts: web
  remote_user: root
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
  - name: start nginx service
    service: name=nginx enabled=true state=started

- hosts: db
  remote_user: root
  tasks:
  - name: install redis package
    yum: name=redis state=latest
  - name: install conf file
    copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
    notify: restart redis service   # 引用觸發器
    tags: instconf
  - name: start redis service
    service: name=redis enabled=true state=started
    tags: startredis
  handlers: # 定義觸發器
  - name: restart redis service
    service: name=redis state=restarted
# 給play添加tags
- hosts: web
  remote_user: root
  tags: nginx service   # play添加標籤
  tasks:
  - name: install nginx package
    yum: name=nginx state=latest
  - name: start nginx service
    service: name=nginx enabled=true state=started

- hosts: db
  remote_user: root
  tags: redis service   # play添加標籤
  tasks:
  - name: install redis package
    yum: name=redis state=latest
  - name: install conf file
    copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
    notify: restart redis service
    tags: instconf
  - name: start redis service
    service: name=redis enabled=true state=started
    tags: startredis
  handlers:
  - name: restart redis service
    service: name=redis state=restarted


{default,file,handlers,meta,tasks,templates,vars}
例子:在webserver上面安裝nginx,在dbserver上面安裝redis,並且redis每次修改配置
文件後,會觸發重啓redis服務。

打上標籤後,可以只單獨運行標籤的那一部分
[ root@node1 ~ ]# ansible-playbook -t install nginx.yaml 


- hosts: webserver
  remote_user: root
  tasks:                                #任務
  - name: install nginx package
    yum: name=nginx state=latest
  - name: start nginx service
    service: name=nginx enabled=true state=started

- hosts: dbserver
  remote_user: root
  tasks:                                
  - name: install redis package
    yum: name=redis state=latest
  - name: install conf file
    copy: src=/root/redis.conf dest=/etc/redis.conf owner=redis group=root mode=644
    tags: install
    notify: restart redis service       #觸發器,配置文件修改後會觸發後面的handlers
  - name: start redis service
    service: name=redis state=started
    tags: startredis                    #使用標籤
  handlers:                             #不主動使用,只能被前面觸發.
  - name: restart redis service
    service: name=redis state=restarted

變量
(1) facts:可直接調用;
注意:可使用setup模塊直接獲取目標主機的facters;

(2) 用戶自定義變量:

(a) ansible-playbook命令的命令行中的
    -e VARS, --extra-vars=VARS
    # 示例:ansible-playbook test.yml --extra-vars "name=nginx user=root"  
    Note:命令行的變量比playbook中的變量優先級高。
(b) 在playbook中定義變量的方法:
    vars:
    - var1: value1
    - var2: value2
變量引用:{{ variable }}

例子:

[ root@node1 ~ ]# cat installpkc.yml 
- hosts: webserver
  remote_user: root
  vars:
  - pkgname: tree
  tasks:
  - name: install package {{ pkgname }}
    yum: name={{ pkgname }} state=latest
[ root@node1 ~ ]# ansible-playbook -e "pkgname=memcached" -C installpkc.yml    #這裏在命令行定義變量

PLAY [webserver] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [172.18.25.52]
ok: [172.18.25.51]

TASK [install package memcached] ***********************************************
changed: [172.18.25.51]
changed: [172.18.25.52]

(3) 通過roles傳遞變量;

(4) Host Inventory #主機清單
Note:變量優先級低
(a) 用戶自定義變量

(i) 向不同的主機傳遞不同的變量;
                IP|HOSTNAME  varaiable=value var2=value2
例子:
[webserver]
172.18.25.51 pkgname=redis
172.18.25.52 pkgname=memcached

(ii) 向組中的主機傳遞相同的變量;
[groupname:vars]
variable=value

例子:
    [webserver]
    172.18.25.51
    172.18.25.52

    [webserver:vars]
    pkgname=redis

(b) invertory參數
用於定義ansible遠程連接目標主機時使用的參數,而非傳遞給playbook的變量;

    ansible_ssh_host
    ansible_ssh_port
    ansible_ssh_user
    ansible_ssh_pass
    ansbile_sudo_pass
    ...

例子:一種不基於密鑰的連接方法,不推薦使用。

    [webserver]
    172.18.25.51 ansible_ssh_user=root  ansible_ssh_pass=123
    172.18.25.52 ansible_ssh_user=root 
    ansible_ssh_pass=centos
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章