天天看點

ansible入門詳解---值得收藏

文章目錄

  • ​​0、概述​​
  • ​​`優點`​​
  • ​​一、ansible用法​​
  • ​​`1.1.安裝ansible`​​
  • ​​`1.2.ansible參數選項`​​
  • ​​二、相關檔案介紹​​
  • ​​`2.1.配置檔案`​​
  • ​​2.1.1./etc/ansible/ansible.cfg解釋​​
  • ​​2.1.2./etc/ansible/hosts格式​​
  • ​​`2.2.可執行檔案`​​
  • ​​三、配置基于root使用者Key的驗證​​
  • ​​四、ansible指令執行過程​​
  • ​​五、執行狀态​​
  • ​​六、常用子產品​​
  • ​​七、ansible-galaxy​​
  • ​​八、ansible-vault​​
  • ​​九、ansible-playbook​​
  • ​​`9.1.核心元素`​​
  • ​​`9.2.playbook格式`​​
  • ​​`9.3.常用技巧`​​
  • ​​1、ignore_errors忽略錯誤資訊​​
  • ​​2、拷貝檔案使用相對路徑​​
  • ​​3、handlers+notify解決修改配置檔案不生效的問題​​
  • ​​4、tags打标簽​​
  • ​​5、when條件判斷​​
  • ​​6、疊代:with_items​​
  • ​​7、become提權​​
  • ​​8、lineinfile(類似于sed)​​
  • ​​9、register注冊變量,傳回shell腳本執行結果​​
  • ​​10、failed_when關鍵字​​
  • ​​判斷作業系統​​
  • ​​比對多個條件​​
  • ​​11、任務委派功能delegate_to​​
  • ​​12、本地操作功能local_action或connection​​
  • ​​13、判斷檔案是否存在​​
  • ​​14、判斷指定路徑是否為一個目錄​​
  • ​​15、include​​
  • ​​16、block子產品​​
  • ​​17、pre_tasks在roles之前執行​​
  • ​​18、set_fact設定變量​​
  • ​​19、validate: 在複制之前執行檢測,如果要引用目标檔案名,則使用 %s​​
  • ​​`9.4.使用變量`​​
  • ​​a.系統facts收集​​
  • ​​b.在yaml檔案中通過vars定義​​
  • ​​c.在/etc/ansible/group_vars/all定義[推薦使用]​​
  • ​​d.在/etc/ansible/hosts中定義​​
  • ​​e.通過ansible-playbook -e傳入變量,優先級高于/etc/ansible/hosts【不推薦】​​
  • ​​`9.5.常用指令`​​
  • ​​`9.6.模闆templates`​​
  • ​​1、簡單運算​​
  • ​​2、for循環+if判斷​​
  • ​​3、在模闆中擷取主機組的IP​​
  • ​​4、在模闆中定義清單​​
  • ​​5、擷取主機組數量​​
  • ​​十、roles​​
  • ​​`10.1.流程圖`​​
  • ​​`10.2.各目錄作用`​​
  • ​​`10.3.示例`​​
  • ​​`10.4.在main.yml調用其它角色的任務`​​
  • ​​`10.5.給角色定義标簽`​​
  • ​​`10.6.委托其它機器執行角色`​​

參考視訊:https://www.bilibili.com/video/BV18t411f7CN?p=5

參考文章:

​​一文掌握 Ansible 自動化運維​​

0、概述

原則:去中心化、“簡單就是一切”

第一個版本0.0.1,釋出于2012年3月9日,作者Michael DeHaan

​優點​

批量管理(支援上千台)、幂等性、模闆、子產品化、無服務端和用戶端(去中心化)

一、ansible用法

​1.1.安裝ansible​

yum -y install epel-release
yum -y install ansible      

​1.2.ansible參數選項​

