你需要會的ansible-playbook劇本這6種變數

老油條IT記發表於2020-09-25

 

#變數作用

#根據需求靈活修改,如:需要安裝不同版本號的服務,或進行版本升級回退等

 

1.通過vars定義變數

#1.1、定義一個變數
version: 1.1.2

#定義多個變數
vars:
  - v1: value
  - v2: value

#1.2、呼叫變數
#在{{}}中直接填寫變數名
  {{ v1 }}

 

#示例一:新增使用者

[root@k8s-master yaml]# cat a4.yml 
- hosts: k8s-node
  vars:
  - user: demo16
  tasks:
  - name: create{{user}}
    user: name={{user}}

#語法檢查
[root@k8s-master yaml]# ansible-playbook --syntax-check a4.yml 
playbook: a4.yml

#執行
[root@k8s-master yaml]# ansible-playbook a4.yml 

#檢視效果
[root@node1 ~]# id demo16
uid=1009(demo16) gid=1010(demo16) groups=1010(demo16)

 

#示例二:安裝http和ftp服務,使用變數的話可以方便後續的安裝不同版本號

#第一種寫法
[root@game yaml]# cat vars1.yml 
- hosts: k8s-node
  vars:
    - web_packge: httpd-2.4.6
    - ftp_packge: vsftpd-3.0.2

  tasks:
    - name: installed {{ web_packge }} {{ ftp_packge }}
      yum:
        name:
          - "{{ web_packge }}"
          - "{{ ftp_packge }}"
        state: present

#第二種寫法
#提示:如果要裝多個的話建議使用第一種方法,減少語句
[root@game yaml]# cat vars2.yml 
- hosts: k8s-node
  vars:
    - web_packge: httpd-2.4.6
    - ftp_packge: vsftpd-3.0.2

  tasks:
    - name: installed {{ web_packge }} Packages
      yum: name={{ web_packge }} state=present

    - name: installed {{ ftp_packge }} Packages
      yum: name={{ ftp_packge }} state=present

#進行語法檢查,然後執行
[root@game yaml]# ansible-playbook --syntax-check vars2.yml 
[root@game yaml]# ansible-playbook vars2.yml

 

2.通過定義一個變數檔案,使用playbook進行呼叫

[root@game yaml]# cat vars_public.yml 
web_packge: httpd-2.4.6
ftp_packge: vsftpd-3.0.2

#進行呼叫:使用vars_files
#提示:因為寫的檔案是在同一級目錄下,可以使用相對路徑進行呼叫檔案
[root@game yaml]# cat vars1.yml 
- hosts: k8s-node
  vars_files: ./vars_public.yml

  tasks:
    - name: installed {{ web_packge }} {{ ftp_packge }}
      yum:
        name:
          - "{{ web_packge }}"
          - "{{ ftp_packge }}"
        state: present

 

3.通過inventory主機清單進行變數定義

#第一種寫法
[root@k8s-master yaml]# tail -n 4 /etc/ansible/hosts 
[k8s-node]
192.168.86.132 user=demo13
192.168.86.133 user=demo14

[root@k8s-master yaml]# cat a3.yml 
- hosts: k8s-node
  tasks:
  - name: create{{user}}
    user: name={{user}}

#執行劇本
[root@k8s-master yaml]# ansible-playbook a3.yml

#檢視效果
[root@node1 ~]# id demo13
uid=1007(demo13) gid=1008(demo13) groups=1008(demo13)
[root@node1 ~]# id demo14
id: demo14: no such user
#node1是建立demo13,demo14是在node2建立的,所以在node1檢視的時候會顯示沒有找到這個使用者

#第二種寫法
[root@k8s-master yaml]# tail -n 8 /etc/ansible/hosts 
[k8s-node]
192.168.86.132
192.168.86.133
[k8s-node:vars]
user=demo15

[root@k8s-master yaml]# cat a3.yml 
- hosts: k8s-node
  tasks:
  - name: create{{user}}
    user: name={{user}}

#執行劇本
[root@k8s-master yaml]# ansible-playbook a3.yml 

#檢視效果
[root@node1 ~]# id demo15
uid=1008(demo15) gid=1009(demo15) groups=1009(demo15)

 

