1)可以通过epel镜像配置方法编写
安装epel配置包(默认无其他epel源)
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
将 repo 配置中的地址替换为阿里云镜像站地址
sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
2)直接手动编写epel源
vim epel.repo
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64/
gpgcheck=0
yum install -y ansible
ansible --version
实验环境:
server1:192.168.43.11
server2:192.168.43.22
server3:192.168.43.33
1.在三台主机上创建用户,并且给用户授权
在server1、2、3上:
useradd devops
echo westos | passwd --stdin devops
在server2和server3中:
visudo的目的是让devops用户可以有全部权限,可以自己设定权限,因为这里是实验环境,所以给了全部权限
2.使三台主机之间互相免密
ssh-keygen生成密钥
cd ~/.ssh/
ssh-copy-id server2
ssh-copy-id server3
在server1中:切换到devops用户
在devops用户下,将免密动作再做一遍,因为上面的免密是在root用户下做的,所以默认免密的是root用户
ssh-keygen
cd /home/devops/.ssh
ssh-copy-id server2
ssh-copy-id server3(注意此时输入的密码是上面创建devops用户时设置的密码)
3.创建ansible配置文件
1.
[root@server1 ~]# su - devops ##切换到devops用户
[devops@server1 root]$ cd
[devops@server1 ~]$ mkdir ansible
[devops@server1 ~]$ cd ansible/
[devops@server1 ansible]$ pwd
/home/devops/ansible
2.
vim ansible/hosts ##创建hosts文件,内容自定义
[test]
192.168.43.22
[prod]
192.168.43.33
3.
vim ansible/ansible.cfg 创建配置文件
[defaults]
inventory = ./hosts
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
hosts:
其中括号中的名字代表组名
主机(hosts)部分可以使用域名、主机名、IP地址表示;一般此类配置中多使用IP地址;
组名下的主机地址就是ansible可以管理的地址
4.测试连通
ansible all -m ping -i ./hosts
加-i ./hosts 的作用是怕系统找不到hosts文件,指定一下路径
默认情况下ansible all --list-hosts
再编写一个文件vim ansible/lists
对其进行分组,群组整合,children底下为父群组test的子群组,调用方式为ansible test -m ping
[test]
server2
[prod]
server3
[devops:children]
test
prod
加入变量 port的两种方法,vars底下为群组共同便变量
执行状态:
绿色
:执行成功并且没有对目标主机有修改
黄色
:执行成功并且对受管主机做更改
红色
:执行失败
ansible host-pattern -m module [-a 'module arguments']
host-pattern参数用于指定应用在临时命令的受管主机
-m选项将ansible应在目标主机上运行的module的名称作为参数
-a选项以带引号字符串的形式取这些参数的列表
ansible的参数 | 用途 |
---|---|
- -version | 显示版本 |
- m module | 指定模块(默认command) |
-v | 详细过程,显示任务结果 |
-vv | 显示任务结果和任务配置 |
-vvv | 包含关于与受管主机的连接信息 |
-vvvv | 增加连接插件相关的额外详细程度选项(包括受管主机上用于执行脚本的用户及所 执行的脚本) |
- -list-all | 显示主机列表 |
-k ,- - ask-pass | 提示输入ssh连接密码,默认key验证 |
-K ,- - ask-become-pass | 提示输入sudo时的口令 |
-C ,- -check | 检查,并不执行 |
-T, - - timeout | 执行命令的超时时间,默认10s |
-u, - -user=REMOTE_USER | 执行远程执行的用户 |
-b ,- -become | sudo切换 |
ansible-doc -l命令可以列出系统上安装的所有模块
ansible-doc来按照名称查看特定模块的文档
文件模块
copy
:将本地文件复制到受管主机
file
:设置文件的权限和其他属性
lineinfile
:确保特定行是否在文件中
synchronize
:使用rsync同步内容
软件包模块
package
:使用操作系统本机的自动检测包管理器管理软件
yum
:使用yum软件包管理器管理软件包
apt
:使用apt软件包管理器管理软件包
dnf
:使用dnf软件包管理器管理软件包
gem
:管理Ruby gem
pip
:从PyPi管理python软件包
系统模块
firewalld
:使用firewalld管理任意端口和服务
reboot
:重启计算机服务
service
:管理服务
user
:添加、删除、管理用户账户
Net Tools模块
get_url
:通过HTTP、HTTPS或FTP下载文件
nmcli
:管理网络
uri
:与web服务交互
command是ansible上的默认模块,可以忽略-m
ansible webserver -m command -a /usr/bin/hostname
在受管主机server3上运行hostname命令
ansible webserver - m command -a /usr/bin/hostname -o
加上-o参数,单行显示
ansible localhost -m command -a 'id'
查看本机当前用户的ID
ansible localhost -m command -a 'id' -u devops
通过-u选项使用devops进行连接并执行id命令
ansible localhost -m shell -a set
使用shell和command的区别:
command模块允许执行远程命令,但这些命令不是shell处理,所以无法访问shell环境变量,所以不能执行重定向、传送等操作
copy从服务器复制文件到客户端,与fetch(从客户端取文件到服务器)相反
参数 | 解释 |
---|---|
attributes | 属性 |
backup | 备份 |
content | 以内容生成文件 |
dest | 目的地 |
group | 所有组 |
mode | 权限 |
owner | 所有者 |
src | 源 |
ansible server3 -m copy -a 'src=/root/ansible/srver3index.html dest=/var/www/html/index.html'
ansible webserver -m service -a 'name=vsftpd state=started enabled=true'
启动服务
ansible webserver -m service -a 'name=vsftpd state=restarted '
重启服务
ansible webserver -m service -a 'name=vsftpd state=stopped enabled=no'
停止服务
ansible dbserver -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=1999 comment="nginx service"'
创建指定用户
ansible dbserver -m user -a 'name=nginx state=absent remove=yes'
删除用户及用户家目录
1.剧本(Playbook):是利用YAML标记语言编写的可重复执行的任务的列表。
2.yaml格式通常以 .yml为扩展名 ansible-play xxx.yml 运行playbook(要求环境中有inventory和ansible.cfg)注意:playbook里任务和任务间要有-,play和play间要有-
3.ansible-playbook默认输出不提供详细任务执行信息。
-v参数提供,共四个级别:
-v(显示任务结果)
-vv (显示任务结果和任务配置)
-vvv (包含关于与受管主机的连接信息)
-vvvv (增加连接插件相关的额外详细程度选项)(包括受管主机上用于执行脚本的用户及所 执行的脚本)4.执行playbool前最好进行语法验证 ansible-playbook --syntax-check webserver.yml 有语法错误,会提示错误位置 ERROR!S
5.yaml对于缩进量没有严格要求,但是有两个基本原则:
1).处于同一层次结构中同一级别的数据元素必须具有相同的缩进量(play本身是一个键值对集合,同一play中的键应当使用相同的缩进量)
2).如果项目属于其他项目的子项,其缩进量必须大于父项’
vim user.yml
--- #开头三个破折号,文档的开始标记
- name: Configure User #可选,但是建议使用
hosts:server2 #运行主机
tasks: #任务
- name: devops user
user: #使用模块
name:devops
uid:1001
state:present
... #结尾三个省略号,标记结束(通常省略)
---
- name: Setup service
hosts: server2
tasks:
- name: Install httpd
yum:
name: httpd
state: latest
...
---
- name: Setup Webserver
hosts: server2
tasks:
- name: Apache is enabled
service:
name: httpd
enabled: true
- name: Install vsftpd
yum:
name: vsftpd
state: latest
- name: vsftpd is enabled
service:
name: vsftpd
enabled: true
...
ansible-playbook --syntax-check service.yml
语法检测
ansible-playbook -C service.yml
空运行会报告执行这个playbook将会发生什么,但不会改变目标主机
---
- name: Install and Start Apache
hosts: server2
tasks:
- name: Apache is Installed
yum:
name: httpd
state: present
- name: Change index.html
copy:
content: "welcome to server2!"
dest: /var/www/html/index.html
- name: Start Apache
service:
name: httpd
state: started
enabled: true
---
- name: web
hosts: server2
become: yes
tasks:
- name: Apache and firewalld Installed
yum:
name:
- httpd
- firewalld
state: present
- name: Configure index.html
copy:
content: "welcome to apache_firewalld'test page!!!"
dest: /var/www/html/index.html
- name: Firewalld enabled and running
service:
name: firewalld
enabled: true
state: started
- name: Firewalld permits httpd
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
- name: httpd enabled and running
service:
name: httpd
enabled: true
state: started
- name: Test webserver
hosts: localhost
become: no
tasks:
- name: connect webserver
uri:
url: http://server2
return_content: yes
state_code: 200
ansible-vault encrypt filename
加密文件
(注意:filename参数可以是多个)
ansible-vault view filename
查看加密文件
原理:将文件解密为一个临时文件,并编辑;保存时,复制内容并删除临时文件 ‘edit命令始终重写文件,因此只有在更改文件时使用,查看尽量使用view’
ansible-vault decrypt filename
解密文件
ansible-vault decrypt filename1 --output=filename2
解密的同时改名
可以使用- -output=filename2将加密文件保存为新的名称,使用此参数时输入文件只能是一个
ansible-vault rekey filename
对加密文件进行改密码
(注意:可以一次更新多个文件密码)
使用vault密码文件时,最好使用--new-vault-password-file
ansible-vault create filename
创建加密文件
ansible-vaultcreate --vault-password-file=secret filename
创建加密文件同时将密码保存
注意:secret文件中必须先写入密码