ansible
前言
用到了就總結下吧
常用到的指令
查看ip是否可用
ansible all -m ping
執行
ansible-playbook xxxx.yml
執行,查看日志輸出
ansible-playbook xxxx.yml -vvv
查看這個 playbook 的執行會影響到哪些 hosts
ansible-playbook playbook.yml --list-hosts
ansible了解
Ansible
是使用Python
開發的自動化運維工具,如果這么說比較抽象的話,那么可以說Ansible
可以讓服務器管理人員使用文本來管理服務器,編寫一段配置文件,在不同的機器上執行。
Ansible
的使用需要在目標服務器上添加自己電腦的公鑰,設置免密登錄。
設置服務器免密登錄
添加本機的pub,公鑰到目標服務器~/.ssh/authorized_keys
中,然后設置權限chmod 600 /root/.ssh/authorized_keys
變量名的使用
在使用變量之前最好先知道什么是合法的變量名. 變量名可以為字母,數字以及下划線.變量始終應該以字母開頭. “foo_port”是個合法的變量名.”foo5”也是. “foo-port”, “foo port”, “foo.port” 和 “12”則不是合法的變量名.
playbooks了解
Playbooks
可用於聲明配置,更強大的地方在於,在 playbooks
中可以編排有序的執行過程,甚至於做到在多組機器間,來回有序的執行特別指定的步驟.並且可以同步或異步的發起任務.
在運行 playbook
時(從上到下執行),如果一個 host
執行 task
失敗,這個 host
將會從整個 playbook
的 rotation
中移除. 如果發生執行失敗的情況,請修正 playbook
中的錯誤,然后重新執行即可.
modules
具有”冪等”性.重復多次執行playbook
是安全的。
比如對於創建文件夾,如果不存在就創建,存在了就不創建了。
Handlers
在發生改變時執行的操作
Handlers 也是一些 task 的列表,通過名字來引用,它們和一般的 task 並沒有什么區別.Handlers 是由通知者進行 notify, 如果沒有被 notify,handlers 不會執行.不管有多少個通知者進行了 notify,等到 play 中的所有 task 執行完成之后,handlers 也只會被執行一次.
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
Handlers 最佳的應用場景是用來重啟服務,或者觸發系統重啟操作.除此以外很少用到了.
task
對於playbook,我們一般使用 include 語句引用 task 文件的方法,將playbook進行拆分。
register使用
register
的作用一般用於獲取命令輸出和判斷執行是否成功。
register
可以存儲指定命令的輸出結果到一個自定義的變量中,我們可以通過訪問這個自定義的變量來獲取命令的輸出,然后判斷是否執行成功。
- name: Check than logfile exists
stat: path={{ DATA_PATH }}/mongos/log/mongo.log
register: logfile_start
when: MONGO_SYSYTEMLOG_DESTIANTION == "file"
- name: Create log if missing
file:
state: touch
dest: "{{ DATA_PATH }}/mongos/log/mongo.log"
owner: mongod
group: mongod
mode: 0644
when: ( MONGO_SYSYTEMLOG_DESTIANTION == "file"
and logfile_start is defined
and not logfile_start.stat.exists )
通過判斷logfile_start
來判斷目標目錄是否存在。
set_fact使用
set_fact
用來做變量的賦值。
- name: 注冊replicaset_host變量
set_fact:
replicaset_host: []
- name: 循環處理host
set_fact:
replicaset_host: "{{replicaset_host}} + [ '{{ item }}:{{ MONGO_NET_PORT }}' ]"
with_items: "{{ groups['mongo'] }}"
比如上面注冊了一個replicaset_host
數組,下面通過with_items
循環對replicaset_host
進行了賦值操作,之后后面的task就可以直接使用這個變量了。
- name: 初始化副本集
mongodb_replicaset:
login_host: localhost
login_port: "{{ MONGO_NET_PORT }}"
login_user: "{{ MONGO_ROOT_USERNAME }}"
login_password: "{{ MONGO_ROOT_PASSWORD }}"
replica_set: mongos
members: "{{ replicaset_host }}"
ansible構建mongo的replicaset
構建的思路:
1、通過rpm安裝mongo的包,然后安裝依賴的程序
2、配置mongo.service
3、配置mongo.conf
,初始化的mongo是沒有賬號密碼的,所以先初始化一個無需驗證的mongo.conf
。配置好之后,重啟服務。
4、設置登錄的賬號密碼,之后修改mongo.conf
為需要認證的。重啟服務。
5、初始化副本集,設置開機啟動。
項目結構:
.
├── deploy-mongo.yml
└── roles
└── mongo
├── defaults // 一些配置信息
│ └── main.yml
├── files // mongo的安裝包
│ └── rpms
│ ├── mongodb-org-unstable-mongos-4.1.8-1.el7.x86_64.rpm
│ ├── mongodb-org-unstable-server-4.1.8-1.el7.x86_64.rpm
│ ├── mongodb-org-unstable-shell-4.1.8-1.el7.x86_64.rpm
│ └── mongodb-org-unstable-tools-4.1.8-1.el7.x86_64.rpm
├── handlers // notify重啟服務的task
│ └── main.yml
├── tasks
│ ├── auth_initialization.yml
│ ├── authorization.yml
│ ├── configure.yml
│ ├── init_replicaset.yml
│ ├── install_task.yml
│ └── main.yml
└── templates
├── mongodb.service.j2
└── mongod.conf.j2
項目的地址[https://github.com/boilingfrog/ansible-mongo-replicaset-role]