ansible經常使用的定義變量方式和變量註冊facts緩存和template的使用

回顧

可使用自定義主機組的方式定義hosts,這樣能夠減小重複任務的代碼(不推薦使用,由於自定義主機組的話,劇本中的all將沒法使用)
ansible和saltstack都要使用yml語法,yml語法中最好使用2468空格
service和systemd啓動服務,不支持列表的形式(只能用循環了)

[root@m01 ~]# hostname
m01
[root@m01 ~]# hostname -I
10.0.0.61 172.16.1.61 
[root@m01 ~]# hostnamectl set-hostname www.m01.com
[root@www ~]# 		#顯示不完整主機名

"{{ ansible_fqdn }}" 不管是自定義變量仍是系統變量的調用,寫到劇本中的路徑裏的話不要加引號,單獨的調用須要加引號

變量自定義

1.經過命令行進行變量定義
2.在play文件中進行變量定義
3.經過Inventory主機信息文件中進行變量定義php

變量優先級:命令行 > playbook文件 > Inventory文件html

playbook中vars定義變量java

playbook變量能夠經過多種方式進行定義,最簡單的方式就是在playbook的開頭經過vars進行定義。(以列表或者ad-hoc的方式定義變量)python

#方法一:
- hosts: web_group
  vars:
    packages:
      - httpd
      - mariadb-server
      - php
      - php-mysql
      - php-pdo
  tasks:       
  - name: Install httpd  mariadb php Server
    yum:
      name: "{{ packages }}"

#方法二:(#name不支持列表!!!)
- hosts: web_group
  vars:
    - web_server: httpd
    - db_server: mariadb-server
    - php_server:
      - php
      - php-mysql
      - php-pdo
   tasks:
   - name: Install httpd  mariadb php Server
     yum:
       name:
         - "{{ web_server }}"
         - "{{ db_server }}"
         - "{{ php_server }}"
 
# "{{ php_server }}" ,ansible中裏面空格加不加都行,saltstack裏面必須加空格,可是引號必需要加
#變量列表只能在支持列表的模塊中使用

#file模塊不能使用變量列表
[root@m01 ~]# vim ansible/cs.yml
- hosts: web01
  vars:
    dir: a
  tasks:
  - name: create dir
    file:
      path: /root/{{ dir }}
      state: directory

使用vars_file定義變量mysql

剛纔咱們學到在playbook中使用vars定義變量,有一個缺陷,就是其餘的play沒法使用該變量。因此咱們能夠採起第二種定義變量的方式,在vars_file中定義變量。nginx

#定義階段
[root@m01 ~]# vim /vars/vars1.yml
web_server: httpd
[root@m01 ~]# vim /vars/vars2.yml
db_server: mariadb-server
#或者以列表形式定義
web_server:
  - tree
  - unzip

#調用階段
- hosts: web_group
  vars_files: /root/vars1.yml
  tasks:
  - name: Install httpd  mariadb php Server
    yum:
      name: "{{ web_server }}"

#調用階段(name儘可能不要使用列表項)
- hosts: web_group
  vars_file: 
    - /root/vars1.yml
    - /root/vars2.yml
  tasks:
  - name: Install httpd  mariadb php Server
    yum:
      name:
        - "{{ web_server }}"
        - "{{ db_server }}"

#獲取Ansible內置變量(內外變量結合)
- hosts: web_group
  vars:
    - remote_ip: "{{ ansible_default_ipv4['address'] }}"
    - remote_hostname: "{{ ansible_fqdn }}"
  tasks:
    - name: Touch IP File
      file:
        path: /root/{{ remote_ip }}
        state: touch

    - name: Touch Hostname File
      file:
        path: /root/{{ remote_hostname }}
        state: touch

在Inventory中定義變量web

注意:在Inventory中定義變量,主機的變量要高於主機組的變量,因此該方法不推薦使用,容易將環境弄亂。(主機變量在動做中調用,主機組變量在hosts中調用)sql

