ansible基础介绍
优点
-
相比于saltatack和puppet,没有客户端,更轻量级
-
只是一个工具,可以很容易实现分布式拓展
-
更强的远程执行命令
特点
-
模块化
-
支持自定义模块,可以用任何语言编写模块
-
基于python语言实现
-
部署简单,基于python和ssh,agentless,无需代理
-
安全
安装
yum安装
首先安装epel源:yum install epel-release -y
下载ansible:yum install ansible
ansible目录结构
[root@bogon ansible]# tree . ├── ansible.cfg ├── hosts └── roles └── role_httpd.yml
ansible.cfg:主配置文件,一般无需更改
hosts:主机清单,添加主机
roles:存放角色的目录
编辑
上面共有三个分组,使用时写上组名,一般格式为:ansible [组名] -m [模块名] -a [命令]
ansible执行过程
1 加载自己的配置文件,默认/etc/ansible/ansible.cfg
2 加载自己的模块,如commond
3 通过ansible将对应的模块或者命令生成.py文件,并将文件传输到远程服务器
4 给文件增加x权限
5 执行并返回结果
6 删除文件,退出
./elasticsearch
执行结果
黄色:执行成功并且有修改
绿色:执行成功,没有改变
红色:执行失败
ansible模块介绍
commond
默认模块,不支持特殊符号,不支持变量
ansible test -m ping
[root@bogon ~]# ansible test -m ping
192.168.199.155 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.199.150 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
代表执行成功,没有任何改变
ansible test -a "systemctl status nginx"
#查看test组中主机的nginx运行情况
shell
用shell执行命令,支持特殊符号,重定向符号,变量等操作
[root@bogon ~]# ansible test -m shell -a "echo 'helloddd' >> /data/a.txt"
192.168.199.155 | CHANGED | rc=0 >>
192.168.199.150 | CHANGED | rc=0 >>
这里使用commond模块显示黄色且没有报错,但是a.txt文件没有发生改变
[root@bogon ~]# ansible test -a "echo 'hellodaad' >> /data/a.txt"
192.168.199.155 | CHANGED | rc=0 >>
hellodaad >> /data/a.txt
192.168.199.150 | CHANGED | rc=0 >>
hellodaad >> /data/a.txt
[root@bogon ~]# ansible test -m shell -a "echo 'helloddd' >> /data/a.txt"
192.168.199.155 | CHANGED | rc=0 >>
192.168.199.150 | CHANGED | rc=0 >>
使用shell模块后修改成功
[root@bogon data]# cat a.txt
hello
helloddd
script
在远端主机执行本地脚本
在远端执行本地nginx.sh脚本,判断远端主机的nginx服务是否启动
creates表示如果远端主机上有指定的问价,则不执行后面的脚本,如果没有,则执行指定的脚本,如图远端主机都有a.txt文件,所以不执行nginx.sh脚本
copy
从本地主机复制文件到远端主机
src 本地文件路径
dest 目标主机路径
mode 设置权限
backup 备份源文件
#把本地的/opt/test.txt文件复制到远端/opt/test.txt中
[root@bogon opt]# ansible test -m copy -a "src=/opt/test.txt dest=/opt/test.txt"
#把本地问价中的指定内容复制到远端主机的文件中,内容带上''(单引号)
ansible test -m copy -a "content='6 删除文件' dest=/opt/test.txt"
fetch
与copy相反,从远端主机复制文件到本地主机
从远端主机中的复制文件到本地,生成以远端IP为名称的文件夹
[root@bogon opt]# ansible test -m fetch -a "src=/data/a.txt dest=/opt/"
#结果为
[root@bogon opt]# cat 192.168.199.150/data/a.txt
hello
helloddd
file
设置文件属性
path 要设置的文件路径
recurse 递归
state状态:absent(删除) touch(创建) directory(指定创建的是目录)
#在远端主机/opt/创建c.txt文件
[root@bogon opt]# ansible test -m file -a "path=/opt/c.txt state=touch"
#在远端主机/opt/创建/data/目录
[root@bogon opt]# ansible test -m file -a "path=/opt/data/ state=directory"
#在远端主机上床架软链接
[root@bogon opt]# ansible test -m file -a "src=/data/a.txt dest=/data/link-a.txt state=link"
unarchive
copy=no将远程主机上的压缩包压缩到指定目录下
copy=yes将本地主机上的压缩包传到远端主机上并解压
src 源路径
dest 目标路径
mode 权限
#copy=no,在远端主机上解压压缩包到指定目录下
[root@bogon opt]# ansible test -m unarchive -a "src=/data/test.tar.gz dest=/opt/ copy=no"
#copy=yes 把本地的压缩文件床送到远端主机并解压
[root@bogon opt]# ansible test -m unarchive -a "src=/opt/test.tar.gz dest=/opt/rh/ "
archive
将远程主机下的文件路径打包
format 打包格式
owner 指定所属者
path: 指定路径
dest: 指定目标文件
#把远程目录下的文件或者目录打包到指定目录下
[root@bogon opt]# ansible test -m archive -a "path=/opt/data/ dest=/opt/a.tar.bz2"
Cron
主要修改,添加,删除主机的crontab定时任务
在远端主机上新建定时任务
[root@bogon ~]# ansible test -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 192.168.199.149 &>/dev/null' name="hahha" "
删除任务
ansible websrvs -m cron -a 'state=absent name=hahha'
yum
在远端执行yum操作
present 下载
absent 删除
在远端主机上安装httpd服务
ansible websrvs -m yum -a 'name=httpd state=present' 安装
service
功能:实现远程管理服务的生命周期
enabled #开机启动 yes|no
name #服务名称,必选项
runlevel #运行级别
state
started
stopped
restarted
reloaded
重启nginx服务
[root@bogon ~]# ansible test -m service -a "name=nginx state=reloaded"
停止nginx服务
ansible test -m service -a "name=nginx state=stopped"
stystemd
与service类似
User
User:管理用户
# 关键参数
group # 属组
groups # 附加组
home # 设置家目录
name # 用户名
remove # 删除用户并删除用户的家目录
shell # 用户登录后的shell
system # 系统用户
uid # 用户的id
state #创建或删除
shell #制定用户shell环境
创建用户(自动创建用户组)
ansible test -m user -a "name=test1"
setup
用于收集远端主机的信息,如cpu,内存,磁盘
获取远端主机名
[root@bogon ~]# ansible test -m setup -a "filter=ansible_fqdn"
过滤信息
[root@bogon ~]# ansible test -m setup -a "filter=*mb"
firewalld
远程管理目标主机的防火墙
开启端口443并且设置为开机启动
[root@bogon ~]# ansible test -m firewalld -a 'port=443/tcp permanent=no state=enabled'
ansible-playbook
将多个任务写在一个.yml结尾的文件中,使用ansible-playbiik执行
例一:在远端开mysql服务
[root@bogon ~]# cat test1.yml
---
- hosts: test
remote_user: root
tasks:
- name: start mysql service
service: name=mysqld state=started
hosts
playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。相当于test组
remote_user
可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
在远端主机上执行任务时时切换到指定用户(用户必须存在且对文件具有一定权限)
[root@bogon ~]# cat test1.yml
---
- hosts: test
become: yes
become_user: test2
tasks:
- name: add fiile
command: echo "h" >> /opt/a.txt
task列表和action组件
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量
[root@bogon ~]# cat test3.yml
---
- hosts: test
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=present
案例
利用ansible-playboo在远端上安装nginx
[root@bogon ~]# cat test2.yml
---
- hosts: test
remote_user: root
tasks:
- name: add group nginx
user: name=nginx state=present
- name: add user nginx
user: name=nginx state=present group=nginx
- name: Install Nginx
yum: name=nginx state=present
- name: web page
copy: src=files/index.html dest=/usr/share/nginx/html/index.html
- name: Start Nginx
service: name=nginx state=started
变量的使用
定义:
variable=value
通过{{ variable_name }} 调用变量,且变量名前后必须有空格,有时用"{{variable_name }}”才生效
ansible-playbook –e 选项指定
ansible-playbook test.yml -e "hosts=www user=xingyun"
系统变量
主机名相关变量:
ansible_hostname: 目标主机的短主机名。
ansible_fqdn: 目标主机的完全限定域名(Fully Qualified Domain Name, FQDN)。
ansible_nodename: 与 ansible_hostname 类似,提供主机名。
操作系统和平台信息:
ansible_os_family: 提供操作系统的家族名称,如Debian、RedHat、Windows等。
ansible_distribution: 操作系统的具体发行版名称,如Ubuntu、CentOS等。
ansible_distribution_version: 操作系统发行版的具体版本号。
ansible_architecture: 主机的架构,如"x86_64"或"arm64"。
网络信息:
ansible_default_ipv4.address: 默认第一块网卡的IPv4地址。
ansible_all_ipv4_addresses: 包含主机所有IPv4地址的列表。
ansible_all_ipv6_addresses: 包含主机所有IPv6地址的列表。
用户和组信息:
ansible_users: 列出目标主机的所有用户账户信息。
ansible_env.HOME: 当前用户的家目录。
文件和目录信息:
ansible_selinux_python_present: 指示目标主机上是否安装了用于SELinux操作的python库。
服务状态信息:
使用ansible_service_mgr可以得知目标主机使用的服务管理器类型,如'systemd'、'sysvinit'等。
#使用系统变量新建一个以本地用户名命名的文文件
[root@bogon ~]# cat test1.yml
---
- hosts: test
remote_user: root
tasks:
- name: add a new file named by user
file: path=/opt/{{ ansible_nodename }}.txt state=touch
自定义变量
在主机清单中定义变量
port是局部变量,port=82是组中的全局变量
[test]
192.168.199.150 port=81
192.168.199.155
[test:vars]
port=82
命令行指定变量(优先级最高)
[root@bogon ~]# ansible-playbook port=83 test1.yml
在yml文件中定义变量
[root@bogon ~]# cat test3.yml
---
- hosts: test
remote_user: root
vars:
- name1: httpd
- name2: nginx
tasks:
- name: install httpd
yum: name={{ name1 }} state=present
- name: install nginx
yum: name={{ name2 }} state=present
变量的优先级:命令行中的-e > playbook中定义的变量 > 主机清单中定义的变量
模板templates
模板是一个文本文件,可以做为生成文件的模版,并且模板文件中还可嵌套jinja语法
template功能:可以根据和参考模块文件,动态生成相类似的配置文件
template文件必须存放于templates目录下,且命名为 .j2 结尾
yaml/yml 文件需和templates目录平级,目录结构如下示例:
./
├── temnginx.yml
└── templates
└── nginx.conf.j2