ansible的setup模塊主要用來收集信息,查看參數:html
[root@localhost ~]# ansible-doc -s setup # 查看參數,部分參數以下: filter # 過濾,篩選
示例一:查看全部信息python
[root@localhost ~]# ansible cache -m setup # 查看cache組的被管控機的信息,可查到部分信息以下
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
示例二:搜索某個信息nginx
[root@localhost ~]# ansible cache -m setup -a 'filter=*processor*' # 用來搜索,*表明匹配任意個任意字符,可自行回顧正則表達式相關知識,可得以下信息 192.168.133.132 | SUCCESS => { "ansible_facts": { "ansible_processor": [ "0", "GenuineIntel", "Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz" ], "ansible_processor_cores": 1, "ansible_processor_count": 1, "ansible_processor_threads_per_core": 1, "ansible_processor_vcpus": 1 }, "changed": false }
ansible的playbook支持條件判斷,當針對不一樣系統,不一樣版本,不一樣環境,不一樣用戶有不一樣操做時,可使用 when 做條件判斷,示例以下:web
[root@localhost yaml]# vi p5.yml # 寫一個yml文件,內容以下: - hosts: db remote_user: root tasks: - name: createfile3 copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt when: a=="3" - name: createfile4 copy: content="小弦切切如私語" dest=/tmp/a.txt when: a=="4" [root@localhost yaml]# ansible-playbook --syntax-check p5.yml # 驗證語法合法性 playbook: p5.yml [root@localhost yaml]# ansible-playbook -e 'a="3"' p5.yml # 只執行name爲 createfile3 的任務,結果自行驗證
假如在一playbook文件中有多個任務,可是咱們只想執行其中一個,該怎麼辦?此時,可使用tags,以下示例:正則表達式
[root@localhost yaml]# vi p6.yml - hosts: web tasks: - name: install yum: name=redis - name: copyfile copy: src=/etc/redis.conf dest=/etc/redis.conf tags: copyfile - name: start service: name=redis state=started [root@localhost yaml]# ansible-playbook --syntax-check p6.yml playbook: p6.yml [root@localhost yaml]# ansible-playbook -t copyfile p6.yml # 執行腳本,結果自行驗證
一般你想在一個任務中幹不少事,好比建立一羣用戶、安裝不少包、或者重複一個輪詢步驟直到收到某個特定結果,這時就可使用循環。redis
示例一:單個循環apache
[root@localhost yaml]# vi p7.yml - hosts: web tasks: - name: createuser user: name={{ item }} with_items: - zhangsan - lisi - wangwu [root@localhost yaml]# ansible-playbook --syntax-check p7.yml playbook: p7.yml [root@localhost yaml]# ansible-playbook p7.yml
示例二:多個循環django
[root@localhost yaml]# vi p8.yml # 寫入以下內容 - hosts: web tasks: - name: createuser user: name={{ item }} with_items: - zs - lss - ww - name: creategroup group: name={{ item }} with_items: - yunwei - kaifa - ceshi [root@localhost yaml]# vi p8.yml [root@localhost yaml]# ansible-playbook --syntax-check p8.yml playbook: p8.yml [root@localhost yaml]# ansible-playbook p8.yml # 執行命令,結果自行驗證
示例三:循環嵌套安全
[root@localhost yaml]# vi p9.yml # 寫入以下內容 - hosts: web tasks: - name: creategroup group: name={{ item }} with_items: - yunwei - kaifa - ceshi - name: createuser user: name={{ item.name }} group={{ item.group }} with_items: - {'name':zs,'group':yunwei} - {'name':lss,'group':kaifa} - {'name':ww,'group':ceshi} [root@localhost yaml]# ansible-playbook p9.yml # 結果自行驗證 playbook: p9.yml [root@localhost yaml]# ansible-playbook p9.yml
先來回憶一下redis的安裝,爲了安全起見,咱們一般在redis安裝完成後要更改redis的配置文件redis.conf,其中有一項是更改bind參數,讓redis能夠遠程訪問,實際開發中bind 參數爲本機對外ip地址,而不能使用0.0.0.0開啓,這時,問題來了,使用ansible批量傳輸配置文件時,如何將bind參數設置爲被管控機的ip地址?架構
首先,咱們使用setup模塊查詢一下被管控機的ip地址,以下:
在管控機上安裝redis後,編輯配置文件redis.conf,更改bind參數以下:
[root@localhost yaml]# vi /etc/redis.conf # 編輯redis配置文件,更改bind參數爲以下內容
示例:
[root@localhost yaml]# vi p10.yml - hosts: web tasks: - name: install yum: name=redis - name: copyfile template: src=/etc/redis.conf dest=/etc/redis.conf - name: start service: name=redis state=started [root@localhost yaml]# ansible-playbook --syntax-check p10.yml playbook: p10.yml [root@localhost yaml]# ansible-playbook p10.yml
驗證:查看web組的被管控機的redis配置文件中bind參數
copy模塊與template模塊的區別:copy模塊不替換參數,而template模塊替換參數。
使用相對路徑:在上面p10.yml中,template模塊的src參數使用的是絕對路徑,除此以外,咱們還可使用相對路徑,以下:
[root@localhost yaml]# vi p10.yml - hosts: web tasks: - name: install yum: name=redis - name: copyfile template: src=redis.conf dest=/etc/redis.conf - name: start service: name=redis state=started [root@localhost yaml]# ansible-playbook --syntax-check p10.yml playbook: p10.yml [root@localhost yaml]# ansible-playbook p10.yml
注意:使用相對路徑的前提是在當前目錄(p10.yml文件所在目錄)下新建一個templates(必須叫這個)目錄,而後把文件redis.conf放在templates目錄裏面。
上面咱們曾提到過,module 具備"冪等"性,因此當遠端系統被人改動時,能夠重放 playbooks 達到恢復的目的,playbooks 自己能夠識別這種改動,而且有一個基本的 event system(事件系統),能夠響應這種改動。(當發生改動時)'notify' actions 會在 playbook 的每個 task 結束時被觸發,並且即便有多個不一樣的 task 通知改動的發生, 'notify' actions 只會被觸發一次。
舉例來講,好比多個 resources 指出由於一個配置文件被改動,因此 apache 須要從新啓動,可是從新啓動的操做只會被執行一次。
'notify' 下列出的便是 handlers。Handlers 也是一些 task 的列表,經過名字來引用,它們和通常的 task 並無什麼區別。Handlers 是由通知者進行 notify,若是沒有被 notify,handlers 不會執行,無論有多少個通知者進行了 notify,等到 play 中的全部 task 執行完成以後,handlers 也只會被執行一次。
示例:
[root@localhost yaml]# vi p11.yml - hosts: web tasks: - name: install 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 [root@localhost yaml]# [root@localhost yaml]# ansible-playbook --syntax-check p11.yml playbook: p11.yml [root@localhost yaml]# [root@localhost yaml]# ansible-playbook p11.yml [root@localhost yaml]# ansible-playbook -t copyfile p11.yml # 執行copyfile任務 和 restart任務,即修改完配置文件後重啓redis服務
如今咱們已經學過 tasks 和 handlers,那怎樣組織 playbook 纔是最好的方式呢?簡單的回答就是:使用 roles ! roles 基於一個已知的文件結構,去自動的加載某些 vars_files,tasks 以及 handlers。基於 roles 對內容進行分組,使得咱們能夠容易地與其餘用戶分享 roles 。
roles的優勢:
-
能夠互相調用
roles目錄結構:
- 文件夾裏面是要建立的每個角色,每個角色一個文件夾;
- 每個角色裏面都有tasks(必須的),templates,files,handlers,vars目錄;
- 每一個目錄都要有main.yml文件,經過import_tasks來調用;
- 其中templates文件夾中的文件能夠經過相對路徑來調用;
root
├── roles
│ ├── cache
│ ├── db
│ └── web
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ ├── copy_redis_conf.yml
│ │ ├── install_redis.yml
│ │ ├── main.yml
│ │ └── start_redis.yml
│ ├── templates
│ │ └── redis.conf.j2
│ └── vars
└── web.yml
- name: install_redis
yum: name=redis
- name: copy_redis_conf template: src=redis.conf.j2 dest=/etc/redis.conf tags: copy_redis_conf notify: restart_redis
- name: start_redis
service: name=redis state=started
- import_tasks: install_redis.yml - import_tasks: copy_redis_conf.yml - import_tasks: start_redis.yml
- name: restart_redis
service: name=redis state=restarted
- hosts: web
remote_user: root
roles:
- web
[root@localhost ~]# ansible-playbook web.yml [root@localhost ~]# ansible-playbook -t copy_redis_conf web.yml # 修改配置文件後加參數-t,觸發handler中任務
參考博客:https://blog.51cto.com/wangfeng7399/2341281
思考:如何用roles 來安裝nginx+uwsgi+mariadb + redis?