選項 解釋
-m 指定要執行的子產品,預設為command
-a 指定子產品的參數
-u ssh連接配接的使用者名,預設用root,ansible.cfg中可以配置
-b,–become 相當于sudo
–become-user sudo到哪個使用者,預設為root
-k 提示輸入sudo密碼,當不是NOPASSWD模式時使用
-C 隻是測試一下會改變什麼内容,不會真正去執行
-f fork多少程序并發處理,預設為5個
-i 指定hosts檔案路徑,預設default=/etc/ansible/hosts
–list-host 隻列印有哪些主機會執行這個指令,不會實際執行
–private-key 私鑰路徑
-T ssh連接配接逾時時間,預設是10秒
-t 日志輸出到該目錄,日志檔案名以主機命名
-vvv 顯示詳細日志

舉例:

ansible all --list-host   #列出inventory定義的所有主機
ansible all -m ping -b --become-user root #sudo到root執行ping子產品      

二、相關檔案介紹

​2.1.配置檔案​

/etc/ansible/ansible.cfg    #主配置檔案
/etc/ansible/hosts        #主機清單
/etc/ansible/roles/       #存放角色目錄      

2.1.1./etc/ansible/ansible.cfg解釋

Ansible查找ansible.cfg檔案的位置及順序

1)ANSIBLE_CONFIG:首先,Ansible指令會檢查環境變量,及這個環境變量将指向的配置檔案

2)./ansible.cfg:其次,将會檢查目前目錄下的ansible.cfg配置檔案

3)~/.ansible.cfg:再次,将會檢查目前使用者home目錄下的.ansible.cfg配置檔案

4)/etc/ansible/ansible.cfg:最後,将會檢查在用軟體包管理工具安裝Ansible時自動産生的配置檔案

inventory      = /etc/ansible/hosts   #存放主機清單檔案
forks          = 5            #并發執行數量
poll_interval  = 15           #回頻率或輪詢間隔時間,機關s
sudo_user      = root         #遠端主機sudo到什麼使用者,預設為root
ask_sudo_pass = True          #sudo時是否需要輸入密碼
ask_pass      = True          #執行ansible-playbook是否需要密碼.預設為no
transport      = smart
remote_port    = 22           #遠端主機端口号
module_lang    = C            #子產品和系統之間通信的語言
module_set_locale = False
roles_path    = /etc/ansible/roles      #預設下載下傳的Roles存放的目錄
host_key_checking = False           #首次連接配接是否需要檢查key認證。設定為False,第一次連接配接遠端主機不需要輸入yes
timeout = 10                    #SSH逾時時間
remote_user = root              #使用/usr/bin/ansible-playbook連結的預設使用者名,預設使用目前使用者名稱
log_path = /var/log/ansible.log       #日志檔案存放路徑
executable = /bin/sh              #執行的shell環境,使用者shell子產品
jinja2_extensions = jinja2.ext.do,jinja2.ext.i18    #允許開啟jinja2擴充子產品
private_key_file = /path/to/file      #私鑰檔案存儲位置
system_warnings = True            #禁用系統運作Ansible潛在問題警告
deprecation_warnings = True         #PlayBook輸出禁用“不建議使用”警告
nocolor = 1                   #輸出帶上顔色差別,0表示開啟,1表示關閉
pipelining = False              #是否開啟pipe SSH通道優化
host_key_checking = False       #配置ssh免密時不提示yes/no
gathering = explicit          #不收集系統資訊,預設收集
[privilege_escalation]
become=True               #是否sudo
become_method=sudo            #sudo方式
become_user=root            #sudo後變為root使用者
become_ask_pass=False         #sudo後不驗證密碼      

2.1.2./etc/ansible/hosts格式

[DB]          #表示DB組,下面的主機均屬于該組
192.168.1.2
192.168.1.3
[fastdfs]
192.168.1.2
192.168.1.3  GROUP_NAME="g1"  #定義局部變量
[k8s]
192.168.1.[4:10]    #[4:10]表示連續的主機,包含4和10
[webserver]
192.168.1.11:2222   #預設為22端口,如果不是,需指定
[groups:children]   #children是ansible内置變量,可以實作多個組的調用
DB
k8s
[DB:vars]
mysql_port="3306"   #組變量
[all:vars]        #定義全局變量
db_master_ip="{{groups['DB'][0]}}"  #取DB組中的第一個IP      

​2.2.可執行檔案​

