Ansible是一種IT自動化工具。它能夠配置系統,部署軟件以及協調更高級的IT任務,例如持續部署,滾動更新。Ansible適用於管理企業IT基礎設施,從具備少數主機的小規模到數千個實例的企業環境。Ansible也是一種簡單的自動化語言,能夠完美地描述IT應用程序基礎結構。html
具有如下三個特色:node
使用文檔: https://docs.ansible.com/linux
安裝Ansible:yum install ansible -ynginx
[webservers] alpha.example.org beta.example.org 192.168.1.100 www[001:006].example.com [dbservers] db01.intranet.mydomain.net db02.intranet.mydomain.net 10.25.1.56 10.25.1.57 db-[99:101]-node.example.com
ad-hoc命令能夠輸入內容,快速執行某個操做,但不但願留存記錄。git
ad-hoc命令是理解Ansible和在學習playbooks以前須要掌握的基礎知識。github
通常來講,Ansible的真正能力在於劇本。web
SSH密碼認證:sql
[webservers] 192.168.1.100:22 ansible_ssh_user=root ansible_ssh_pass=’123456’ 192.168.1.101:22 ansible_ssh_user=root ansible_ssh_pass=’123456’
SSH密鑰對認證:shell
[webservers] 10.206.240.111:22 ansible_ssh_user=root ansible_ssh_key=/root/.ssh/id_rsa 10.206.240.112:22 ansible_ssh_user=root 也能夠ansible.cfg在配置文件中指定: [defaults] private_key_file = /root/.ssh/id_rsa # 默認路徑
選項 | 描述 |
---|---|
-C, --check | 運行檢查,不執行任何操做 |
-e EXTRA_VARS,--extra-vars=EXTRA_VARS | 設置附加變量 key=value |
-u REMOTE_USER, --user=REMOTE_USER | SSH鏈接用戶,默認None |
-k, --ask-pass | SSH鏈接用戶密碼 |
-b, --become | 提權,默認root |
-K, --ask-become-pass | 提權密碼 |
ansible all -m ping ansible all -m ping ansible all -m shell -a "ls /root" -u root -k ansible webservers -m copy –a "src=/etc/hosts dest=/tmp/hosts"
apache
ansible-doc –l 查看全部模塊
ansible-doc –s copy 查看模塊文檔
模塊文檔:https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
在目標主機執行shell命令。
- name: 將命令結果輸出到指定文件 shell: somescript.sh >> somelog.txt - name: 切換目錄執行命令 shell: cmd: ls -l | grep log chdir: somedir/ - name: 編寫腳本 shell: | if [ 0 -eq 0 ]; then echo yes > /tmp/result else echo no > /tmp/result fi args: executable: /bin/bash
將文件複製到遠程主機。
- name: 拷貝文件 copy: src: /srv/myfiles/foo.conf dest: /etc/foo.conf owner: foo group: foo mode: u=rw,g=r,o=r # mode: u+rw,g-wx,o-rwx # mode: '0644' backup: yes
管理文件和文件屬性。
- name: 建立目錄 file: path: /etc/some_directory state: directory mode: '0755' - name: 刪除文件 file: path: /etc/foo.txt state: absent - name: 遞歸刪除目錄 file: path: /etc/foo state: absent
present,latest:表示安裝
absent:表示卸載
軟件包管理。
- name: 安裝最新版apache yum: name: httpd state: latest - name: 安裝列表中全部包 yum: name: - nginx - postgresql - postgresql-server state: present - name: 卸載apache包 yum: name: httpd state: absent - name: 更新全部包 yum: name: '*' state: latest - name: 安裝nginx來自遠程repo yum: name: http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.14.0-1.el7_4.ngx.x86_64.rpm # name: /usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm state: present
管理服務。
- name: 服務管理 service: name: etcd state: started #state: stopped #state: restarted #state: reloaded - name: 設置開機啓動 service: name: httpd enabled: yes
- name: 服務管理 systemd: name=etcd state=restarted enabled=yes daemon_reload=yes
- name: 解壓 unarchive: src=test.tar.gz dest=/tmp
執行過程當中打印語句。
- debug: msg: System {{ inventory_hostname }} has uuid {{ ansible_product_uuid }} - name: 顯示主機已知的全部變量 debug: var: hostvars[inventory_hostname] verbosity: 4
Playbooks是Ansible的配置,部署和編排語言。他們能夠描述您但願在遠程機器作哪些事或者描述IT流程中一系列步驟。使用易讀的YAML格式組織Playbook文件。
若是Ansible模塊是您工做中的工具,那麼Playbook就是您的使用說明書,而您的主機資產文件就是您的原材料。
與adhoc任務執行模式相比,Playbooks使用ansible是一種徹底不一樣的方式,而且功能特別強大。
https://docs.ansible.com/ansible/latest/user_guide/playbooks.html
--- - hosts: webservers vars: http_port: 80 server_name: www.ctnrs.com remote_user: root gather_facts: false tasks: - name: 安裝nginx最新版 yum: pkg=nginx state=latest - name: 寫入nginx配置文件 template: src=/srv/httpd.j2 dest=/etc/nginx/nginx.conf notify: - restart nginx - name: 確保nginx正在運行 service: name=httpd state=started handlers: - name: restart nginx service: name=nginx state=reloaded
- hosts: webservers remote_user: lizhenliang become: yes become_user: root
ansible-playbook nginx.yaml -u lizhenliang -k -b -K
變量是應用於多個主機的便捷方式; 實際在主機執行以前,變量會對每一個主機添加,而後在執行中引用。
命令行傳遞
-e VAR=VALUE
主機變量與組變量
在Inventory中定義變量。
[webservers] 192.168.1.100 ansible_ssh_user=root hostname=web1 192.168.1.100 ansible_ssh_user=root hostname=web2 [webservers:vars] ansible_ssh_user=root hostname=web1
Ansible中的首選作法是不將變量存儲在Inventory中。
除了將變量直接存儲在Inventory文件以外,主機和組變量還能夠存儲在相對於Inventory文件的單個文件中。
組變量:
group_vars 存放的是組變量
group_vars/all.yml 表示全部主機有效,等同於[all:vars]
grous_vars/etcd.yml 表示etcd組主機有效,等同於[etcd:vars]
# vi /etc/ansible/group_vars/all.yml work_dir: /data # vi /etc/ansible/host_vars/webservers.yml nginx_port: 80
- hosts: webservers vars: http_port: 80 server_name: www.ctnrs.com
- shell: /usr/bin/uptime register: result - debug: var: result
每一個play包含一系列任務。這些任務按照順序執行,在play中,全部主機都會執行相同的任務指令。play目的是將選擇的主機映射到任務。
tasks: - name: 安裝nginx最新版 yum: pkg=nginx state=latest
語法檢查:ansible-playbook --check /path/to/playbook.yaml
測試運行,不實際操做:ansible-playbook -C /path/to/playbook.yaml
debug模塊在執行期間打印語句,對於調試變量或表達式,而沒必要中止play。與'when:'指令一塊兒調試更佳。
- debug: msg={{group_names}} - name: 主機名 debug: msg: "{{inventory_hostname}}"
若是你有一個大的劇本,那麼可以在不運行整個劇本的狀況下運行特定部分可能會頗有用。
tasks: - name: 安裝nginx最新版 yum: pkg=nginx state=latest tags: install - name: 寫入nginx配置文件 template: src=/srv/httpd.j2 dest=/etc/nginx/nginx.conf tags: config
使用:
ansible-playbook example.yml --tags "install" ansible-playbook example.yml --tags "install,config" ansible-playbook example.yml --skip-tags "install"
條件:
tasks: - name: 只在192.168.1.100運行任務 debug: msg="{{ansible_default_ipv4.address}}" when: ansible_default_ipv4.address == '192.168.1.100'
循環:
tasks: - name: 批量建立用戶 user: name={{ item }} state=present groups=wheel with_items: - testuser1 - testuser2
- name: 解壓 copy: src={{ item }} dest=/tmp with_fileglob: - "*.txt"
經常使用循環語句:
語句 | 描述 |
---|---|
with_items | 標準循環 |
with_fileglob | 遍歷目錄文件 |
with_dict | 遍歷字典 |
vars: domain: "www.ctnrs.com" tasks: - name: 寫入nginx配置文件 template: src=/srv/server.j2 dest=/etc/nginx/conf.d/server.conf
# server.j2 {% set domain_name = domain %} server { listen 80; server_name {{ domain_name }}; location / { root /usr/share/html; } }
在jinja裏使用ansible變量直接 {{ }}引用。使用ansible變量賦值jinja變量不用{{ }}引用。
定義變量:
{% set local_ip = inventory_hostname %}
條件和循環:
{% set list=['one', 'two', 'three'] %} {% for i in list %} {% if i == 'two' %} -> two {% elif loop.index == 3 %} -> 3 {% else %} {{i}} {% endif %} {% endfor %}
例如:生成鏈接etcd字符串
{% for host in groups['etcd'] %} https://{{ hostvars[host].inventory_hostname }}:2379 {% if not loop.last %},{% endif %} {% endfor %}
裏面也能夠用ansible的變量。
Roles是基於已知文件結構自動加載某些變量文件,任務和處理程序的方法。按角色對內容進行分組,適合構建複雜的部署環境。
Roles目錄結構:
site.yml webservers.yml fooservers.yml roles/ common/ tasks/ handlers/ files/ templates/ vars/ defaults/ meta/ webservers/ tasks/ defaults/ meta/
tasks
-包含角色要執行的任務的主要列表。handlers
-包含處理程序,此角色甚至在此角色以外的任何地方均可以使用這些處理程序。defaults
-角色的默認變量vars
-角色的其餘變量files
-包含能夠經過此角色部署的文件。templates
-包含能夠經過此角色部署的模板。meta
-爲此角色定義一些元數據。請參閱下面的更多細節。一般的作法是從tasks/main.yml
文件中包含特定於平臺的任務:
# roles/webservers/tasks/main.yml - name: added in 2.4, previously you used 'include' import_tasks: redhat.yml when: ansible_facts['os_family']|lower == 'redhat' - import_tasks: debian.yml when: ansible_facts['os_family']|lower == 'debian' # roles/webservers/tasks/redhat.yml - yum: name: "httpd" state: present # roles/webservers/tasks/debian.yml - apt: name: "apache2" state: present
# site.yml - hosts: webservers roles: - common - webservers 定義多個: - name: 0 gather_facts: false hosts: all roles: - common - name: 1 gather_facts: false hosts: all roles: - webservers
- name: 0.系統初始化 gather_facts: false hosts: all roles: - common tags: common
編寫建議:
確保全部節點系統時間一致
下載Ansible部署文件:
git clone https://github.com/lizhenliang/ansible-install-k8s cd ansible-install-k8s
下載軟件包並解壓:
雲盤地址:https://pan.baidu.com/s/1lTXolmlcCJbei9HY2BJRPQ
tar zxf binary_pkg.tar.gz
修改hosts文件,根據規劃修改對應IP和名稱。
vi hosts
修改group_vars/all.yml文件,修改軟件包目錄和證書可信任IP。
vim group_vars/all.yml software_dir: '/root/binary_pkg' ... cert_hosts: k8s: etcd:
架構圖
單Master架構
多Master架構
部署命令
單Master版:
ansible-playbook -i hosts single-master-deploy.yml -uroot -k
多Master版:
ansible-playbook -i hosts multi-master-deploy.yml -uroot -k
若是安裝某個階段失敗,可針對性測試.
例如:只運行部署插件
ansible-playbook -i hosts single-master-deploy.yml -uroot -k --tags addons