ansible-3

setup

ansible_all_ipv4_addresses # ipv4的全部地址
ansible_all_ipv6_addresses # ipv6的全部地址
ansible_date_time # 獲取到控制節點時間
ansible_default_ipv4 # 默認的ipv4地址
ansible_distribution # 系統
ansible_distribution_major_version # 系統的大版本
ansible_distribution_version # 系統的版本號
ansible_domain #系統所在的域
ansible_env #系統的環境變量
ansible_hostname #系統的主機名
ansible_fqdn #系統的全名
ansible_machine #系統的架構
ansible_memory_mb #系統的內存信息
ansible_os_family # 系統的家族
ansible_pkg_mgr # 系統的包管理工具
ansible_processor_cores #系統的cpu的核數(每顆)
ansible_processor_count #系統cpu的顆數
ansible_processor_vcpus #系統cpu的總個數=cpu的顆數*CPU的核數
ansible_python # 系統上的python
ansible cache -m setup -a 'filter=*processor*' # 用來搜索

條件判斷

  • 不一樣的系統php

  • 不一樣的版本node

  • 不一樣的環境python

  • 不一樣的用戶mysql

- hosts: db
  remote_user: root
  tasks:
  - name: createfile
    copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt
    when: a=="3"
  - name: cratefile
    copy: content="小弦切切如私語" dest=/tmp/a.txt
    when: a=="4"
ansible-playbook -e 'a="3"' p6.yml

tags

- hosts: web
  tasks:
  - name: installnginx
    yum: name=nginx
  - name: copyfile
    copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf
    tags: copyfile
  - name: start
    service: name=nginx state=started
ansible-playbook -t copyfile p7.yml 

循環 with_item

一次性建立多個linux

- hosts: web
  tasks:
  - name: crateuser
    user: name={{item}}
    with_items:
    - alex20
    - alex21
    - alex22
- hosts: web
  tasks:
  - name: crateuser
    user: name={{item}}
    with_items:
    - alex30
    - alex31
    - alex32
  - name: crategroup
    group: name={{item}}
    with_items:
    - wulaoshi20
    - wulaoshi21
    - wulaoshi22

嵌套循環

- hosts: web
  tasks:
  - name: crategroup
    group: name={{item}}
    with_items:
    - wulaoshi30
    - wulaoshi31
    - wulaoshi32
  - name: createuser
    user: name={{item.name}} group={{item.group}}
    with_items:
    - {'name':alex40,'group':wulaoshi30}
    - {'name':alex41,'group':wulaoshi31}
    - {'name':alex42,'group':wulaoshi32}

template:nginx

jinja2web

- hosts: web
  tasks:
  - name: installredis
    yum: name=redis
  - name: copyfile
    template: src=/etc/redis.conf dest=/etc/redis.conf
  - name: start
    service: name=redis state=started
    
  配置文件: bind {{ ansible_default_ipv4.address }} 

copy和tamplate的區別redis

  • copy模塊不替代參數sql

  • template模塊替代參數vim

- hosts: web
  tasks:
  - name: installredis
    yum: name=redis
  - name: copyfile
    template: src=redis.conf dest=/etc/redis.conf
  - name: start
    service: name=redis state=started

ps:寫相對路徑: 在當前目錄下新建一個templates目錄,而後把文件放在templates目錄裏面

handlers

修改配置文件

- hosts: web
  tasks:
  - name: installredis
    yum: name=redis
  - name: copyfile
    template: src=redis.conf dest=/etc/redis.conf
    tags: copyfile
    notify: restart
  - name: start
    service: name=redis state=started
  handlers:
  - name: restart
    service: name=redis state=restarted

roles

  • 目錄清晰

  • 能夠互相調用

roles文件夾

文件夾裏面是要建立的每個角色,每個角色一個文件夾

每個角色裏面都有tasks(必須的),templates,files,handlers,vars目錄

每一個目錄都要有main.yml文件,經過import_tasks來調用

其中templates文件夾中的文件能夠經過相對路徑來調用

其中files文件夾中的文件是否能夠經過相對路徑來調用

1、什麼場景下會用roles?

假如咱們如今有3個被管理主機,第一個要配置成httpd,第二個要配置成php服務器,第三個要配置成MySQL服務器。咱們如何來定義playbook?