#定義階段
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8

#主機的定義變量
[web_group:vars]
web_server=httpd
index_file=index.html

#主機組的定義變量
[rsync_server:children]
web_group
backup_group

#調用階段
- hosts: web_group
  tasks:
  - name: Install httpd Server
    yum:
      name: "{{ web_server }}"
  - name: Create Index File
    file:
      path: /tmp/{{ index_file }}
      state: touch

官方推薦變量定義shell

以前的幾種變量定義都不是很好用,比較好用的是在Ansible項目目錄下建立兩個變量目錄:vim

host_vars :優先級高,目錄名和目錄位置是固定的(項目目錄下)
group_vars :優先級低
切記,目錄名字必定要一致,不能作任何修改。

執行的yml文件在哪,哪就是該yml文件的項目目錄

1.主機組定義變量,對某組來講能夠調用

#定義階段
[root@m01 ~]# mkdir group_vars

#切記定義變量所在的文件必須以組名爲文件名(組名是主機組變量調用的令牌),包含主機變量
#組名必須是主機清單中的標籤名
[root@m01 ~]# vim /root/group_vars/web_group
web_server: httpd   (#名值對)

#調用階段
- hosts: web_group
  tasks:
  - name: Install httpd Server
    yum:
      name: "{{ web_server }}"

若是我想要全部組都能使用變量,該如何作?

2.主機定義變量,對某主機來講,能夠調用

#定義階段
[root@m01 ~]# mkdir host_vars

#切記定義變量的文件必須以主機名爲文件名
[root@m01 ~]# vim /root/host_vars/web01
web_server: nginx

#調用階段
- hosts: web01
  tasks:
  - name: Install httpd Server
    yum:
      name: "{{ web_server }}"

命令行定義變量(優先級最高)

經過命令行覆蓋變量,Inventory的變量會被playbook文件中覆蓋,這兩種方式的變量都會被命令行直接指定變量所覆蓋,使用--extra-vars或者-e設置變量

#調用
[root@m01 ~]# vim test.yml
- hosts: web_group
  tasks:
  - name: Install httpd Server
    yum:
      name: "{{ web_server }}"

#定義階段
[root@m01 ~]# ansible-playbook test.yml -e "web_server=vsftpd"
[root@m01 ~]# vim test.yml
- hosts: web_group
  tasks:
  - name: Install httpd Server
    yum:
      name:
        - "{{ web_server }}"
        - "{{ db_server }}"

#定義階段
[root@m01 ~]# ansible-playbook test.yml -e "web_server=vsftpd" -e "db_server=mariadb-server"

變量優先級測試

[root@m01 ~]# vim touch_file.yml
- hosts: web_group
  vars:
    filename: vars			#2
  vars_files:
    - ./vars1.yml			#1
  tasks:
    - name: Touch vars File
      file:
        path: /root/{{ filename }}		#不能帶引號
        state: directory

#定義vars_files
[root@m01 ~]# vim vars1.yml   
filename: vars_files

#定義group_vars中的web_group			#3
[root@m01 ~]# vim group_vars/web_group
filename: group_vars_web_group

#定義host_vars中的web01
[root@m01 ~]# vim host_vars/web01		#4
filename: host_vars

#定義group_vars中的all
[root@m01 ~]# vim group_vars/all		
filename: group_vars_all

#測試命令行
[root@m01 ~]# ansible-playbook touch_file.yml -e "filename=vars_command"

#測試全部(依次刪除劇本中同一變量的指定)
[root@m01 ~]# ansible-playbook touch_file.yml

變量註冊

爲何要學變量註冊?

absible的模塊在運行以後,其實都會返回一些result結果,就像是執行腳本,咱們有的時候須要腳本給咱們一些return返回值,咱們才知道,上一步是否能夠執行成功

可是...默認狀況下,ansibleresult並不會顯示出來,因此,咱們能夠把這些返回值存儲到變量中,這樣咱們就能經過調用對應的變量名,從而獲取到這些result

這種將模塊的返回值,寫入到變量中的方法被稱爲變量註冊

那麼咋樣將返回值註冊到變量,以下一個playbook示例:

#編輯劇本
[root@m01 ~]# vim register.yml
- hosts: web_group
  tasks:
    - name: Test Register Vars
      shell: "ls -l /"

#查看執行結果
[root@m01 ~]# ansible-playbook register.yml

如上執行結果可見,當咱們使用shell模塊執行ls -l /時,ansible給咱們返回的只有changed咱們沒法看到執行以後的結果,因此此時咱們須要使用到變量註冊

playbook以下:

register:註冊

#編輯playbook
[root@m01 ~]# vim register.yml
- hosts: web_group
  tasks:
    - name: Test Register Vars
      shell: "ls -l /"
      register: list_dir			#註冊變量

    - name: Return Result
      debug:  var=result verbosity=0		#調試輸出的結果
        msg: "{{ list_dir }}"			#輸出

# debug 調試模塊,用於在調試中輸出信息 經常使用參數: msg:調試輸出的消息 var:將某個任務執行的輸出做爲變量傳遞給debug模塊,debug會直接將其打印輸出 verbosity:debug的級別(默認是0級,所有顯示)

#查看執行結果
[root@m01 ~]# ansible-playbook register.yml

#只輸出本身想要的內容
[root@m01 ~]# vim register.yml
- hosts: web_group
  tasks:
    - name: Test Register Vars
      shell: "ls -l /"
      register: list_dir

    - name: Return Result
      debug:
        msg: "{{ list_dir.stdout_lines }}"
        #msg: "{{ list_dir['stdout_lines'] }}" 
        
#查看結果
[root@m01 ~]# ansible-playbook register.yml


#debug模塊經常使用參數
msg:            #調試輸出的消息
var:            #將某個任務執行的輸出做爲變量傳遞給debug模塊,debug會直接將其打印輸出
verbosity:      #debug的級別(默認是0級,所有顯示)
debug 			#偶爾調試

變量註冊,忽略錯誤的使用

[root@www ~]# vim cs.yml 
- hosts: web01
  tasks:
    - name: Test Register Vars
      shell: "ls -l /etc/nginx"
      #註冊變量
      register: list_dir
      #忽略錯誤
      ignore_errors: yes

#輸出shell指定的信息
    - name: return
      debug:
        msg: "{{ list_dir.stdout_lines }}"
    
    #解壓
    - name: jieya nginx.pkg
      unarchive:
        src: /root/nginx_php.tar.gz
        dest: /root
      when: list_dir.rc != 0        #經過變量的註冊,判斷shell的執行結果(rc)

    #卸載
    - name: shanchu
      shell: yum remove -y php-common
      #忽略錯誤
      ignore_errors: yes
      
    #安裝
    - name: install
      shell: "cd /root && yum localinstall -y *rpm"

ignore_errors的做用就是忽略錯誤步驟,繼續執行下一步(錯誤輸出仍是會輸出)

層級定義變量

像是本身作字典,使用 [' '] 或者 . 調用下一級

#編輯變量文件
[root@m01 ~]# vim vars_file.yml
lamp:
  framework:
    web_package: httpd
    db_package: mariadb-server
    php_package: php

lnmp:
  framework:
    web_package: nginx
    db_package: mysql
    php_package: php

lnmt:
  framework:
    web_package: nginx
    db_package: mysql
    java_package: tomcat

#編輯playbook文件
[root@m01 ~]# vim test.yml
- hosts: web_group
  vars_files: ./vars_file.yml
  tasks:
    - name: Install LAMP httpd
      yum:
        name: "{{ lamp.framework.web_package }}"

    - name: Install LAMP mariadb-server
      yum:
        name: "{{ lamp.framework.db_package }}"

    - name: Install LAMP php
      yum:
        name: "{{ lamp.framework.php_package }}"
        
#官方推薦寫法
[root@m01 ~]# vim test.yml
- hosts: web_group
  vars_files: ./vars_file.yml
  tasks:
    - name: Install LAMP httpd
      yum:
        name: "{{ lamp['framework']['web_package'] }}"

    - name: Install LAMP mariadb-server
      yum:
        name: "{{ lamp['framework']['db_package'] }}"

    - name: Install LAMP php
      yum:
        name: "{{ lamp['framework']['php_package'] }}"

#執行playbook
[root@m01 ~]# ansible-playbook test.yml

#層級調用變量也只能調用一次

ansible內置變量----facts緩存

Ansible facts是在被管理主機上經過Ansible自動採集發現的變量。facts包含每臺特定的主機信息。好比:被控端的主機名、IP地址、系統版本、CPU數量、內存狀態、磁盤狀態等等。


facts使用場景

1.經過facts緩存檢查CPU,來生成對應的nginx配置文件
2.經過facts緩存檢查主機名,生成不一樣的zabbix配置文件
3.經過facts緩存檢索物理機的內存大小來生成不通的mysql配置文件

綜上所述的Ansible facts相似於saltstack中的grains對於作自動化的小夥伴是很是有用滴。


facts基本用法

#編輯
[root@m01 ~]# vim facts.yml
- hosts: web_group
  tasks:
    - name: Get Host Info
      debug:
        msg: >
          Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"

#執行
[root@m01 ~]# ansible-playbook facts.yml

#msg: > 能夠識別中文,打印出變量

關閉facts

[root@m01 ~]# vim facts.yml
- hosts: web_group
  gather_facts: no			 #關閉信息採集
  tasks:
  
#通常在用不到變量的劇本中才會使用,提升生產效率

template的使用

facts生成zabbix配置文件,生成nginx的配置文件,生成saltstack配置文件

- hosts: web_group
  tasks:
    - name: copy zabbix agent conf
      template:
        src: ./zabbix_agentd.conf
        dest: /tmp/zabbix_agentd.conf
        
#template模塊,能夠將劇本中的主機信息被 腳本中的變量調用 ,語法和copy相似 
#該模塊適用於作配置文件的修改

facts生成mysql配置文件

- hosts: db_group
  tasks:
    - name: Install mysql server
      yum:
        name: mariadb-server
        state: present

    - name: copy mysql  conf
      template:
        src: ./my.cnf
        dest: /etc/my.cnf


[root@m01 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr
datadir=/var/lib/mysql/
socket=/var/lib/mysql/mysql.sock
log_error=/var/log/mariadb/mariadb.log
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}		
#ansible變量支持計算

需求:使用ansible在web機器建立「/backup/web01_172.16.1.31_2020-6-11」目錄

#劇本中支持顯示子信息
[root@www ~]# vim bl.yml 
- hosts: web01
  tasks:
    - name: ip
      file:
        path: /backup/{{ ansible_fqdn }}_{{ ansible_default_ipv4['address'] }}_{{ ansible_date_time['date'] }}
        state: directory
        recurse: yes
[root@www ~]# ansible web01 -m setup -a 'filter=ansible_default_ipv4' 
web01 | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "10.0.0.7", 
            "alias": "eth0", 
            "broadcast": "10.0.0.255", 
            "gateway": "10.0.0.2", 
            "interface": "eth0", 
            "macaddress": "00:0c:29:6e:25:1b", 
            "mtu": 1500, 
            "netmask": "255.255.255.0", 
            "network": "10.0.0.0", 
            "type": "ether"
        }, 
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}

#命令行不支持顯示子信息
[root@www ~]# ansible web01 -m setup -a 'filter=ansible_default_ipv4.address' 
web01 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false
}
相關文章
相關標籤/搜索