/usr/bin/ansible      #主程式
/usr/bin/ansible-doc    #檢視文檔
/usr/bin/ansible-galaxy   #連接配接https://galaxy.ansible.com/下載下傳相應的roles
/usr/bin/ansible-playbook #調用playbook劇本
/usr/bin/ansible-vault    #檔案加密工具      

三、配置基于root使用者Key的驗證

以root使用者登入到主要端機器,ssh-keygen生成密鑰對,通過ssh-copy-id 遠端主機,将公鑰拷貝到遠端主機

四、ansible指令執行過程

  • 加載自己的配置檔案,預設/etc/ansible/ansible.cfg
  • 加載自己對應的子產品檔案,如command,或者ping
  • 通過ansible将子產品或指令生成對應的臨時py檔案,并将該檔案傳輸至遠端伺服器的對應執行使用者$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY檔案
  • 給檔案+x執行
  • 執行并傳回結果
  • 删除臨時py檔案,退出

五、執行狀态

綠色:執行成功并且不需要做改變的操作

黃色:執行成功并且對目标主機做變更

紅色:執行失敗

六、常用子產品

ansible 192.168.1.2 -m ping -k    #測試主機是否可以通信;預設通過key驗證,-k指定以使用者名密碼驗證
ansible all -m ping     #檢測主機清單檔案中的所有主機
ansible db -m ping      #隻檢測db組内的主機
ansible *ser* -m ping   #支援通配符
ansible 'db:web' -m ping  #取db和web組的并集
ansible 'db:&web' -m ping #取db和web組的交集
ansible 'db:!web' -m ping #在db,不在web
ansible-doc -l        #列出所有子產品
ansible-doc ping      #檢視ping子產品
ansible-doc -s ping     #簡單了解ping子產品
ansible all --list      #列出主機清單所有主機
ansible all -a 'ls /root' #預設使用command模闆,不支援變量、<、>、|、&、;等,需使用shell子產品
ansible all -a 'creates=/ansible mkdir /ansible'  #不存在/ansible,則執行後面的mkdir
ansible all -a 'chdir=/root ls'   #切換到/root下執行ls

ansible all -m shell -a 'echo $HOSTNAME'
ansible all -m script -a '/etc/ansible/scripts/host.sh' #會自動把主要端的腳本拷貝到被控端,并執行
ansible all -m copy -a 'src=/etc/hosts dest=/ansible/'  #拷貝本機檔案到遠端主機
ansible 192.168.119.134 -m copy -a "src=/etc/ansible dest=/tmp owner=root group=root mode=0755" # 拷貝本機目錄到遠端用戶端
ansible all -m copy -a 'content="hello world" dest=/ansible/f1' #把content裡面的内容寫入到f1檔案,會覆寫之前的内容
ansible all -m fetch -a 'src=/etc/hosts dest=files/ flat=yes' #拷貝遠端主機檔案到目前路徑的files/目錄下;flat隻拷貝hosts檔案本身,不拷貝hosts檔案所在的絕對路徑

ansible all -m file -a 'path=/ansible/f2 state=touch' #建立檔案
ansible all -m file -a 'path=/ansible/f2 state=absent'  #删除檔案
ansible all -m file -a 'path=/ansible/dir1 state=directory' #建立目錄
ansible all -m file -a 'src=/etc/hosts dest=/tmp/host state=link' #建立軟連結
ansible 10.93.62.156 -m hostname -a 'name=Master'   #修改主機名

ansible all -m cron -a 'minute=* weekday=2,4 job="/usr/bin/wall test warning" name=testcron'  #定時任務
ansible all -m cron -a 'disabled=true job="/usr/bin/wall test warning" name=testcron'   #取消定時任務
ansible all -m cron -a 'state=absent job="/usr/bin/wall test warning" name=testcron'    #删除定時任務

ansible all -m yum -a 'name=vsftpd update_cache=yes'    #yum裝包,更新緩存
ansible all -m yum -a 'name=vsftpd state=removed'     #解除安裝包

ansible all -m user -a 'name=zhangsan shell=/bin/bash'    #建立使用者