4.通過執行playbook時使用-e引數指定變數

#示例

[root@k8s-master yaml]# pwd
/etc/ansible/yaml
[root@k8s-master yaml]# cat a2.yml 
- hosts: k8s-node
  tasks:
  - name: create{{user}}
    user: name={{user}}
#檢查語法有沒有錯誤,沒有錯誤之後執行
[root@k8s-master yaml]# ansible-playbook --syntax-check a2.yml 

playbook: a2.yml
[root@k8s-master yaml]# ansible-playbook -e 'user=demo11' a2.yml 

#檢視效果
[root@node1 ~]# id demo11
uid=1006(demo11) gid=1007(demo11) groups=1007(demo11)

 

5.變數註冊register

#應用場景:把命令執行的結果存到register變數裡面,然後使用debug模組輸出相關資訊

#示例
- name: Check Http Services
  shell: netstat -untpl |grep httpd
  register: check_http_service
#提示:將shell命令執行的結果存到變數check_http_service中

- name: 
  debug:
    msg: "{{ check_http_service.stdout_lines }}"
#提示1:通過debug模組輸出資訊,如果想輸出部分內容,使用變數.方法
#提示2:debug模組更多使用可使用ansible-doc debug檢視幫助資訊

#基本步驟總結
1.使用shell執行命令
2.將執行命令的結果存到變數中
3.通過debug模組,msg方法,輸出變數所有的內容,如果想輸出部分內容,使用變數.方法

 

#例子:檢查http服務是否執行,結合when進行判斷,如果返回結果不等於0,那麼就啟動http服務

[root@game yaml]# cat regis.yml 
- hosts: k8s-server
  tasks:

  - name: Check Httpd Services
    command: netstat -untpl |grep httpd
    ignore_errors: yes
    register: check_httpd

  - name: Start Httpd
    service:
      name: httpd
      state: started
    when: check_httpd.rc != 0

 

6.ansible facts變數

主要用來採集被控制端的一些狀態指標,如:主機名,IP,記憶體、磁碟狀態等
預設情況的facts變數名已經定義好了,只需採集被控制端的資訊,然後傳遞至facts變數即可

#應用場景
1.獲取被控端主機名,生成不同的zabbix配置檔案
2.獲取被控端CPU資訊,生成不同的nginx配置檔案
3.獲取被控端記憶體狀態資訊,生成不同的memcached配置檔案

 

#示例1:獲取被控端主機名IP地址,通過debug模組輸出

[root@game yaml]# cat facts1.yml 
- hosts: k8s-server
  tasks:

  - name: Output Client Hostname IP
    debug:
      msg:
        echo Client "{{ ansible_fqdn }}" and "{{ ansible_default_ipv4.address }}"

#執行效果
[root@game yaml]# ansible-playbook --syntax facts1.yml  #語法檢查
playbook: facts1.yml
[root@game yaml]# ansible-playbook  facts1.yml #執行
TASK [Output Client Hostname IP] **********************************************************************
ok: [192.168.228.130] => {
    "msg": "echo Client \"web01\" and \"192.168.228.130\""
}
ok: [192.168.228.131] => {
    "msg": "echo Client \"web02\" and \"192.168.228.131\""
}

 

#示例二:使用facts變數安裝zabbix-agent客戶端

#1.首先準備一個zabbix_agentd.conf配置檔案,Hostname需要寫成ansible_fqdn自己識別
[root@game yaml]# pwd
/etc/ansible/yaml
[root@game yaml]# cat zabbix_agentd.conf |grep Hostname
Hostname= {{ ansible_fqdn }}

#2.編寫劇本
[root@game yaml]# cat zab-age.yml 
- hosts: k8s-server
  tasks:

  - name: Zabbix-Agent Configure
    template:
      src: ./zabbix_agentd.conf
      dest: /etc/zabbix/zabbix_agentd.conf

#3.執行劇本
#首先先檢查語法,然後接著執行
[root@game yaml]# ansible-playbook --syntax zab-age.yml 
[root@game yaml]# ansible-playbook zab-age.yml 

#4.到被控制端檢視效果
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.conf |grep Hostname
Hostname= web01
#可以看到主機名已經修改成了web01

 

相關文章