Ansible 部署
Ansible 部署
1. 构建Ansible 清单
1.1 定义清单
清单定义Ansible将要管理的一批主机。这些主机也可以分配到组中,以进行集中管理。组可以包含子组,主机也可以是多个组的成员。清单还可以设置应用到它所定义的主机和组的变量。
可以通过两种方式定义主机清单。静态主机清单可以通过文本文件定义。动态主机清单可以根据需要使用外部信息提供程序通过脚本或其他程序来生成。
1.2 使用静态清单指定受管主机
静态清单文件是指定Ansible目标受管主机的文本文件。可以使用多种不同的格式编写此文件,包括INI样式或YAML。
在最简单的形式中。INI样式的静态清单文件是受管主机的主机名或IP地址的列表,每行一个:
alpha.example.org
beta.example.org
192.168.1.100
静态主机
[root@yibie ~]# cd /etc/ansible/
[root@yibie ansible]# ls
ansible.cfg hosts roles
[root@yibie ansible]# vim ansible.cfg //编辑文件添加新的指定ansible目标受管主机得文本文件
[defaults]
# some basic default values...
#inventory = /etc/ansible/hosts #被控端的主机列表文件
inventory = /etc/ansible/inventory
#library = /usr/share/my_modules/ #库文件存放目录
#module_utils = /usr/share/my_module_utils/#模块应用程序路径
#remote_tmp = ~/.ansible/tmp #临时文件远程主机存放目录
#local_tmp = ~/.ansible/tmp #临时文件本地存放目录
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml #插件过滤器
#forks = 5 #默认开启的并发数
#poll_interval = 15 #默认轮询时间间隔(单位秒)
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #是否需要sudo密码
#ask_pass = True #是否需要密码
#transport = smart #传输方式
#remote_port = 22 #默认远程主机的端口号
[root@yibie ansible]# touch inventory
[root@yibie ansible]# ls
ansible.cfg hosts inventory roles
[root@yibie ansible]# vim inventory //编辑文本文件,添加受管主机ip或主机名
[root@yibie ansible]# cat inventory
[webservers]
192.168.102.20
[root@yibie ansible]# ansible webservers --list-hosts
hosts (1):
192.168.102.20
1.3 验证清单
列出全部清单
[root@yibie ansible]# ansible all --list-hosts
hosts (5):
192.168.102.21
192.168.102.20
db-99-node.example.com
db-100-node.example.com
db-101-node.example.com
列出指定列表清单
[root@yibie ansible]# ansible webservers --list-hosts
hosts (1):
192.168.102.20
列出不属于任何组的受管主机
[root@yibie ansible]# ansible ungrouped --list-hosts
hosts (1):
192.168.102.21
2. 管理Ansible 配置文件
2.1 配置文件优先级
ansible的配置文件名为ansible.cfg,它一般会存在于四个地方:
- ANSIBLE_CONFIG:首先,Ansible命令会检查该环境变量,及这个环境变量将指向的配置文件
- ./ansible.cfg:当前工作目录,即当前执行ansible指令的目录,如果ANSIBEL_CONFIG环境变量未定义,则优先使用该配置文件
- ~/.ansible.cfg:当前用户家目录下的一个隐藏文件,如果当前工作目录下不存在ansible.cfg配置文件,则会查找用户家目录下的该隐藏文件
- /etc/ansible/ansible.cfg:默认配置文件,如果上面两个路径下的ansible.cfg都不存在,则使用该文件
需要说明的是,配置文件中所有的配置项都可以通过环境变量的方式来定义,而环境变量定义的配置项具有最高优先级,会覆盖掉所有配置文件中的配置项
2.2 配置文件的存放位置
可以使用:rpm -ql ansible | less 来查看ansible安装的所有路径
输出的目录比较多,主要分为下面几类:
配置文件目录: /etc/ansible
执行文件目录: /usr/bin
lib库依赖目录:/usr/lib/python2.7/site-packages/ansible
help文档目录:/usr/share/doc/ansible-2.7.5
man文档目录:/usr/share/man/man1/
2.3 配置文件详解
2.3.1 配置文件分段说明
- [defaults]:通用配置项
- [inventory]:与主机清单相关的配置项
- [privilege_escalation]:特权升级相关的配置项
- [paramiko_connection]:使用paramiko连接的相关配置项,Paramiko在RHEL6以及更早的版本中默认使用的ssh连接方式
- [ssh_connection]:使用OpenSSH连接的相关配置项,OpenSSH是Ansible在RHEL6之后默认使用的ssh连接方式
- [persistent_connection]:持久连接的配置项
- [accelerate]:加速模式配置项
- [selinux]:selinux相关的配置项
- [colors]:ansible命令输出的颜色相关的配置项
- [diff]:定义是否在运行时打印diff(变更前与变更后的差异)
2.3.2 配置参数说明
[default]
inventory = /etc/ansible/hosts
remote_user = root
ask_pass = false
log_path = /var/log/ansible.log
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
host_key_checking = False
2.3.3 配置文件设置
指令 | 描述 |
inventory | 指定清单文件的路径。 |
remote_user | 要在受管主机上登录的用户名。如果未指定则使用当前用户名。 |
ask_pass | 是否提示输入SSH密码。如果使用SSH公钥身份验证则可以是false。 |
become | 连接后是否自动在受管主机上切换用户(通常切换为root)这也可以通过play来指定 |
become_method | 如何切换用户(通常为sudo,这也是默认设置,但可选择su) |
become_user | 要在受管主机上切换到的用户(通常是root,这也是默认值) |
become_ask_pass | 是否需要为become_method提示输入密码。默认为false。 |
3. Ansible 模块
3.1 Ansible 查看帮助文档
[root@localhost ~]$ ansible [主机或组] -m [模块名] -a ['模块参数'] [ansible参数]
[root@localhost ~]$ ansible-doc -l # 列出所有模块
[root@localhost ~]$ ansible-doc cron # 查看指定模块的文档
3.2 Ansible 常用模块
根据官方的分类,将模块按功能分类为:云模块、命令模块、数据库模块、文件模块、资产模块、消息模块、监控模块、网络模块、通知模块、包管理模块、源码控制模块、系统模块、单元模块、web设施模块、windows模块。
- user:配置用户
- group:配置用户组
- cron:配置计划任务
- copy:复制文件到远程主机
- file: 用于配置文件属性
- yum:用于安装软件包
- service:用于管理服务
- shell: 用于执行命令可以带 “ |”管道符号等
- scripts:在远程主机执行控制端的脚本文件
- setup:查看远程主机的基本信息
- filesystem:在块设备上创建文件系统
- mount:配置挂载点
- synchronize:使用rsync同步文件
- get_url:该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)
- package:使用os包管理器安装,升级和删除包
- stat:获取远程主机文件状态信息。
- unarchive: 用于解压文件
- command:在远程主机上执行命令
- raw:类似于shell模块,支持管道
- ping:用于检测远程主机是否存活
3.3 模块使用案例
3.3.1 ping 模块
测试主机是否通的,用法很简单,如果成功就返回的是pong。
[root@yibie ~]# ansible localhost -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
[root@yibie ~]#
3.3.2 shell 模块
功能:执行的命令中有管道或者变量,就需要使用shell
[root@yibie ~]# ansible-doc -s shell
- name: Execute shell commands on targets
shell:
chdir: # 执行之前,先cd到指定目录在执行命令
cmd: # The command to run followed by optional arguments.
creates: # 一个文件名,当这个文件存在,则该命令不执行
executable: # 切换shell来执行命令,需要使用命令的绝对路径
free_form: # The shell module takes a free form command to run, as a
string. There is no actual
parameter named 'free form'.
See the examples on how to
use this module.
removes: # A filename, when it does not exist, this step will *not* be
run.
stdin: # Set the stdin of the command directly to the specified
value.
stdin_add_newline: # Whether to append a newline to stdin data.
warn: # Whether to enable task warnings.
[root@yibie ~]#
事例 -- shell模块可以支持| 等
[root@yibie ~]# ansible localhost -m shell -a 'netstat -lntup |grep 22'
localhost | CHANGED | rc=0 >>
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1890/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1274/sshd
tcp6 0 0 :::22 :::* LISTEN 1274/sshd
udp 0 0 192.168.122.1:53 0.0.0.0:* 1890/dnsmasq
[root@yibie ~]#
3.3.3 group 模块
group模块请求的是groupadd,groupdel,groupmod三个指令
- gid:指定组的gid
- name:指定用户组名
- state:是否创建还是删除
- present: (默认是创建用户)
- absent:删除用户
- system:是否为系统用户
案例 -- 创建一个用户组
[root@yibie ~]# ansible localhost -m group -a "name=yibie gid=1314 state=present"
localhost | CHANGED => {
"changed": true,
"gid": 1314,
"name": "yibie",
"state": "present",
"system": false
}
[root@yibie ~]#
执行结果
[root@yibie ~]# ansible localhost -m shell -a "tail -1 /etc/group"
localhost | CHANGED | rc=0 >>
yibie:x:1314:
[root@yibie ~]#
3.3.4 yum 模块
- onfig_file:yum的配置文件
- disable_gpg_check:关闭gpg_check
- disablerepo:不启用某个源
- enablerepo:启用某个源
- name:要进行操作的软件包的名字,也可以传递一个url或者一个本地的rpm包的路径
- state:定义软件包状态
- present:安装
- absent:删除
- latest:安装最新的
[root@yibie ~]# ansible localhost -m yum -a "name=httpd state=present"
localhost | SUCCESS => {
"ansible_facts": {
"pkg_mgr": "dnf"
},
"changed": false,
"msg": "Nothing to do",
"rc": 0,
"results": []
}
[root@yibie ~]#
执行结果
[root@yibie ~]# ansible localhost -m shell -a "rpm -qa |grep httpd"
localhost | CHANGED | rc=0 >>
httpd-filesystem-2.4.37-39.module_el8.4.0+778+c970deab.noarch
httpd-tools-2.4.37-39.module_el8.4.0+778+c970deab.x86_64
httpd-2.4.37-39.module_el8.4.0+778+c970deab.x86_64
centos-logos-httpd-85.8-1.el8.noarch
[root@yibie ~]#
3.3.5 user 模块
- -a "命令参数"
- name=xxx 用户名字
- shell=/sbin/nologin 登录的shell
- system=yes或no 设置为系统用户,但不能是已有的用户
- state=present或absent 状态
- remove=yes或no 删除家目录
[root@yibie ~]# ansible localhost -m user -a "name=yibie shell=/sbin/nologin system=yes"
localhost | CHANGED => {
"append": false,
"changed": true,
"comment": "",
"group": 1314,
"home": "/home/yibie",
"move_home": false,
"name": "yibie",
"shell": "/sbin/nologin",
"state": "present",
"uid": 1001
}
[root@yibie ~]#
删除用户
[root@yibie ~]# ansible localhost -m user -a "name=yibie remove=yes"
localhost | SUCCESS => {
"append": false,
"changed": false,
"comment": "",
"group": 1314,
"home": "/home/yibie",
"move_home": false,
"name": "yibie",
"shell": "/sbin/nologin",
"state": "present",
"uid": 1001
}
[root@yibie ~]#