文章目录
Ansible简介
Ansible是什么
- Ansible是近年越来越火的一款运维自动化工具,其主要功能是帮助运维实现IT工作的自动化、降低人为操作失误、提高业务自动化率、提升运维工作效率。
- 常用于软件部署自动化、配置自动化、管理自动化、系统化系统任务、持续集成、零宕机平滑升级等。
- 常见的部署管理工具有Chef、Puppet、Ansible、SaltStack、Fabric.
- Ansible发布于2012年,其作者兼创始人是Michael DeHaan。
- 红帽2015收购了Ansible母公司。
为什么选择Ansible
-
Ansible完全基于Python开发,而DevOps在国内已然是一种趋势,Python被逐步普及,运维人员自己开发工具的门槛逐步降低,得益于此,方便对Ansible二次开发。
-
Ansible丰富的内置模块,甚至还有专门为商业平台开发的功能模块,完全可以满足日常功能所需。
-
在Ansible去中心化概念下,一个简单的复制操作即可完成管理配置中心的迁移。
-
Agentless(无客户端),客户端无需任何配置,由管理端配置好后即可使用,这点非常诱人。
Ansible是如何工作的
-
Ansible没有客户端,因此底层通信依赖于系统软件,Linux系统下基于OpenSSH通信,Windows系统下基于PowerShell,管理端必须是Linux系统。
-
根据Ansible使用过程中的不同角色,将其分为:
1 使用者
2 Ansible工具集
3 作用对象 -
Ansible使用者来源于多种维度,分为以下几种方式:
1 CMDB存储和管理着企业IT架构中的各项配置信息,运维人员可以组合CMDB和Ansible,通过CMDB直接下发指令调用Ansible工具集完成 操作者所希望达成的目标。
2 基于PUBLIC(公有云)/PRIVATE(私有云),Ansible以API调用的方式运行,Ansible提供了丰富的API语言接口:PHP、Python等。
3 直接使用Ad-Hoc临时命令集调用Ansible工具集来完成任务执行。
4 通过执行Playbooks中预先编排好的任务集按序完成任务执行。
Ansible通信机制
Ansible主推的卖点是其无需任何Daemon维护进程即可实现相互间的通信,且通信方式是基于业内统一标准的安全可靠的SSH安全连接。
无客户端,只需安装SSH、Python即可。
基于OpenSSH通信,底层基于SSH协议(Windows基于PowerShell)。
支持密码和SSH认证,建议使用公私钥方式认证,因为密码认证方式的密码需明文写配置文件,虽然配置文件可加密,但会增加Ansible使用的复杂度。
Ansible应用场景
应用部署
Ansible内置网络、应用、系统、第三方云平台扩展等完善的功能模块,协助运维快速完成应用的安装、卸载、升级、启停、配置等部署类工作,即使对跨平台或知名的商业硬件也同样支持。
配置管理
Ansible内置File、Template,结合Jinja、Lineinfile等内置模块,同时无缝结合GitHub、GitLab、Git、SVN、Jenkins等主流版本控制和CI持续集成工具,助力配置管理自动化。
任务流编排
有效保证Tasks任务流按既定规则和顺序完成事先制订的目标和计划,同时Roles编排方式又能在一定程度上从书写习惯和代码层编排上保证整体项目的可架构性和规范性,协助控制项目维护成本不致过高。
适用于网络管理员、系统运维、应用运维、桌面运维、DevOps、基础架构运维等多领域运维行业,上手快,效率高。
Ansible 安装
要安装ansible只需要配置epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install -y ansible
[root@server1 ~]# ansible --version
ansible 2.9.10
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Sep 12 2018, 05:31:16) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
Ansible配置
新建devops用户
在家目录下新建ansible目录
[devops@server1 ~]$ tree
.
└── ansible
├── ansible.cfg
└── hosts
1 directory, 2 files
ansible.cfg
[devops@server1 ansible]$ cat ansible.cfg
[defaults]
inventory = ./hosts
[privilege_escalation]
become = True
become_method = sudo
become_user = root
become_ask_pass = False
hosts
[test]
server2
server3
server4
远程受管主机 需要新建devops用户 并且ssh免密 拥有sudo权限
Ansible配置清单
- Inventory文件配置
Inventory是Ansible管理主机信息的配置文件,相当于系统HOSTS文件的功能,默认存放在/etc/ansible/hosts。可以使用 -i 选项指定 - 定义主机和组
中括号表示一个组,也可以表示一个范围
[webserver]
www[1:10].example.com
db-[a:f].example.com
- 定义主机变量
在playbook中使用时对主机进行个性化定制
[webserver]
web1 http_port=8080 maxRequestsPerChild=1024
- 定义组变量
[webserver]
server2
server3
[webserver:vars]
ntp_server=time1.aliyun.com ##webserver组中的所有主机ntp_server值为time1.aliyun.com
- 定义组嵌套及组变量
在 inventory 主文件中保存所有的变量并不是最佳的方式.还可以保存在独立的文件中:
这些独立文件的格式为 YAML
/etc/ansible/group_vars/raleigh
/etc/ansible/group_vars/webservers
/etc/ansible/host_vars/foosball
当变量变得太多时,分文件定义变量更方便进行管理和组织
/etc/ansible/group_vars/raleigh/db_settings
/etc/ansible/group_vars/raleigh/cluster_settings - 变量的检索位置
Inventory配置文件(默认/etc/ansible/hosts)
Playbook中vars定义的区域
Roles中vars目录下的文件
Roles同级目录group_vars和hosts_vars目录下的文件
Ansible ad-hoc 模式
Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook,在学习了 playbooks 之后,你才能体会到 Ansible 真正的强大之处在哪里。
Ad-hoc更注重于解决一些简单或者平时工作中临时遇到的任务,相当于Linux系统命令行下的Shell命令,后者更适合于解决复杂或需固化下来的任务,相当于Linux系统的Shell Scripts。
查看所有模块 ansible-doc
[root@server1 ansible]# ansible-doc -l | wc -l
3387
常用模块
常用模块
ansible模块
文件模块:
-copy:将本地文件复制到受管主机
-file:设置文件的权限和其他属性
-lineinfile:确保特定行是否在文件中
-synchronize:使用rsync同步内容
系统模块:
-firewalld:使用firewalld管理任意端口和服务
-reboot:重启
-service:管理服务
-user:添加、删除和管理用户账户
Net Tools模块:
-get_url:通过http、https、或者ftp下载文件
-nmcli:管理网络
-uri:与web服务交互
playbook编写
- Playbook与ad-hoc相比,是一种完全不同的运用。
- playbook是一种简单的配置管理系统与多机器部署系统的基础,且非常适合于复杂应用的部署。
- playbook中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤,并且可以同步或异步的发起任务。
- 使用playbook可以方便的重用这些代码,可以移植到不同的机器上面。
- playbook才是ansible真正强大之处。
yaml语法
对于Ansible,几乎每个YAML文件都以列表开头。列表中的每个项目都是键/值对的列表,通常称为“哈希”或“字典”。因此,我们需要知道如何在YAML中编写列表和字典。
YAML还有一个小怪癖。所有YAML文件(无论是否与Ansible关联)都可以选择以—和开头…。这是YAML格式的一部分,指示文档的开始和结束。
列表中的所有成员都是以相同的缩进级别开头的行,并以(破折号和空格)开头:"- "
部署apache
- hosts: webservers
vars:
http_port: 8000
tasks:
- name: ensure apache is at the latest version
yum:
name: httpd
state: latest
- name: write the apache config file
template:
src: templates/httpd.conf
dest: /etc/httpd/conf/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service:
name: httpd
state: started
- name: start firewalld
service:
name: firewalld
state: started
- name: open httpd port
firewalld:
port: "{{ http_port }}/tcp"
permanent: yes
state: enabled
immediate: yes
handlers:
- name: restart apache
service:
name: httpd
state: restarted
执行结果
[devops@server1 ansible]$ ansible-playbook httpd.yml -b
PLAY [webservers] ****************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [server2]
TASK [ensure apache is at the latest version] ************************************************************************************************************************************************************************************************
ok: [server2]
TASK [write the apache config file] **********************************************************************************************************************************************************************************************************
changed: [server2]
TASK [ensure apache is running] **************************************************************************************************************************************************************************************************************
ok: [server2]
TASK [start firewalld] ***********************************************************************************************************************************************************************************************************************
ok: [server2]
TASK [open httpd port] ***********************************************************************************************************************************************************************************************************************
changed: [server2]
RUNNING HANDLER [restart apache] *************************************************************************************************************************************************************************************************************
changed: [server2]
PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
server2 : ok=7 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Ansible 变量
Ansible facts
[devops@server1 ansible]$ cat facts.yml
---
- hosts: all
tasks:
- name: copy file
template:
src: templates/facts.j2
dest: /tmp/facts
[devops@server1 ansible]$ cat templates/facts.j2
hostname: {{ ansible_hostname }}
ip adress: {{ ansible_eth0["ipv4"]["address"] }}
dns: {{ ansible_dns["nameservers"][-1] }}
Ansible loop循环和变量文件
[devops@server1 ansible]$ cat creatuser.yml
---
- hosts: all
vars_files:
- vars/userlist.yml
tasks:
- name: creat user
user:
name: "{{ item.user }}"
password: "{{ item.passwd | password_hash('sha512') }}"
state: present
loop: "{{ userlist }}"
[devops@server1 ansible]$ cat vars/userlist.yml
userlist:
- user: user1
passwd: westos
- user: user2
passwd: westos
- user: user3
passwd: westos
[root@server2 ~]# id user1
uid=1001(user1) gid=1001(user1) groups=1001(user1)
[root@server2 ~]# id user2
uid=1002(user2) gid=1002(user2) groups=1002(user2)
[root@server2 ~]# id user3
uid=1003(user3) gid=1003(user3) groups=1003(user3)