ansible

ansible簡單使用

  1. ansible配置文件要注意的幾個參數:
  2. ~]# vim /etc/ansible/ansible.cfg
    [defaults]
    # uncomment this to disable SSH key host checking
    host_key_checking = False //第一次鏈接別的機器的時候,都會出現保存密鑰指紋的提示,這裏False的意思是免去第一次鏈接出現這個麻煩的問題

    #SSH timeout
    timeout = 2 //ssh鏈接超時時長,由於是內網傳輸,因此能夠設置的小點,默認爲10s


    [ssh_connection]
    # Control the mechanism for transfering files
    # * smart = try sftp and then try scp [default]
    # * True = use scp only
    # * False = use sftp only
    scp_if_ssh = True //使用scp來傳輸


  3. 配置公鑰,以後就能夠免密登錄:
  4. [root@localhost ~]# ssh-keygen   //生成公鑰和私鑰
    [root@localhost ~]# ssh-copy-id root@172.16.9.2 //分發公鑰至對端主機上

    [root@localhost ~]# ansible 172.16.9.8 -m ping
    [WARNING]: No hosts matched, nothing to do
    當出現這種狀態時,私鑰已經發給對端了,那就是hosts文件裏沒有寫對應的ip地址,寫上就行了。

    [root@localhost ~]# cd .ssh/
    [root@localhost .ssh]# ls //在本地路徑下生成相應的文件來支持免密交互
    authorized_keys id_rsa id_rsa.pub known_hosts
    [root@localhost .ssh]# cat known_hosts
    172.16.9.4 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBYMef7fW7y5uM+vQtdQUuYyMNiY9UWNj9YMpWTZUPrE+jbUiFp3u3JnMfqBdJ9gI/1gqIrVBh6YEgeEfUrZVeM=
    172.16.9.3 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOMXVpFc5Hfu814Xz1KOfWVAIpQaX1en7uaiNpRh25JHU/sUWInI7ggCHphPg9FIx/i3GgzH7Wa+XjHjeIpx/TU=
    172.16.9.2 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPssRsKsOpds0BWjuvH272Ym9CBjqKGbQzGjKs7cdSy7hv4VRyLDT8BBY8cPlb9lvKXtqrdWd3rJ68HNIFqMLDc=
    172.16.9.1 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPBmV6HJ92KTxueEYjxQZQmbFjB4NY2/eqq5WPxkt/RiL/H7cZmoXkpWV80tyLq9vx1Uq+2Bac8n8cJXkZG/VMQ=
    [WARNING]: No hosts matched, nothing to do
    • 配置用戶組至hosts文件中php

    • ~]# vim /etc/ansible/hosts  //在最後一行你所須要管理的服務器地址
      [web] //名稱就叫web組
      172.16.9.1
      172.16.9.2
      172.16.9.3
      172.16.9.4


  5. ansible指令格式:
  6. ansible 
       
       
       
    
      
       
      [-f forks] [-m module_name] [-a args] 
     
       
    -f forks:啓動的併發線程數
    -m module_name:要使用的模塊
    -a args: 模塊特有的參數
    -C 幹跑一遍,就是測試一下


  7. setup:用於獲取主機信息,在playbooks裏常常用到的一個參數
  8. ~]# ansible 172.16.9.2 -m setup //查看某一臺主機的信息,而後從中挑選所須要關注的就好
    ~]# ansible 172.16.9.2 -m setup | grep processor
    "ansible_processor": [
    "ansible_processor_cores": 1,
    "ansible_processor_count": 1,
    "ansible_processor_threads_per_core": 1,
    "ansible_processor_vcpus": 1, //這個變量就能知道個人機器有多少個核心,也就能夠用來定義nginx的工做核心

  9. ansible的簡單模塊簡介:
    1. ping:測試用戶主機是不是通的
    2. ~]# ansible all -m ping


    3. command:在指定節點上運行相關命令:
    4. ~]# ansible web -m command -a 'ls'
      172.16.9.3 | SUCCESS | rc=0 >>
      anaconda-ks.cfg

      172.16.9.2 | SUCCESS | rc=0 >>
      172.16.9.3
      anaconda-ks.cfg

    5. shell:在指定節點上運行相關命令,可是shell支持管道符 | :
    6. ~]# ansible web -m shell -a 'useradd natasha && echo natasha | passwd --stdin natasha'
      172.16.9.3 | SUCCESS | rc=0 >>
      Changing password for user natasha.
      passwd: all authentication tokens updated successfully.

      172.16.9.2 | SUCCESS | rc=0 >>
      Changing password for user natasha.
      passwd: all authentication tokens updated successfully.

    7. copy:複製文件到遠程主機
    8. ~]# ansible web -m copy -a 'src=/etc/fstab dest=/ mode=777 backup=yes'
      ~]# ls
      -rwxrwxrwx. 1 root root 465 Jul 8 08:05 fstab
      -rw-r--r--. 1 root root 465 Jul 8 08:04 fstab.2717.2017-07-08@08:05:29~
      生成的備份文件

      ~]# ansible web -m copy -a 'content="Hello World!" dest=/world'
      將"Hello World!" 放入/world文件中,文件不存在會自動建立
      • src:要複製到遠程文件 在本地的地址,能夠是絕對路徑,也能夠是相對路徑。若是路徑是一個目錄,它將遞歸複製。在這種狀況下,若是路徑使用「/」來結尾,則只複製目錄裏的內容,若是沒有使用"/"來結尾,則包含目錄在內的整個內容所有複製,相似於rsync
      • det:必選項,要將源文件複製到的遠程主機的絕對路徑,若是源文件是一個目錄,那麼該路徑也必須是個目錄
      • content:用於替代"src",能夠直接設定指定文件的值
      • owner:傳輸過去後,所屬者
      • group:傳輸過去後,所屬組
      • mode:設定目錄和文件的權限
      • backup:在覆蓋以前將原文件備份,備份文件包含時間信息,不寫默認爲不備份

    9. cron:用於管理計劃任務包含以下選項:
    10. ~]# ansible web -m cron -a 'name="check dirs" minute="0" hour="5,2" job="ls -alh > /dev/null"'
      ~]# crontab -l
      #Ansible: check dirs
      0 5,2 * * * ls -alh > /dev/null
      • backup:對遠程主機上的原任務計劃內容修改以前作備份
      • cron_file:若是指定該選項,則會用該文件替換遠程主機上的cron.d目錄下的用戶的任務計劃
      • name:定時任務的描述
      • special_time:指定何時運行,參數:
        reboot,yearly,annually(每一年),monthly,weekly,daily,hourly
      • state:指定狀態,prsent給添加定時任務,也是默認值,absent表示刪除定時任務
      • user:以哪一個用戶的身份執行
      • job:指明運行的命令是什麼
      • minute:分
      • hour:時
      • day:日
      • week:周
      • month:月

    11. file:主要用於遠程主機上的文件操做
    12. ~]# ansible web -m file -a 'src=/fstab dest=/fstab.link state=link'
      將目標主機上的/fstab 建立一個軟連接
      ~]# ansible web -m file -a 'path=/fstab.link state=absent'
      刪除連接
      ~]# ansible web -m file -a 'path=/new.xx src=/new state=link owner=tom group=tom mode=777'
      將/new生成一個/new.xx的連接,而且屬主屬組都爲tom且權限爲777
      • force:須要在兩中狀況下強制建立軟連接,一種是源文件不存在但以後會創建的狀況下;另外一中是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no
      • group:定義文件/目錄的屬組
      • mode:定義文件/目錄的權限
      • owner:定義文件/目錄的屬主
      • path:必先項,定義文件/目錄的路徑
      • recurse:遞歸的設置文件的屬性,只對目錄有效state=directory
      • src:要被連接的源文件的路徑,只應用於state=link的狀況
      • dest:被連接到的路徑,只應用於state=link的狀況
      • state:
        • directory:若是目錄不存在,建立目錄
        • file:即便文件不存在,也不會被建立
        • link:建立軟連接
        • hard:建立硬連接
        • touch:若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間
        • absent:刪除目錄、文件或者取消連接文件

    13. hostname:修改主名稱
    14. ~]# ansible web -m hostname -a 'name=niao'
      修改web組的成員的hostname=niao
      • name:更更名稱

    15. yum:使用yum包管理器來管理軟件包
    16. ~]# ansible web -m yum -a 'name=nginx state=latest' //安裝最新版nginx
      ~]# ansible web -m yum -a 'name=nginx state=absent' //卸載nginx
      ~]# ansible test -m yum -a 'name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present' //直接下載安裝
      • config_file:yum的配置文件
      • disable_gpg_check:關閉gpg_check
      • disablerepo:不啓用某個源
      • enablerepo:啓用某個源
      • name:要進行操做的軟件包的名字,也能夠傳遞一個url或者一個本地的rpm包的路徑
      • state:
        • present:安裝,默認
        • latest:安裝最新版
        • absent:卸載程序包

    17. service:用於管理服務
    18. ~]# ansible web -m service -a 'name=nginx state=started enabled=yes runlevel=2345 ' //開啓nginx服務,而且開機啓動,運行級別2345
      ~]# ansible web -m service -a 'name=network state=restarted args=eth0'
      //重啓網卡

      • arguments:給命令提供一些選項
      • enabled:是否開機啓動 yes|no
      • name:必選項,服務名稱
      • pattern:定義一個模式,若是經過status指令來查看服務的狀態時,沒有響應,就會經過ps指令在進程中根據該模式進行查找,若是匹配到,則認爲該服務依然在運行
      • runlevel:運行級別
      • sleep:若是執行了restarted,則在stop和start之間沉睡幾秒鐘
      • state:對當前服務執行啓動,中止,重啓,從新加載等操做(started,stopped,restarted,reloaded)

    19. user,group:useradd,userdel,usermod,groupadd,groupdel,groupmod六個指令
    20. ~]# ansible web -m user -a 'name=jerry password="$1$9DgSSTxd$zJE2FHK1rxtyQhkzeHzk50"'  //建立用記,並給定密碼
      ~]#
      ~]# echo "jerry" | openssl passwd -1 -salt $(< /dev/urandom tr -dc '[:alnum:]' | head -c 32) -stdin //md5加密,若是不生成密碼,而是直接在ansible中寫的話,密碼會以明文的方式記錄在passwd文件中
      $1$9DgSSTxd$zJE2FHK1rxtyQhkzeHzk50

      ~]# ansible web -m user -a 'name=josn uid=10000 groups=tom,jerry shell=/bin/zsh '
      ~]# ansible web -m user -a 'name=jerry state=absent remove=yes' //刪除用戶的同時 ,刪除用記家目錄
      • comment:用戶的描述信息
      • home:指定用戶的家目錄,須要與createhome配合使用
      • groups:指定用戶的屬組
      • uid:指定用的uid
      • password:指定用戶的密碼
      • name:指定用戶名
      • createhome:是否建立家目錄
      • system:是否爲系統用戶
      • remove:當state=absent時,remove=yes則表示連同家目錄一塊兒刪除,等價於userdel --force
      • state:是建立仍是刪除,不指定爲建立,absent表示刪除
      • shell:指定用戶的shell環境
      • password:指定用記密碼
      • update_password:更新用戶密碼

    21. script:腳本模塊
    22. ~]# ansible web -m script -a '/root/a.sh' //將本地的腳本在別的主機上執行
      
      • creates:一個文件名,當這個文件存在,則該命令不執行
      • free_form:本地腳本路徑
      • removes:一個文件名,這個文件不存在,則該命令不執行

    23. synchronize:使用rsync同步文件
    24. ~]# ansible 172.16.9.2 -m synchronize -a 'mode=pull src=/ming dest=/' 
      從9.2的主機/ming目錄拉取到本機上
      ~]# ansible 172.16.9.2 -m synchronize -a ' src=/ming dest=/ '
      將ming目錄推送至9.2的主機上

      • archive:歸檔,至關於同時開啓recursive(遞歸),links,perms,itmes,owner,group,-D選項都爲yes,默認該選項爲開啓
      • checksum:跳過檢測sum值,默認關閉
      • compress:是不開啓壓縮,默認開啓
      • copy_links:複製連接文件,默認爲no,注意後面還有一個links參數
      • delete:刪除不存在的文件,默認爲no
      • dest:目錄路徑
      • dest_prot:默認爲22,ssh協議
      • mode:push和pull模塊,push模塊的話,通常用於從本機向遠程主機上傳文件,pull模式用於從遠程主機上取文件

  10. ansible-palybook:
    1. 首先以"---"3個減號形如,且須要頂行寫
    2. 使用#註釋代碼
    3. 縮進必須統一,不能空格和tab混用
    4. 縮進的級別也必須一致,一樣的縮進表明一樣的級別
    5. 區別大小寫
    6. 使用:分隔,換行寫須要以-分隔
    7. 一個完整的代碼塊功能須要最少元素包括name:task
    ~]# vim nginx.yml
    ---
    #This is admin nginx.

    - hosts: web
    remote_user: root
    tasks:
    - name: install nginx
    yum: name=nginx state=latest //一個命令對應一個name

    - name: start nginx
    command: systemctl start nginx

    - name: ever nginx
    command: systemctl enable nginx

  11. playbook語法及示例:
    1. playbook核心元素:
      • hosts:運行指定任務的目標主機
      • tasks:任務列表
      • varniables:變量
      • tempaltes:模版
      • handlers:由特定條件觸發的任務,監控資源改變時纔會觸發改變
      • roles:playbook按固定目錄結構組成
    2. 示例1:
    3. ---

      - hosts: web //操做的主機組,在/etc/ansible/hosts中定義
      remote_user: root //操做的用戶
      # gather_facts: No #禁止ansible收集setup信息,默認是開啓的,只有是開啓的,才能判斷when條件
      tasks: //任務
      - name: install nginx
      yum: name=nginx state=latest
      tags: install //打標記,能夠單獨執行

      - name: 9.3 start nignx //任務描述
      service: name=nginx state=restarted //調用ansible的service模塊重啓nginx
      when: ansible_hostname == "dai" //條件判斷,符合就執行service 模塊操做,可用and或or。可以使用ansible 172.16.9.3 -m setup 就能夠獲取整個主機的全部信息
      tags: restart nginx
      ~]# ansible-playbook --tags="restart nginx" setup.yml //執行playbook中指定的tags
      ~]# ansible-playbook --skip-tags="install" setup.yml //也能夠跳過tags

    4. handler:
      • 用於當關注的資源發生變化時採起必定的操做。
      • "notify"這個action可用於在每一個play的最後被觸發這樣能夠避免屢次有改變發生時每次都執行指定的操做取而代之僅在全部的變化發生完成後一次性地執行指定操做
      • 在notify中列出的操做稱爲handler也即notify中調用handler中定義的操做
      • 注意:在notify中定義內容必定要和tasks中定義的- name內容同樣,這樣才能達到 觸發的效果,不然會不生效java

      ---
      #This is admin nginx.


      - hosts: web
      remote_user: root
      vars:
      - filename: "nginx.conf.j2"
      tasks:

      - name: deliver config
      template: src={{ filename }} dest=/etc/nginx/nginx.conf //用的是模塊,且調用兩次變量,一次是本地filename,每二次是/etc/ansible/hosts中的web_ports
      notify: restart nginx //要和handler中的name相同

      handlers:
      - name: restart nginx
      service: name=nginx state=restarted


      ~]# vim /etc/ansible/hosts
      ...
      [web:vars] //某個組中的變量,若是不在這定義變量,也能夠執行命令的時候跟上 -e 選項在賦值也是能夠的,而且在命令行中優先級高
      web_ports=10000 //給變量賦值
      ..

      ~]# cp /etc/nginx/nginx.conf /nginx.conf.j2
      ~]# vim nginx.conf.j2 //ansible中模版文件要以.j2格式結尾,才能使用
      ...
      worker_processes {{ ansible_processor_vcpus }}; //這個值是自動去操做的主機上獲取相應的參數來設定的,
      ...
      listen {{ web_ports+1 }} default_server; //調用變量,變量要用{{ }},也可以使用各種運算符
      ...

    5. template:模版for,if,when(上面的示例中有演示)語句
    6. ~]# vim nginx.conf.j2      //在http中添加for循環

      {% for vhost in xiaoniao %} //xiaoniao是數組,要在yml文件中定義,vhost是變量
      server {
      {% if http_port is defined %} //條件判斷,http_port有沒定義變量值,有的話就替換該值,沒有就該行
      listen {{ http_port }};
      {% endif %} //結束條件判斷
      server_name {{ vhost }}.xiaoniao.com; //每次都引用
      root /web;
      location / {
      }
      }
      {% endfor%} //結束循環
      若是此處的vhost變量是ip地址的話,正常的賦值是不成功的,必須加上「[]」才行,由於其中有點號
      [172.16.9.1]


      } //這個括號是http的


      ~]# vim template.yml
      ---
      - hosts: web
      remote_user: root
      vars: //在語法中添加變量的成員
      - xiaoniao:
      - www
      - new
      - girl
      - photo
      - http_port: "1000" //定義條件判斷的值,也可在hosts中定義變量

      tasks:
      - name: template config
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
      notify: restart nginx
      handlers:
      - name: restart nginx
      service: name=nginx state=restarted

      若是此處的vhost變量是ip地址的話,正常的賦值是不成功的,必須加上「[]」才行,由於其中有點號
      [172.16.9.1]


    7. 迭代with_items:重複執行的任務,對迭代項的引用,固定變量名爲item,然後在task中使用with_items給定迭代的元素列表
    8. ---
      - hosts: web
      remote_user: root
      tasks:
      - name: install app
      yum: name={{ item }} state=present //固定的變量名
      with_items: //元素列表
      - httpd
      - php

      with_items字典:linux

      ---
      - hosts: web
      remote_user: root
      tasks:
      - name: add user
      user: name={{ item.name }} groups={{ item.group }} //字典功能,可有多個值
      with_items:
      - { name: "niao" , group: "natasha" } //爲一組
      - { name: "xiao" , group: "root"}




  12. roles應用
    1. Roles用於層次性,結構化地組織playbook,roles可以根據層次型結構自動裝載變量文件、tasks以及handlers等。要使用roles只須要在playbook中使用include指令便可。簡單來說,roles就是經過分別將變量、文件、任務、模板及處理器放置於單獨的目錄中並能夠便捷地include他們的一種機制,角色通常用於主機構建服務的場景中,但也能夠是用於構建守護進程等場景中。nginx

    2. 目錄簡介:
    3. [root@localhost ansible]# tree roles/
      roles/
      ├── httpd //服務名稱,直接用include調用
      │   ├── default //爲當前角色設定默認變量時使用此目錄
      │   ├── files //存放由copy或script等模塊調用的文件
      │   ├── handlers //此目錄中應當包含一個main.yml,用於定義此角色用到的和handler;也可包含其它文件
      │   ├── meta //應當包含一個main.yml,用於定義此角色的特殊設定及其依賴關係
      │   ├── tasks //至少包含一個名爲main.yml的文件,其定義了此角色的任務列表;此文件可使用include包含其它的位於此目錄中的task文件
      │   ├── templates //template模塊會自動在此目錄中尋找Jinja2模板文件
      │   └── vars //應當包含一個main.yml文件,用於定義此角色用到的變量


    4. 實驗安裝jdk:
    5. 首先提供jdk的rpm包文件及環境配置文件:
    6. ~]# mkdir -pv /etc/ansible/roles/jdk/{vars,templates,handlers,meta,default,tasks,files}
      ~]# cd /etc/ansible/roles/jdk/
      ~]# cp jdk-7u79-linux-x64.rpm /etc/ansible/roles/jdk/files/
      ~]# vim files/java.sh
      exprot JAVA_HOME=/usr/java/latest
      export PATH=$JAVA_HOME/bin:$PATH


    7. 文件提供好後,就能夠寫tasks了:
    8. ~]# vim tasks/main.yml
      - name: copy jdk.rpm file
      copy: src=jdk-7u79-linux-x64.rpm dest=/

      - name: install jdk
      shell: yum -y install /jdk-7u79-linux-x64.rpm

      - name: provides jdk.sh
      copy: src=java.sh dest=/etc/profile.d/java.sh
      tags: jdksh

      //只要是提供文件的,最好都給個tags,以避免下次要從新執行所有web


      notify:
      - source /etc/profile.d/java.sh //當提供的文件出現改動時,就能夠觸發條件,在去讀取一下;因此就須要在handlers下提供配置文件

      - name: read /etc/profile.d/java.sh //提供完文件要從新讀取環境變量
      shell: source /etc/profile.d/java.sh

    9. 提供handlers的配置文件:
    10. - name: source /etc/profile.d/java.sh     //這裏的名稱要和notify一致,方纔能匹配到

      shell: source /etc/profile.d/java.sh



    11. 在roles同級中建立site.yml文件:


    12. ~]# vim /etc/ansible/site.yml
      ~]# cat ../../site.yml
      - hosts: jdk //對哪一個組進行工做
      remote_user: root
      roles: //哪一個角色
      - jdk //jdk目錄

      ~]# vim /etc/anisble/hosts
      ...
      [jdk] //給這四個主機定義爲一個組
      172.16.9.1
      172.16.9.2
      172.16.9.3
      172.16.9.4

    13. 執行操做:
    14. ~]# ansible-playbook site.yml
      PLAY [jdk] *********************************************************************

      TASK [setup] *******************************************************************
      ok: [172.16.9.1]
      ok: [172.16.9.4]
      ok: [172.16.9.3]
      ok: [172.16.9.2]

      TASK [jdk : install jdk] *******************************************************
      changed: [172.16.9.4]
      [WARNING]: Consider using yum module rather than running yum //這個報錯,只是想提示,用yum最好,可是我就是要用shell模塊

      changed: [172.16.9.2]
      changed: [172.16.9.3]
      changed: [172.16.9.1]

      TASK [jdk : provides jdk.sh] ***************************************************
      changed: [172.16.9.2]
      changed: [172.16.9.3]
      changed: [172.16.9.4]
      changed: [172.16.9.1]

      TASK [jdk : read /etc/profile.d/java.sh] ***************************************
      changed: [172.16.9.2]
      changed: [172.16.9.3]
      changed: [172.16.9.4]
      changed: [172.16.9.1]

      RUNNING HANDLER [jdk : source /etc/profile.d/java.sh] **************************
      changed: [172.16.9.3]
      changed: [172.16.9.4]
      changed: [172.16.9.2]
      changed: [172.16.9.1]

      PLAY RECAP *********************************************************************
      172.16.9.1 : ok=5 changed=4 unreachable=0 failed=0
      172.16.9.2 : ok=5 changed=4 unreachable=0 failed=0
      172.16.9.3 : ok=5 changed=4 unreachable=0 failed=0
      172.16.9.4 : ok=5 changed=4 unreachable=0 failed=0


    15. 最後來查看是否安裝成功且環境變量也成功讀取了:
    16. ~]# echo $JAVA_HOME
      //這裏的JAVA_HOME沒有讀出來,不知道爲何,我用的source啊,待我在查查資料,若是有朋友知道,也能夠告訴我一下
      ~]# echo $PATH
      /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin //PATH環境變量卻是讀出來了,真是奇怪了

      可是,我重開一個會話,JAVA_HOME變量就能夠讀出來了shell


      ~]# echo $JAVA_HOME
      /usr/java/latest //想不明白

    17. 忽然想起來,個人CLASSPATH環境變量尚未設:
    18. vim /etc/ansible/roles/jdk/files/java.sh
      ...
      export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar //添加一行

      還好個人tasks中傳送文件那裏作了tags和notify,就是爲了等這個機會呢
      ~]# ansible-playbook --tags="jdksh" /etc/ansible/site.yml //此次操做只發送了java.sh而且重讀了一下,多方便
      ~]# ansible-playbook --tags="jdksh" /etc/ansible/site.yml

    總結就到這了,有什麼問題,歡迎討論,知無不言。vim

相關文章
相關標籤/搜索