ansible web -m command -a "chdir=/tmp pwd"    #切換目錄,執行指令      

ansible子產品大全

七、ansible-galaxy

ansible-galaxy collection install nginxinc.nginx_core -c      #下載下傳角色;-c忽略證書認證
ansible-galaxy list     #列出本機所有角色      

八、ansible-vault

ansible-vault encrypt hello.yml   #加密yaml檔案,需設定密碼
ansible-vault view hello.yml    #檢視yaml檔案内容
ansible-vault edit hello.yml    #修改yaml檔案内容
ansible-vault rekey hello.yml   #修改加密密碼
ansible-vault decrypt hello.yml   #解密yaml檔案      

九、ansible-playbook

​9.1.核心元素​

hosts   #執行的遠端主機清單
tasks   #任務集
templates #模闆
handlers  #也是task清單,和一般的task并沒有什麼差別.Handlers由通知者進行notify, 如果沒有被notify,handlers不會執行.不管有多少個通知者進行了notify,等到 play 中的所有 task 執行完成之後,handlers 也隻會被執行一次
tags    #打标簽,通過标簽調用特定的任務;多個任務可以共用一個标簽
vars    #定義變量      

​9.2.playbook格式​

---                      #習慣寫法,區分不同的檔案
# 建立檔案
- hosts: db,myql         #選擇hosts檔案中的主機;可以選擇多個主機,使用逗号分隔
  remote_user: root      #指定遠端主機用什麼使用者執行
  gather_facts: no     #收集遠端主機資訊,預設為yes

  tasks:                        #任務清單
    - name: create file         #任務說明
      file: path=/ansible/f2 state=touch  mode=0500      #使用file子產品,建立檔案;mode設定權限
    - name: test1
      shell: echo "{{ groups['mysql'][0] }}" >> /tmp/t1.txt   #擷取[mysql]組的第一個成員
      
- hosts: redis:!redis[0]    #排除redis組的第一個成員      

​9.3.常用技巧​

1、ignore_errors忽略錯誤資訊

任務執行失敗,不會影響後面任務的執行

- name: create file         
  file: path=/ansible1/f2 state=touch        
  ignore_errors: True      

2、拷貝檔案使用相對路徑

src使用相對路徑,會去與該yaml檔案同級的files目錄下尋找,通常把要拷貝的檔案同一放到files目錄下

- name: copy hosts
  copy: src=hosts dest=/ansible/ backup=yes      

3、handlers+notify解決修改配置檔案不生效的問題

當執行copy模闆後,通過notify發送通知給名字為restart httpd service的handlers,執行對應的service模闆,重新開機httpd服務

tasks:
  - name: copy conf file
    copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes
    notify:
      - restart httpd service
  - name: start service
    service: name=httpd state=started enabled=yes
handlers:
  - name: restart httpd service
    service: name=httpd state=restarted      

4、tags打标簽

特殊tags:always #無論如何都會運作

- name: copy hosts
  copy: src=hosts dest=/ansible/
  tags: copyfile      

調用多個标簽用逗号分隔

ansible-playbook -t copyfile,sql file.yml      

5、when條件判斷

ansible條件判斷

根據作業系統的類型來執行對應的任務

tasks:
  - name: create file for RedHat
    file: path=/ansible/redhat state=touch
    when: ansible_os_family == "RedHat"
  - name: create file for ubuntu
    file: path=/ansible/ubuntu state=touch
    when: ansible_os_family == "Ubuntu"      

自定義條件判斷

根據action的值去判斷

ansible入門詳解---值得收藏
ansible入門詳解---值得收藏

6、疊代:with_items

當需要有重複性執行的任務時,可以使用疊代機制

示例:建立多個檔案

tasks:
  - name: create files
    file: path=/ansible/{{ item }} state=touch
    with_items:
      - file1
      - file2      

示例:疊代嵌套子變量

tasks:
  - name: create group
    group: name={{ item }}
    with_items:
      - g1
      - g2
  - name: create user
    user: name={{ item.name }} group={{ item.group }}
    with_items:
      - { name: "user1", group: "g1"}
      - { name: "user2", group: "g2"}      

