Ansible以及常见模块应用
Playbook介绍
Ansible playbook剧本介绍
- 在ansible中,类似”脚本”的文件被称作”剧本”,英文名称为’playbook’ ,用于配置,部署,和管理被控节点
- 我们只需要把模块按照顺序编排在playbook剧本中,ansible就会按照剧本一步一步的执行,最终达到我们的目的
- playbook是由一个或多个”play”组成的列表,当我们在工作中往往需要不止做一件事情的时候,使用playbook会更加适合。
- playbook 与ad-hoc相比是一种完全不同的运用方式,剧本需要遵循YAML语法格式编写,文件名以”.yaml”或者”.yml”作为文件名后缀
playbook核心元素
- hosts:用于指定要执行指定任务(task)的主机,须事先定义在主机清单中
- tasks:任务集,由模板定义的操作列表
- variables:内置变量或自定义变量在playbook中调用
- tempaltes 模板,可替换文件中的变量并实现一些简单逻辑的文件
- handlers:任务,与tasks不同的是只有在接受到通知(notify)时才会被触发
查看帮助
- 命令:ansible-doc
- 常用选项:-l #列出所有模块列表-s #查看模块帮助信息
ansible执行
- Ansible命令返回值的颜色表示:
- 绿色:代表对远程节点不进行相应修改,没有发生改变,命令执行成功
- 黄色:代表对远程节点进行了相应的修改,命令执行成功
- 红色:代表你的命令执行失败或者是有异常
- 紫色:代表命令执行后发出的警告信息,给我们一些建议(可以忽略)
- Ansible执行命令的方式
- ad-hoc:在命令行执行的命令(临时命令)
- Playbook:将命令写入到Playbook剧本中
- playbook结果语法检测及模拟执行
- 语法检测,--syntax-check 用于检测playbook语法是否正确,如果正确只返回playbook名称
- 模拟执行,--check 用于模拟执行playbook
定义Ansible主机清单
- 定义主机清单
[root@ansible-server ~]# cat /home/ruanbo/ansible/hosts
[root@ansible-server ansible]# cat hosts
192.168.77.130
[test]
192.168.77.145 ansible_connection=ssh chapass=rb123456
192.168.77.146
[prod]
192.168.77.128
192.168.77.140
[dbserver:children]
prod
[range]
192.168.77.[10:15]
192.168.77.[30:40:3]
[all:vars]
#是否允许提权
ansible_become=true
#用户密码及密码
ansible_ssh_user=ruanbo
ansible_ssh_pass=123456
#提权方式,sudo或su
ansible_become_method=su
#提权用户及密码
ansible_become_user=root
ansible_become_pass=redhat
[test:vars]
password="123456"
列出主机清单列表
ansible -i hosts all --list-host
或者
ansible-inventory -i hosts all --graph
使用ping模块测试主机连通性
[root@ansible-server ~]# ansible -i hosts all -m ping
Playbook剧本包含内容说明
#使用ping模块测试远程主机联通性,并在远程主机创建目录
[root@ansible-server ~]# vim ping_test.yml
---
- hosts: test
remote_user: root
tasks:
- name: ping test
ping:
- name: mkdir directory test
shell:
cmd: mkdir /test
#第一行:playbook剧本以---开头表明yaml格式文件
#第二行:使用”- “作为开头,”- “表示一个列表项,”- “后面使用hosts关键字指定要操作的主机组名,(注意:横杠后面有空格)表示我要在websrvs这组主机上进行操作,在YAML语法中,键值对需要使用冒号作为分隔,而且冒号后边必须还要有一个空格作为分隔
#第三行:remote_user关键字可以指定在进行远程操作时使用哪个用户进行操作
#第四行:tasks关键字是用来指定要执行哪些操作任务,之后的行都属于tasks任务列表中的任务,每个任务都以”- “开头,每个任务都有自己的名字,任务名使用name关键字进行指定
Ansible常用模块介绍
command 模块
- command模块为默认模块,用于远程执行命令(命令模块)
- 注意:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处理,在使用command模块时,如果需要执行的命令中含比如”<“, “>”, “|”, “;” 和 “&” 这些符号时,这些符号的功能也会失效
- 常用参数:
- chdir:此参数表示执行命令之前,会先进入到指定的目录中
- creates:此参数表示文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行
- removes:此参数表示文件如果不存在于远程主机中,则不执行对应命令,如果存在 ,才执行
- command模块示例:
#chdir参数表示执行命令之前,会先进入到指定的目录中
[root@ansible-server ~]# ansible test -m command -a 'chdir=/root/ ls'
#creates参数表示如果/etc/passwd文件存在于远程主机中,则不执行对应命令,如果不存在,才执行”touch”命令
[root@ansible-server ~]# ansible test -m command -a 'creates=/etc/passwd touch /opt/passwd'
#removes参数表示如果/opt/abc文件不存在,就不执行“mv”命令,如果文件存在则执行“mv”命令
[root@ansible-server ~]# ansible test -m command -a 'removes=/opt/abc mv /opt/abc /root/'
shell 模块
- shell 模块,远程执行命令模块,和command模块类似,区别在于shell模块通过/bin/bash程序处理命令
- 常用参数
- chdir:此参数表示执行命令之前,会先进入到指定的目录中
- creates:此参数表示文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行
- removes:此参数表示文件如果不存在于远程主机中,则不执行对应命令,如果存在 ,才执行
- shell 模块示例:
#查看/etc/passwd文件,并通过管道符传递给“wc -l”统计文件行数
[root@ansible-server ~]# ansible websrvs -m shell -a 'cat /etc/passwd | wc -l'
#通过chdir参数进入/opt/目录,执行“ls”
[root@ansible-server ~]# ansible websrvs -m shell -a 'chdir=/opt/ ls'
#查看主机名
[root@ansible-server ~]# ansible websrvs -m shell -a 'hostname'
script 模块
- script 模块用于远程执行脚本,脚本存放在ansible主机本地,不需要拷贝到远程主机
- 常用参数:
- chdir:此参数表示执行命令之前,会先进入到指定的目录中
- creates:此参数表示文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行命令
- removes:此参数表示文件如果不存在于远程主机中,则不执行对应命令,如果存在 ,才执行命令
- script模块示例:
#在ansible主机本地编写搭建yum仓库脚本
[root@ansible-server ~]# vim local_centos7.sh
#!/bin/bash
echo "[local_centos7]
name=local_centos7
baseurl=http://192.168.77.130/centos7.9/
enabled=1
gpgcheck=0" > /etc/yum.repos.d/local_centos7.repo
#编写playbook文件
[root@ansible-server ansible]# vim playbook/script.yml
---
- name: configure local-yum
hosts: test
tasks:
- name: Run a script with arguments (free form)
script: /home/ruanbo/ansible/local_centos7.sh
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/script.yml
yum 模块
- yum 模块,用于在远程主机通过yum源管理软件包
- 常用参数:
- present:此状态为默认值,表示安装软件包
- installed:此状态表示安装软件包,与present等效
- latest:此状态表示安装yum中最新版本软件包
- removed:此状态表示删除对应软件包
- absent:此状态表示删除对应软件包,与removed等效
- name:必须参数,用于指定需要管理的软件包名字
- state:用于指定软件包的状态
yum模块示例:
#利用ansible实现批量安装软件包
[root@ansible-server ~]# vim /home/ruanbo/ansible/playbook/yum-install.yml
---
- name: install packages
hosts: test
tasks:
- name: ensure a list of packages installed
yum:
name: "{{ packages }}"
state: installed
vars:
packages:
- httpd
- httpd-tools
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/yum-install.yml
service 模块
- service 模块,用于管理远程主机的服务,如:启动或停止服务
- 常用参数:
- name:此参数用于指定需要操作的服务名称,如 httpd
- state:此参数用于指定服务的状态started:此状态用于启动服务restarted:此状态用于重启服务stopped:此状态用于停止服务
- enabled:此参数用于指定是否将服务设置为开机启动项,设置为yes或者no
#利用ansible实现批量启动web服务并设置开机自启动
[root@ansible-server ansible]# vim playbook/service.yml
---
- name: manager services
hosts: test
tasks:
- name: Start service httpd, if not started
service:
name: httpd
state: started
enabled: yes
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/service.yml
copy 模块
- copy 模块,用于将文件复制到远程主机
- 常用参数:
- src:此参数用于指定需要拷贝的文件或目录
- content:此参数当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一
- dest:此参数用于指定文件将拷贝到远程主机的哪个目录中,dest为必须参数
- owner:指定文件拷贝到远程主机后的属主
- group:指定文件拷贝到远程主机后的属组
- mode:指定文件拷贝到远程主机后的权限
- force:当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖
- backup:当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份
#利用ansible实现批量下发文件到客户端主机
[root@ansible-server ansible]# vim playbook/copy.yml
---
- name: copy application
hosts: test
tasks:
- name: Copy file with owner and permissions
copy:
src: /home/ruanbo/ansible/playbook/service.yml
dest: /tmp/foo.conf
owner: foo
group: foo
mode: '0644'
backup: yes
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/copy.yml
fetch 模块
- fetch模块,从远程主机获取文件到ansible管理节点
- 常用参数:
- src:指定从受管主机中拉取哪个文件
- dest:指定拉取文件到本地以后文件存放的位置
#利用ansible实现批量拉取客户端主机文件到ansible管理节点
[root@ansible-server ansible]# cat playbook/fetch.yml
---
- name: fetch file
hosts: test
tasks:
- name: Specifying a path directly
fetch:
src: /tmp/test
dest: /tmp/test-{{ inventory_hostname }}
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/fetch.yml
user 模块
- user 模块,用于管理用户,如用户的创建及删除
- 常用参数:
- name:需要用于被操作的对象用户名称
- password:用户密码,需要通过hash加密
- remove:是否删除一个用户
#利用ansible实现批量创建用户并设置密码
[root@ansible-server ansible]# cat playbook/useradd.yml
---
- name: add user
hosts: test
tasks:
- name: Add the user 'johnd' with a specific uid and a primary group of 'admin'
user:
name: johnd
password: "{{'123456' | password_hash('sha512')}}"
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/useradd.yml
lineinfile 模块
- lineinfile 模块,常用于对文件的行替换、插入、删除
- 常用参数:
- path:指定要操作的文件对象
- line:要写入文件的内容
- regexp:匹配条件
- insertbefore:在某行之前插入
- insertafter:在某行之后插入
- backup: 执行配置任务前是否先进行备份,yes|no
#利用ansible实现批量修改配置文件,包括管理selinux,配置hosts解析,修改web服务端口
[root@ansible-server ansible]# vim playbook/chage_config.yml
---
- name: change config
hosts: test
tasks:
- name: Ensure SELinux is set to enforcing mode
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: SELINUX=enforcing
- name: Replace a localhost entry with our own
lineinfile:
path: /etc/hosts
regexp: '^127\.0\.0\.1'
line: 127.0.0.1 localhost
owner: root
group: root
mode: '0644'
- name: Ensure the default Apache port is 8080
lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
insertafter: '^#Listen '
line: Listen 8080
notify: restart httpd
handlers:
- name: restart httpd
service:
name: httpd
state: restarted
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/chage_config.yml
yum_repository模块
- yum_repository模块:管理yum仓库
- 常用参数:
- name:指定唯一的仓库ID
- baseurl:指定yum仓库repodata目录的URL,可以是多个,如果设置为多个,需要使用"metalink"和"mirrorlist"参数
- enabled:使用此yum仓库
- gpgcheck:是否对软件包执行gpg签名检查
- gpgkey:gpg秘钥的URL
- mode:权限设置
- state:状态,默认的present为安装此yum仓库,absent为删除此yum仓库
- description:设置仓库的注释信息
#利用ansible实现批量配置yum源
[root@ansible-server ansible]# vim playbook/yum_repository.yml
---
- name: add yum repodata
hosts: test
tasks:
- name: Add repository
yum_repository:
name: yumlocal
description: EPEL YUM repo
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
gpgcheck: no
enabled: yes
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/yum_repository.yml
file模块
- file模块,创建或者和删除远程主机上的文件或者目录
- 常用参数:
- path:用于指定要操作的文件或目录
- mode:设置文件属性
- owner:所有者
- group:所属组
- recurse:当文件为目录时,是否进行递归设置权限
- state:touch :创建文件directory:创建目录absent:删除文件或者目录或者链接文件link或hard:创建链接文件
#利用ansible实现批量创建文件
[root@ansible-server ansible]# vim playbook/file.yml
---
- name: mkdir dir
hosts: test
tasks:
- name: Create a directory if it does not exist
file:
path: /tmp/test/test/
state: directory
mode: '0750'
recurse: yes
owner: ruanbo
group: ruanbo
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/file.yml
cron模块
- cron模块,用于管理远程主机中的计划任务
- 常用参数:
- name:此参数用于设置计划任务的名称,计划任务的名称会在注释中显示
- job:此参数用于指定计划的任务中需要实际执行的命令或者脚本
- user:此参数用于设置当前计划任务属于哪个用
- state参数:当计划任务有名称时,可以根据名称修改或删除对应的任务
- minute:此参数用于设置计划任务中分钟设定位的值,默认值为”*”
- hour:此参数用于设置计划任务中小时设定位的值,默认值为”*”
- day:此参数用于设置计划任务中日设定位的值,默认值为”*”
- month:此参数用于设置计划任务中月设定位的值,默认值为”*”
- weekday:此参数用于设置计划任务中周几设定位的值,默认值为”*”
#利用ansible实现批量为指定用户创建定时任务
[root@ansible-server ansible]# cat playbook/cron.yml
---
- name: configure cron
hosts: test
tasks:
- name: date >> /tmp/datetime
cron:
name: "check dirs"
minute: "*/1"
job: "date >> /tmp/datetime"
user: ruanbo
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/cron.yml
多任务应用场景举例
利用Playbook源码部署Nginx的Web服务
[root@ansible-server ~]# vim nginx.yml
---
- hosts: websrvs
remote_user: root
tasks:
- name: Copy nginx
copy: src=/root/nginx-1.18.0.tar.gz dest=/tmp
- name: install Rely
yum: name=gcc,pcre-devel,openssl-devel,zlib
- name: unpacek nginx
shell: tar -xf /tmp/nginx-1.18.0.tar.gz -C /tmp
- name: install nginx
shell: cd /tmp/nginx-1.18.0 && ./configure && make && make install
- name: Copy index.html
copy: src=/root/index.html dest=/usr/local/nginx/html
- name: start nginx
shell: /usr/local/nginx/sbin/nginx
利用Playbook安装http应用并启动服务
[root@ansible-server ansible]# vim playbook/httpd.yml
---
- name: install httpd and start httpd
hosts: test
tasks:
- name: install httpd
yum:
name: "{{ packages }}"
state: installed
vars:
packages:
- httpd
- httpd-tools
- name: Start service httpd, if not started
service:
name: httpd
state: started
enabled: yes
#执行playbook
[root@ansible-server ansible]# ansible-playbook playbook/httpd.yml