第一個play用到第一個主機上,用來構建httpd,第二個play用到第二個主機上,用來構建php,第三個play用到第三個主機上,用來構建MySQL。這些個play定義在playbook中比較麻煩,未來也不利於模塊化調用,不利於屢次調。好比說後來又加進來一個主機,這個第4個主機既是httpd服務器,又是php服務器,咱們只能寫第4個play,上面寫上安裝httpd和php。這樣playbook中的代碼就重複了。

爲了不代碼重複,roles可以實現代碼重複被調用。定義一個角色叫websrvs,第二個角色叫phpappsrvs,第三個角色叫dbsrvs。那麼調用時以下來調用:

 

hosts: host1
role:
- websrvs

hosts: host2
role:
- phpappsrvs
        
hosts: host3
role:
- dbsrvs
        
hosts: host4
role:
- websrvs
- phpappsrvs

 這樣代碼就能夠重複利用了,每一個角色能夠被獨立重複調用。下面舉例說明使用方式。 

2、roles示例

假設有3臺主機,172.16.7.151主機上安裝MySQL,172.16.7.152上安裝httpd,172.16.7.153上安裝MySQL和httpd。咱們創建兩個角色websrvs和dbsrvs,而後應用到這幾個主機上。 

1. 建立roles的必需目錄 

[root@node1 opt]# mkdir -pv ansible_playbooks/roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers,vars}

每一個role下面有個目錄叫meta,在裏面能夠新建文件main.yml,在文件中能夠設置該role和其它role以前的關聯關係。

2. 配置角色

(1)配置角色websrvs 

[root@node1 opt]# cd ansible_playbooks/roles/
[root@node1 roles]# cd websrvs/
[root@node1 websrvs]# ls
files  handlers  meta  tasks  templates  vars

a. 將httpd配置文件上傳到files目錄下,我這裏假設httpd.conf每臺主機都是同樣的,實際上應該用模板,先用同樣的配置文件舉例

[root@node1 websrvs]# cp /etc/httpd/conf/httpd.conf files/

直接複製的靜態文件都放在files目錄下。打算用模板文件的都放在templates目錄下。 

b.編寫任務列表tasks

[root@node1 websrvs]# vim tasks/main.yml
- name: install httpd package
  yum: name=httpd
- name: install configuration file
  copy: src=httpd.conf dest=/etc/httpd/conf
  tags:
  - conf
  notify:
  - restart httpd
- name: start httpd
  service: name=httpd state=started

c.因爲上面的tasks中定義了notify,因此要定義handlers 

[root@node1 websrvs]# vim handlers/main.yml
- name: restart httpd
  service: name=httpd state=restarted

若是須要定義變量,則在vars目錄下建立main.yml文件,在文件中寫入變量,以key:value的形式定義,好比: 

http_port: 8080

(2)配置角色dbsrvs 

[root@node1 roles]# cd dbsrvs/
[root@node1 dbsrvs]# ls
files  handlers  meta  tasks  templates  vars

a.將MySQL配置文件上傳到files目錄下。

b.編寫任務列表tasks 

[root@node1 dbsrvs]# vim tasks/main.yml
- name: install mysql-server package
  yum: name=mysql-server state=latest
- name: install configuration file
  copy: src=my.cnf dest/etc/my.cnf
  tags:
  - conf
  notify:
  - restart mysqld
- name:
  service: name=mysqld enabled=true state=started

c.定義handlers 

[root@node1 dbsrvs]# vim handlers/main.yml
- name: restart mysqld
  service: name=mysqld state=restarted

(3)定義playbook

【注意】:要在roles目錄同級建立playbook。 

[root@node1 ansible_playbooks]# vim web.yml
- hosts: 172.16.7.152
  roles:
  - websrvs 

[root@node1 ansible_playbooks]# vim db.yml
- hosts: 172.16.7.151
  roles:
  - dbsrvs 

[root@node1 ansible_playbooks]# vim site.yml
- hosts: 172.16.7.153
  roles:
  - websrvs
  - dbsrvs

運行: 

[root@node1 ansible_playbooks]# ansible-playbook web.yml
[root@node1 ansible_playbooks]# ansible-playbook db.yml
[root@node1 ansible_playbooks]# ansible-playbook site.yml

固然也能夠把這些內容寫入同一個playbook中。playbook的名字能夠自定義。

  

防火牆

setenforce 0 #用來臨時關閉selinux
iptables -F # 臨時關閉防火牆
/etc/selinux/config # 永久關閉
相關文章
相關標籤/搜索