Ansible大纲:
Ansible被红帽收购--->
什么是Ansible
Ansible特性\优点....
Ansible基础架构 (控制端\被控端\inventory\ad-hoc\playbook\连接协议....)
Ansible安装
ANsible配置
Ansible inventory
Ansible Ad-hoc shell命令
Ansible playbook shell脚本 YAML
-
变量 variables
变量优先级
判断语句
循环语句
异常处理
tag标签
handlers触发器
include包含
ansible jinja模板
keeplaived
nginx_proxy
ansible role角色
编排工具--->清晰目录规划--->严格按照目录规划来
ansible galaxy
ansible tower
ansible部署集群架构
ansile 配置文件存在优先级的问题
ANSIBLE_CONFIG
anslibe.cfg 项目目录
.ansible.cfg 当前用户的家目录
/etc/ansible/ansible.cfg
1.5 ansilbe主机清单host
#方法1
[webservers]
192.168.6.21 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='jinlong431//'
192.168.6.22 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='jinlong431//'
#方法2
[webserver]
web[1:2].oldboy.com ansible_ssh_pass='jinlong431//'
#方法3
[webserver]
web[1:2].oldboy.com
[webserver:vars]
ansible_ssh_pass='jinlong431//'
列出组内所有 机器:
ansible webservers1 --list-hosts
1.7 使用ad-hoc执行一次远程命令,注意观察返回结果的颜色
绿色:代表被管理端主机没有被修改
黄色:代表被管理端主机发现变更
红色:代表出现了故障,注意查看提示。
1.7.1 首先学习的三个模块
- 命令 command shell scripts
- 安装 yum
- 配置 copy file get_url
- 启动 service systemd
- 用户 user group
- 任务 cron
- 挂载 mount
- 防火墙 selinux firewall
- command shell 本质上执行的都是shell命令
- command 不能使用管道符
1.7.2 yum模块
示例1. 安装当前最新的apache软件,如果存在则更新
ansible webservers1 -m yum -a "name=httpd state=latest"
示例2. 安装单项最新的Apache软件,通过epel仓库安装
ansible webservers1 -m yum -a "name=httpd state=latest enablerepo=epel"
示例3. 通过公网URL安装rpm软件
ansible webservers1 -m yum -a "name=https://zabbix.rpm state=latest"
示例4. 更新所有的软件包,大排除和kernel有关的
ansible webservers1 -m yum -a "name="*" state=latest exclude=kernel*"
示例5. 删除Apache软件
ansible webservers1 -m yum -a "name=httpd state=absent"
1.8 ansible 常用模块-copy
-
src dest owner group mode backup content
修改httpd.conf 文件 ,监听端口改为9999
将文件下发到各个主机
ansible webservers1 -m copy -a "src=./httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644"
- backup 参数的使用,当文件发生变化的时候,会备份一份新的文件。
ansible webservers1 -m copy -a "src=./httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644 backup=yes"
4. 在被控端加入文件,并文件写入内容
ansible webservers1 -m copy -a "content=HttpServer... dest=/var/www/html/index.html"
1.9 get_url
-
示例1 下载互联网文件至本地
ansible webservers1 -m get_url -a "url=https://www.baidu.com dest=/var/www/html/"
-
示例2 文件md5效验
ansible webservers1 -m get_url -a "url=http://xxx.xx.xx dest=/var/www/html/ checksum=md5:xxxx"
file模块:创建文件夹 授权
state touch directory
recurse
owner group mode
-
示例1 创建文件
ansible webservers1 -m file -a "path=/var/www/html/tt.html state=touch owner=apache group=apache mode=644"
-
示例2
-
穿件目录:
ansible webservers1 -m file -a "path=/var/www/html/dd state=directory owner=apache group=apache mode=644"
-
修改权限:
ansible webservers1 -m file -a "path=/var/www/html/dd state=directory owner=apache group=apache mode=755"
-
给递归权限
ansible webservers1 -m file -a "path=/var/www/html/ state=directory owner=apache group=apache mode=755 recurse=yes"
-
1.10 ansible常用模块service
-
示例1 启动httpd服务
ansible webservers1 -m service -a "name=httpd state=started"
-
示例2 重载httpd服务
ansible webservers1 -m service -a "name=httpd state=reloaded"
-
示例3 重启httpd服务
ansible webservers1 -m service -a "name=httpd state=restarted"
-
例4 停止httpd服务
ansible webservers1 -m service -a "name=httpd state=stopped"
-
示例5 启动httpd服务,并加入开机自启
ansible webservers1 -m service -a "name=httpd state=started enabled=yes"
1.11 ansible 常用的group模块
-
示例1 创建一个news组 gid=9999
ansible webservers1 -m group -a "name=news gid=9999"
-
示例2 创建一个http系统组 制定gid=8888
ansible webservers1 -m group -a "name=http gid=8888 system=yes"
-
示例3 删除一个news组
ansible webservers1 -m group -a "name=news state=absent"
ansible常用模块user模块
-
示例1 创建joh用户,uid是1040,主要的组是adm
ansible webservers1 -m user -a "name=joh uid=1040 group=adm"
-
示例2 创建joh用户,登录shell是/sbin/nologin,追加bin、sys两个组
ansible webservers1 -m user -a "name=joh shell=/sbin/nologin groups=bin,sys"
-
示例3 创建jsm用户,为其添加123 作为登录密码,并创建家目录
ansible localhost -m debug -a "msg={{ '123' |password_hash('sha512','salt')}}"
salt$jkHSO0tOjmLW0S1NFlw5veSIDRAVsiQQMTrkOKy4xdCCLPNIsHhZkIRlzfzIvKyXeGdOfCBoW1wJZPLyQ9Qx/1
ansible webservers1 -m user -a 'name=jsm password=$6$salt$jkHSO0tOjmLW0S1NFlw5veSIDRAVsiQQMTrkOKy4xdCCLPNIsHhZkIRlzfzIvKyXeGdOfCBoW1wJZPLyQ9Qx/1 create_home=yes'
-
示例4 移除joh用户
ansible webservers1 -m user -a 'name=joh state=absent'
-
示例5 创建http用户,并为该用户创建2048字节的私钥,存放在~/http/.ssh/id_rsa
ansible webservers1 -m user -a 'name=http generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa'
1.12 ansible 常用模块-cron
-
示例1 添加定时任务。每分钟执行一次ls * * * * * * ls > /dev/null
ansible webservers1 -m cron -a "name=job1 job='ls > /dev/null'"
-
示例2 添加定时任务,每天的凌晨2点和凌晨5点执行一次ls。 0 5,2 * * ls > /dev/null
ansible webservers1 -m cron -a "name=job2 minute=0 hour=5,2 job='ls > /dev/null'"
-
示例3 关闭定时任务,使定时任务失效
ansible webservers1 -m cron -a "name=job2 minute=0 hour=5,2 job='ls > /dev/null' disabled=yes”
mount 模块
mounted 先挂载,再将挂载信息写入/etc/fstab absent 卸载临时,也会清理/etc/fstab
present 将挂载信息写入/etc/fstab unmounted 卸载临时,不会清理/etc/fstab
-
示例1 挂载nfs存储到本地目录/opt 并实现自动挂载
ansible webservers1 -m mount -a "src=192.168.6.149:/data path=/opt fstype=nfs opts=defaults state=mounted"
-
示例2 临时卸载nfs的挂载,但是不会清理/etc/fstab
ansible webservers1 -m mount -a "src=192.168.6.149:/data path=/opt fstype=nfs opts=defaults state=unmounted"
-
示例3 永久卸载nfs,会清理/etc/fstab
ansible webservers1 -m mount -a "src=192.168.6.149:/data path=/opt fstype=nfs opts=defaults state=absent"
selinux模块
关闭selinux
ansible webservers1 -m selinux -a "state=disabled"
** 如果报错
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: ModuleNotFoundError: No module named 'selinux'
** 在受控客户端安装:
yum -y install libseliunx-python3
firewalld模块
-
示例1 永久放行https的流量,只有重启才会生效
ansible webservers1 -m firewalld -a "zone=public service=https permanent=yes state=enabled"
-
示例2 永久放行8080端口,只有重启才能生效
ansible webservers1 -m firewalld -a "zone=public port=8080/tcp permanent=yes state=enabled"
-
示例3 放行8080-8090端口的tcp流量,临时和永久都生效。
ansible webservers1 -m firewalld -a "zone=public port=8080-8090/tcp permanent=yes immediate=yes state=enabled"
1.13 playbook
playbook 剧本
play (找谁)
task (干什么)
找一个人干多件事情 playbook 1个play 多个task
找多个人干多件事情 playbook 多个play 多个task
playbook 是由yaml语法书写,结构清晰,可读性强,所以必须掌握yaml基础语法
语法 描述
缩进 yaml使用固定的缩进风格表示层级结构,每一个缩进有两个空格组成,不能使用tabs冒号 以冒号结尾的除外,其他所有冒号后面必须有空格。
短横线 表示列表项,使用一个短横线加一个空格。多个项使用同样的缩进级别作为同一列表。
[root@ansible-master ~]# cat /etc/ansible/http.yaml
- hosts: webservers1
tasks:
- name: Install Httpd Server
yum:
name: httpd
state: present
- name: Configure Httpd Server
copy:
src: /root/httpd.conf
dest: /etc/httpd/conf/httpd.conf
backup: yes
- name: Configure Httpd Server
copy:
src: /root/tt.html
dest: /var/www/html/tt.html
owner: http
group: http
mode: 644
- name: Start Httpd Server
service:
name: httpd
state: started
enabled: yes
- name: Start Firewalld Server
service:
name: firewalld
state: started
- name: Configure Firewalld Server
firewalld:
zone: public
port: 8090/tcp
permanent: yes
immediate: yes
state: enabled
- 检查ansible 的语法错误
[root@ansible-master ~]# ansible-playbook --syntax /etc/ansible/http.yaml
playbook: /etc/ansible/http.yaml
- ansible 模拟演练
ansible-playbook -C /etc/ansible/http.yaml
-
示例2 使用ansible 安装并配置nfs服务
-
服务端: 192.168.6.21
安装nfs
配置nfs
根据配置创建目录,创建用户,授权
启动并加入开机自启
-
客户端: 192.168.6.22
准备一个空目录
挂载6.21上共享目录
-
[root@ansible-master ~]# cat /etc/ansible/nfs.yaml
- hosts: 192.168.6.21
tasks:
- name: Install NFS Server
yum:
name: nfs-utils
state: present
- name: Configure NFS Server
copy:
src: /root/exports
dest: /etc/exports
backup: yes
- name: Create NFS Group
group:
name: www
gid: 666
- name: Create NFS User
user:
name: www
uid: "666"
group: "666"
shell: /sbin/nologin
create_home: no
- name: Create NFS Data
file:
path: /data
state: directory
owner: www
recurse: yes
- name: Start NFS Server
service:
name: nfs
state: started
enabled: yes
- hosts: 192.168.6.22
tasks:
- name: Client Create NFS Data
file:
path: /nfs_client
state: directory
- name: Client Mount NFS Server
mount:
src: 192.168.6.21:/data
path: /nfs_client
fstype: nfs
opts: defaults
state: mounted