7、become提權

- name: copy hosts
  copy: src=hosts dest=/ansible/
  become: yes
  become_user: root   #提升為root權限,類似sudo      

8、lineinfile(類似于sed)

regexp正則比對,如果比對上,則整行替換,類似sed的c操作;如果未比對,則在末尾添加,類似sed的a操作

- name: modify file
  lineinfile: dest=/ansible/file1 regexp="zabbix soft" line="zabbix soft nproc 65535"      

playbook的一個bug:如果内容中有:号會報錯,用下面的寫法可以避免

- name: add paas sudo
  lineinfile:
    path: /etc/sudoers
    regexp: "paas ALL=(ALL) NOPASSWD: ALL"
    line: "paas ALL=(ALL) NOPASSWD: ALL"      

9、register注冊變量,傳回shell腳本執行結果

使用 register 注冊變量,名為 result,會把shell子產品的輸出存入到result

debug子產品使用result的值進行判斷

tasks:
  - name: install mysql
    shell: cd /data/shell/ && sh InstallMySql.sh
    register: result
  - name: show install mysql debug
    debug: var=result.stdout_lines verbosity=0      
result.stdout     #标準正确輸出儲存到字元串中
result.stdout_lines   #标準正确輸出儲存到清單中,輸出更美觀
result.stderr_lines   #标準錯誤輸出儲存到清單中
verbosity   #為1,代表-v;為2,代表-vv;為3,代表-vvv      

10、failed_when關鍵字

’ failed_when’不會影響shell子產品的執行過程,隻會在條件成立時影響shell子產品最終的執行狀态,以便停止playbook的運作。

---
- hosts: db
  remote_user: root
  tasks:
  - debug:
      msg: "I execute normally"
  - shell: "echo 'This is a string for testing error' && exit 1"
    register: result
    failed_when: result.rc != 0   
  - debug:
      msg: "I never execute,Because the playbook has stopped      
ansible入門詳解---值得收藏

類似于shell中的

if [[ $? -ne 0 ]];then
  exit 1
fi      

判斷作業系統

- hosts: redhat
  gather_facts: True
  tasks:
   - name: copy redhat7 packages
     copy: 
         src: /tmp/redhat7.tar
         dest: /tmp/redhat7.tar
         mode: '0755'
     when: ansible_distribution == "RedHat" and ansible_distribution_major_version == "7"      

比對多個條件

1、兩個條件都滿足

failed_when: ' "error" in result.stdout and "fail" in result.stdout'      

2、滿足兩個條件中的任意一個

failed_when: ' "error" in result.stdout or "fail" in result.stdout'      

11、任務委派功能delegate_to

實作在目前playbook主機組外的機器上執行操作

run_noce: true 在一個主機上面隻執行一次一個任務. ,如果沒有這個參數的話,每個playbook中的組的主機都會執行一次

- name: test
  shell: echo "1" >> /root/a.txt
  delegate_to: 127.0.0.1
  run_once: true      

委派Ansible所在的機器(即主要端)執行shell裡面的操作

12、本地操作功能local_action或connection

ansible入門詳解---值得收藏

​ansible的delegate_to、connection、和local_action

13、判斷檔案是否存在

如果不存在,則建立

- name: Check a.txt exists
  stat:
    path: /etc/ansible/a.txt
  register: file_status
- name: create a.txt
  shell: touch a.txt
  when: file_status.stat.exists == False      

14、判斷指定路徑是否為一個目錄

- hosts: test
  vars:
    testpath1: "/testdir/test"
    testpath2: "/testdir"
  tasks:
    - debug:
        msg: "file"
      when: testpath1 is file
    - debug:
        msg: "directory"
      when: testpath2 is directory      

15、include

1、調用其它yml

例如:在tasks目錄有main.yml和upgrade_sql.yml,則可以在main.yml中調用upgrade_sql.yml

- include: upgrade_sql.yml      

16、block子產品

将多個任務組合成一個塊,并且可以對這個塊做條件判斷,以及當塊裡面的任務失敗時,進行失敗處理

1、當when的判斷語句一樣時,可以将任務合并

