
Ansible 是一種IT自動化工具。它可以配置系統,部署軟件以及協調更高級的IT任務,例如持續部署,滾動更新。Ansible 適用于管理企業IT基礎設施,從具有少數主機的小規模到數千個實例的企業環境。Ansible 也是一種簡單的自動化語言,可以完美地描述IT應用程序基礎結構。
具備以下三個特點:
(資料圖片僅供參考)
使用文檔:??https://releases.ansible.com/ansible/??
安裝 Ansible:
yum -y install ansibleInventory:Ansible管理的主機信息,包括IP地址、SSH端口、賬號、密碼等Modules:任務均有模塊完成,也可以自定義模塊,例如經常用的腳本。Plugins:使用插件增加Ansible核心功能,自身提供了很多插件,也可以自定義插件。例如connection插件,用于連接目標主機。Playbooks:“劇本”,模塊化定義一系列任務,供外部統一調用。Ansible核心功能。
[webservers] 192.168.20.232 192.168.20.233 192.168.20.234 192.168.20.235 192.168.20.236 [dbservers] db01.intranet.mydomain.net db02.intranet.mydomain.net 10.25.1.232 10.25.1.233
ssh-keygen -t rsa ssh-copy-id -i /root/.ssh/id_rsa.pub -p "20100" "root@192.168.20.231" ssh-copy-id -i /root/.ssh/id_rsa.pub -p "20100" "root@192.168.20.232" ssh-copy-id -i /root/.ssh/id_rsa.pub -p "20100" "root@192.168.20.23 chown 0700 -R /root/.ssh/ cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys chown root.root -R /root/.ssh/ cd /root/.ssh/
sed -i "s/#host_key_checking = .*/host_key_checking = False/g" /etc/ansible/ansible.cfg
SSH密碼認證:
[webservers] 192.168.20.232:20100 ansible_ssh_user=root ansible_ssh_pass=’200271200’ 192.168.20.233:20100 ansible_ssh_user=root ansible_ssh_pass=’200271200’ 192.168.20.234:20100 ansible_ssh_user=root ansible_ssh_port=’200271200’ [dbservers] db01.intranet.mydomain.net db02.intranet.mydomain.net 10.25.1.56 10.25.1.57
SSH密鑰對認證:
[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 也可以在配置文件中指定: [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 shell -a "ls /root" -u root -k
ansible-doc –l 查看所有模塊
ansible-doc –s copy 查看模塊文檔
在目標主機執行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:表示卸載
軟件包管理。
ansible webservers -m yum -a "name=http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.16.1-1.el7.ngx.x86_64.rpm state=present" ansible webservers -m systemd -a "name=http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.16.1-1.el7.ngx.x86_64.rpm state=restarted enabled=yes"
- 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/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm # name: /usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm state: present
管理服務。
- name: 服務管理 service: name: httpd state: started #state: stopped #state: restarted #state: reloaded - name: 設置開機啟動 service: name: httpd enabled: 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
變量是應用于多個主機的便捷方式; 實際在主機執行之前,變量會對每個主機添加,然后在執行中引用。
[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
- shell: /usr/bin/uptime register: result - debug: var: result verbosity: 2
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: root become: yes become_user: lizhenliang
Ansible中的首選做法是不將變量存儲在Inventory中。
除了將變量直接存儲在Inventory文件之外,主機和組變量還可以存儲在相對于Inventory文件的單個文件中。
- hosts: webservers vars: http_port: 80 server_name: www.ctnrs.com
每個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:"指令一起調試更佳。
- hosts: webservertasks:- debug:msg: {{group_names}}- debug:msg: {{inventory_hostname}}- debug:msg: {{ansible_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 | 遍歷字典 |
tasks: - name: 寫入nginx配置文件 template: src=/srv/httpd.j2 dest=/etc/nginx/nginx.conf
定義變量:
{% 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
組變量:
group_vars 存放的是組變量
group_vars/all.yml 表示所有主機有效,等同于[all:vars]
grous_vars/etcd.yml 表示etcd組主機有效,等同于[etcd:vars]
角色 | IP | 組件 |
k8s-master1 | 192.168.31.61 | kube-apiserver kube-controller-manager kube-scheduler etcd |
k8s-master2 | 192.168.31.62 | kube-apiserver kube-controller-manager kube-scheduler |
k8s-node1 | 192.168.31.63 | kubelet kube-proxy docker etcd |
k8s-node2 | 192.168.31.66 | kubelet kube-proxy docker etcd |
Load Balancer(Master) | 192.168.31.61 192.168.31.60 (VIP) | nginx keepalived |
Load Balancer(Backup) | 192.168.31.62 | nginx keepalived |
編寫建議:
梳理流程和Roles結構如果配置文件有不固定內容,使用jinja渲染人工干預改動的內容應統一寫到一個文件中確保所有節點系統時間一致
下載Ansible部署文件:
git clone https://github.com/lizhenliang/ansible-install-k8s cd ansible-install-k8s
修改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
示例參考:??https://github.com/ansible/ansible-examples??