ansible的 setup模塊主要用來收集信息, 查看參數:html
[root@localhost ~]# ansible-doc -s setup # 查看參數,部分參數以下: filter # 過濾,篩選
示例一:查看全部信息python
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
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 的任務,結果自行驗證
一般你想在一個任務中幹不少事,好比建立一羣用戶、安裝不少包、或者重複一個輪詢步驟直到收到某個特定結果,這時就可使用循環。正則表達式
循環裏面只能是 item 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參數以下:
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目錄裏面
上面咱們曾提到過, modul 具備 "冪等" 性, 因此當遠端系統被人修改時, 能夠重放 playbooks 達到恢復的目的, playbooks 自己能夠識別這種改動, 而且有一個基本的event sysem(事件系統), 能夠響應這種改動, (當發生改動時) '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: restate_redis
service: name=redis state=restarted
- hosts: web
remote_user: root
roles:
- web
ansible-playbook web.yml ansible-playbook -t copy_redis_conf web.yml # 修改配置文件後加參數-t,觸發handler中任務
參考博客:https://blog.51cto.com/wangfeng7399/2341281
思考:如何用roles 來安裝nginx+uwsgi+mariadb + redis?