- name: block的用法
  hosts: node
  tasks:
    - debug:
      msg: "task1 not in block"
    - block:
        - debug:
            msg: "task2 in block1"
        - debug:
            msg: "task3 in block1"
      when: 2 > 1      

2、"錯誤處理"功能

- hosts: testuser
  remote_user: root
  tasks:
  - block:
      - command: /bin/false
      - debug:
          msg: 'I never execute, due to the above task failing'
    rescue:       #當上面的塊失敗時,該關鍵字下面的任務将被執行
      - command: /bin/false
      - debug:
          msg: 'I also never execute'
    always:       #不管block塊是否執行成功,該關鍵字定義的任務都要被執行。
      - debug:
          msg: "This always executes"
    when: 2>1      

17、pre_tasks在roles之前執行

如果想在調用roles之前執行tasks任務,得用pre_task,不然會跳過tasks,直接調用roles

- hosts: web
   pre_tasks:
     - name: pre check
       shell: echo "預檢查"
   roles:
     - nginx      

18、set_fact設定變量

擷取本機IP位址,并指派給變量host_ip_address

- hosts: mysql
  tasks:
    - name: get host ip address
      shell: "ip addr |awk '/inet /' |sed -n '2p' |awk -F' ' '{print $2}' |awk -F'/' '{print $1}'"
      register: host_ip
      changed_when: false
    - name: set host_ip_address variable
      set_fact:
        host_ip_address: "{{ host_ip.stdout }}"
    - name: show host_ip_address
      debug: msg={{ host_ip_address }}      

19、validate: 在複制之前執行檢測,如果要引用目标檔案名,則使用 %s

- name: copy nginx.conf to {{ NGINX_DATA }}/conf
  template:
    src: nginx.conf.j2
    dest: "{{ NGINX_DATA }}/conf/nginx.conf"
    backup: yes
    validate: 'nginx -t -c %s'      

​9.4.使用變量​

變量名由字母、數字、下劃線組成,隻能以字母開頭

列印所有變量

ansible web -m debug -a 'var=vars'      

a.系統facts收集

系統變量在playbook中可以直接通過{{ 名字 }}調用,如{{ ansible_hostname }}

ansible web -m setup      #列印所有系統資訊
ansible web -m setup -a 'filter=ansible_hostname'       #擷取主機名
ansible web -m setup -a 'filter=ansible_all_ipv4_addresses'   #擷取IP位址      

b.在yaml檔案中通過vars定義

- hosts: db
  remote_user: root
  vars:
    - filename: f4

  tasks:
    - name: create file
      file: path=/ansible/{{ filename }} state=touch      

c.在/etc/ansible/group_vars/all定義[推薦使用]

定義的是全局變量,主機清單中的主機均可以調用

ANSIBLE_DIR: "/opt/ansible"     #存放ansible拷貝的檔案
SERVICE_USER: "admin"           #啟動服務的使用者
DATA_DIR: "/app"                #資料主目錄
JDK_DIR: "{{ DATA_DIR }}/jdk"   #jdk資料路徑      

d.在/etc/ansible/hosts中定義

http_port為針對單台主機設定的變量,nodename為針對web組所有主機設定的變量

[web]
10.93.91.80    http_port=80
10.93.65.2     http_port=81
[web:vars]
nodename=www
[all:vars]        #定義全局變量
web_master_ip="{{groups['web'][0]}}"  #取web組中的第一個IP      

e.通過ansible-playbook -e傳入變量,優先級高于/etc/ansible/hosts【不推薦】

playbook調用變量(兩個雙花括号裡面寫變量名)

- name: create file
  file: path=/ansible/{{ filename }} state=touch      

通過-e傳入變量

ansible-playbook -e 'filename=f3' file.yml      

​9.5.常用指令​

