linux自动化运维之ansible实战

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:存放角色的目录

linux自动化运维之ansible实战_第1张图片linux自动化运维之ansible实战_第2张图片编辑

上面共有三个分组,使用时写上组名,一般格式为: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

你可能感兴趣的:(运维,自动化,ansible)