選項 解釋
-f 并發執行數量,預設為5
–ssh-common-args 指定要傳遞給sftp/scp/ssh的公共參數(例如ProxyCommand)
-i 指定主機清單檔案,如果安裝了ansible工具,不指定預設使用/etc/ansible/hosts檔案
ansible-playbook -C file.yml    #隻檢測可能會發生的改變,并不真正執行
ansible-playbook file.yml     #執行playbook
ansible-playbook file.yml --list-hosts      #列出運作任務的主機
ansible-playbook file.yml --limit 10.93.65.2  #隻在指定的主機執行
ansible-playbook file.yml --list-tasks      #檢視任務清單
ansible-playbook file.yml --list-tags     #檢視标簽清單
python ./ansible-playbook -f 3 -i hosts-192.168.137.3 /tmp/test.yml #通過python調用ansible-playbook,把ansible-playbook的内容放到ansible-playbook目錄下即可      
ansible入門詳解---值得收藏

​9.6.模闆templates​

使用jinjia2語言

在與playbook同級的目錄下建立templates目錄

檔案名以.j2結尾

1、簡單運算

vi templates/nginx.conf.j2

這裡面做了一個簡單的計算,讓遠端主機CPU的個數乘以2

user nginx
workproceess {{ ansible_processor_vcpus*2 }}      

playbook寫法

- name: copy templates
  template: src=nginx.conf.j2 dest=/ansible/nginx.conf      

執行之後的結果,CPU的個數是8

ansible入門詳解---值得收藏

2、for循環+if判斷

for循環格式:

{% for port in ports %}
語句塊1
語句塊2
...
{% endfor %}      

if判斷格式:

單分支
{% if p.name is defined %}    #如果變量不為空,則執行裡面的語句塊
語句塊
{% endif %}

#多分支
{% if db_type== "mysql" %}
DB_IP=192.168.1.2
{% elif db_type== "oracle" %}
DB_IP=192.168.1.3
{% endif %}      

playbook寫法:

- hosts: all
  remote_user: root
  vars:
    ports:
      - port: 80
        name: web1
      - port: 81

  tasks:
  - name: copy templates
    template: src=nginx.conf.j2 dest=/ansible/nginx.conf      

模闆檔案:

{% for p in ports %}
server {
    listen {{ p.port }}

{% if p.name is defined %}          
    servername {{ p.name }}
{% endif %}
}
{% endfor %}      

執行結果:

ansible入門詳解---值得收藏

3、在模闆中擷取主機組的IP

groups[‘web’]可以擷取hosts檔案中的web主機組定義的主機

{% if groups['web'] is defined and groups['web'][0] is defined %}       #如果web組定義,且至少有一個主機
upstream web {
{% for ip in groups['web'] %}
    server {{ ip }}:{{ WEB_PORT}} fail_timeout=5s max_fails=3;
{% endfor %}
{% endif %}      

4、在模闆中定義清單

{% for service_name in ['web','mysql'] %}
{{ service_name }}
{% endfor %}      

5、擷取主機組數量

"{{ groups['master'] | length }}"      

十、roles

用于層次性、結構化地組織playbook,可以看成是一大堆playbook的集合。

分别将變量、檔案、模闆、任務放置于單獨的目錄中

​10.1.流程圖​

ansible入門詳解---值得收藏

​10.2.各目錄作用​

ansible入門詳解---值得收藏

​10.3.示例​

調用role的playbook需要與roles目錄位于同級目錄下

ansible入門詳解---值得收藏

nginx_role.yml内容:

- hosts: web
  remote_user: root
  roles:
    - nginx      

roles目錄結構

ansible入門詳解---值得收藏

main.yml内容,作為任務總入口,用來調用子任務

- include: group.yml
- include: user.yml
- include: config.yml
- include: copy.yml      
ansible-playbook nginx_role.yml      

​10.4.在main.yml調用其它角色的任務​

- include: roles/mysql/tasks/install.yml      

​10.5.給角色定義标簽​

- hosts: web
  remote_user: root
  roles:
    - { role: nginx, tags: ['web', 'nginx'] }
    - { role: httpd, tags: ['web', 'httpd'], when: ansible_os_family == "RedHat" }  #根據when條件執行角色      

​10.6.委托其它機器執行角色​

- hosts: web
  remote_user: root
  roles:
    - { role: nginx, delegate_to: 127.0.0.1 }      

繼續閱讀