ansible-playbook

本文介绍如何使用Ansible进行自动化运维操作,包括配置Ansible环境、执行远程命令、推送文件、重启服务等常见任务,同时展示了如何通过Ansible管理多个服务器上的软件安装与配置。

vim /etc/ansible/ansible.cfg,开启如下选项

[privilege_escalation]  ##这一部分为提升权限的参数,如果使用普通用户需要开启。目标服务器普通用户需要有免密码使用sudo功能

[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False

把ansible-playbook执行的输出结果打印出来

---
- hosts: xixi

  tasks:
    - name: iptables list
      shell: iptables -L
      register: list         ## register指令把pwd执行结果寄存到自定义变量中
    - name: echo list
      debug:
        msg: "{{ list }}"    ## 打印变量

使用template模块推送文件,触发handler执行任务。 

---
- hosts: hehe

  tasks:
    - name: copy template
      template: src=iptables.j2 dest=/etc/sysconfig/iptables
      notify: restartiptables            ##调用handlers名称 执行对应handler任务
  handlers:
    - name: restartiptables
      service: name=iptables state=restarted

重启所有ATS节点并打印日志

cat restart.yml 
---
- hosts: lisi

  tasks:
    - name: restart service
      service: name=trafficserver state=restarted
    - name: sleep 5s
      command: sleep 5
    - name: tail log
      shell: tail /var/log/trafficserver/diags.log
      register: log   ## register指令把pwd执行结果寄存到自定义变量中
    - name: echo log
      debug:
        msg: "{{ log }}"   ## 打印变量

重启ATS服务,删除缓存,并打印日志

cat cacha.yml 
---
- hosts: lisi

  tasks:
    - name: stop service
      service: name=trafficserver state=stopped
    - name: delete cache
      shell: rm -f /home/cache/cache.db       ##ATS缓存文件存放位置
    - name: start service
      service: name=trafficserver state=started
    - name: tail log
      shell: tail /var/log/trafficserver/diags.log
      register: log   ## register指令把pwd执行结果寄存到自定义变量中
    - name: echo log
      debug:
        msg: "{{ log }}"   ## 打印变量

为所有ATS创建清理日志脚本并使用计划任务定时清理超过30天的日志文件。

[root@jumpserver ~/.ansible/roles]$cat lisi.yml 
---
- hosts: lisi

  tasks:
    - name: copy clean log file
      copy: src=file/cleanlog.sh dest=/var/log/trafficserver/cleanlog.sh  mode=744
    - name: shell  script
      command: sh /var/log/trafficserver/cleanlog.sh
    - name: crontab
      cron: minute=1 hour=0 day=* month=* weekday=* name="clean trafficserver log" job="/var/log/trafficserver/cleanlog.sh"

定时清理日志脚本内容

[root@jumpserver ~/.ansible/roles]$cat file/cleanlog.sh 
#!/bin/bash
##定期清理trafficserver日志文件,只保留30天
path=/var/log/trafficserver
find $path -name "*.old" -type f -mtime +30  -exec rm {} \; > /dev/null 2>&1

批量修改所有服务器用户密码

[root@jumpserver ~/.ansible/roles]$cat passwd.yml 
---
- hosts: all

  tasks:
    - name: change password
      user: name={{ user }}  password={{ pass | password_hash('sha512') }}  update_password=always

[root@jumpserver ~/.ansible/roles]$ansible-playbook  passwd.yml -e 'user=root pass="123456"'

为所有web服务器增加别名

[root@jumpserver ~/.ansible/roles]$cat git.yml 
---
- hosts: webserver

  tasks:
    - name: alias
      shell: echo  "alias  gitpull='sudo git pull origin master'" >> /etc/bashrc
    - name: source /etc/bashrc
      shell: source /etc/bashrc

安装httpd服务,并调用自定义配置文件跟网页文件。

[root@jumpserver ~/.ansible/roles]$cat http.yml 
---
- hosts: webserver

  tasks:
    - name: install httpd package
      yum: name=httpd state=present 
    - name: copy conf file
      copy: src=file/httpd.conf dest=/etc/httpd/conf/  backup=yes
      notify: restart service
    - name: copy index.html
      copy: src=file/index.html dest=/var/www/html/   backup=yes
    - name: start service
      service: name=httpd state=started enabled=yes
      tags: restarthttpd

  handlers:
    - name: restart service
      service: name=httpd state=restarted

判断服务器操作系统不同版本使用不同nginx配置文件

[root@jumpserver ~/.ansible/roles]$cat temptest.yml 
---
- hosts: nginx
  vars:
    - http_port: 89

  tasks:
    - name: install package
      yum: name=nginx 
    - name: copy template for centos7
      template: src=template7.conf.j2 dest=/etc/nginx/nginx.conf
      notify: restart nginx
      when: ansible_distribution_major_version == "7"
    - name: copy template for centos6
      template: src=template6.conf.j2 dest=/etc/nginx/nginx.conf
      when: ansible_distribution_major_version == "6"
      notify: restart nginx
    - name: start service
      service: name=nginx state=restarted enabled=yes

  handlers:
    - name: restart nginx
      service: name=nginx state=restarted

批量安装zabbix-agent以及修改zabbix客户端的Server和ServerActive的ip

[root@jumpserver ~/.ansible/roles]$cat zabbix.yml 
---
- hosts: zabbix

  tasks:
    - name: copy repo
      template: src=zabbix.repo.j2 dest=/etc/yum.repos.d/zabbix.repo      
    - name: install zabbix-agent
      yum: name=zabbix-agent state=present
    - name: sed Server ip
      shell: sed -i "s@Server=127.0.0.1@Server=1.1.1.1@g" /etc/zabbix/zabbix_agentd.conf
    - name: sed ServerActive ip
      shell: sed -i "s@ServerActive=127.0.0.1@ServerActive=1.1.1.1@g" /etc/zabbix/zabbix_agentd.conf
      notify: restartzabbix

  handlers:
    - name: restartzabbix
      service: name=zabbix-agent state=restarted enabled=yes

nginx的roles角色使用 

├── nginx
│   ├── tasks
│   │   ├── group.yml
│   │   ├── main.yml
│   │   ├── restart.yml
│   │   ├── start.yml
│   │   ├── templ.yml
│   │   ├── user.yml
│   │   └── yum.yml
│   └── templates
│       └── nginx.conf.j2
├── nginx_role.yml

[root@jumpserver /etc/ansible/roles]$cat nginx_role.yml 
- hosts: nginx
  roles:
    - role: nginx

[root@jumpserver /etc/ansible/roles]$cat nginx/tasks/main.yml 
- include: group.yml
- include: user.yml
- include: yum.yml
- include: templ.yml
- include: start.yml
- include: restart.yml

[root@jumpserver /etc/ansible/roles]$cat nginx/tasks/group.yml 
- name: create group
  group: name=nginx gid=80

[root@jumpserver /etc/ansible/roles]$cat nginx/tasks/user.yml 
- name: create user
  user: name=nginx uid=80 group=nginx system=yes shell=/sbin/nologin

[root@jumpserver /etc/ansible/roles]$cat nginx/tasks/yum.yml 
- name: yum nginx
  yum: name=nginx state=present

[root@jumpserver /etc/ansible/roles]$cat nginx/tasks/templ.yml 
- name: copy conf
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

[root@jumpserver /etc/ansible/roles]$cat nginx/tasks/start.yml 
- name: start service
  service: name=nginx state=started enabled=yes

[root@jumpserver /etc/ansible/roles]$cat nginx/tasks/restart.yml 
- name: restart service
  service: name=nginx state=restarted


使用roles安装Mariadb最新版本

├── mysql
│   ├── files
│   ├── tasks
│   │   ├── cnf.yml
│   │   ├── main.yml
│   │   ├── repo.yml
│   │   └── yum.yml
│   └── templates
│       ├── MariaDB.repo.j2
│       └── my.cnf.j2
├── mysql_role.yml

[root@mysql-master roles]# cat mysql_role.yml 
- hosts: mysql

  roles:
    - mysql

[root@mysql-master roles]# cat mysql/templates/MariaDB.repo.j2 
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3.7/centos7-amd64/
gpgkey=http://yum.mariadb.org/RPM-GPG-KEY-MariaDB
enabled=1
gpgcheck=1

[root@mysql-master roles]# cat mysql/templates/my.cnf.j2 
[mysqld]
port		= 3306
.....

[root@mysql-master roles]# cat mysql/tasks/main.yml 
- include: repo.yml
- include: yum.yml
- include: cnf.yml

[root@mysql-master roles]# cat mysql/tasks/repo.yml 
- name: copy repo file
  template: src=MariaDB.repo.j2 dest=/etc/yum.repos.d/MariaDB.repo

[root@mysql-master roles]# cat mysql/tasks/yum.yml 
- name: install mariadb
  yum: name=mariadb 
- name: install mariadb-server
  yum: name='MariaDB-server'
- name: install mariadb-client
  yum: name=MariaDB-client
- name: install socat
  yum: name=socat


[root@mysql-master roles]# cat mysql/tasks/cnf.yml 
- name: copy my.cnf file
  template: src=my.cnf.j2 dest=/etc/my.cnf mode=644



Ansible 是一个强大的自动化工具,可以用于配置管理、应用部署、任务自动化等场景。Ansible 的 `ansible-playbook` 命令是其核心功能之一,用于执行定义在 YAML 格式文件中的 Playbook。以下是对 `ansible-playbook` 命令的使用方法及示例的详细说明。 ### 执行 Playbook 的基本命令 Playbook 文件通常以 `.yaml` 或 `.yml` 结尾,其中定义了多个任务(tasks)以及目标主机(hosts)等信息。执行 Playbook 的基本命令如下: ```bash ansible-playbook playbook_file.yaml ``` 该命令会按照 Playbook 文件中定义的任务顺序,依次在目标主机上执行操作 [^3]。 ### 检查 Playbook 文件的语法 在执行 Playbook 之前,建议先检查文件的语法是否正确,避免因格式错误导致任务失败: ```bash ansible-playbook playbook_file.yaml --syntax-check ``` 该命令会验证 YAML 文件的格式是否符合规范,确保没有语法错误 [^4]。 ### 列出 Playbook 中的任务 如果需要查看 Playbook 中定义的所有任务,可以使用以下命令: ```bash ansible-playbook playbook_file.yaml --list-tasks ``` 该命令会列出所有任务的名称,帮助用户快速了解 Playbook 的执行内容 。 ### 列出生效的主机 在执行 Playbook 之前,可以查看哪些主机将受到影响: ```bash ansible-playbook playbook_file.yaml --list-hosts ``` 该命令会列出所有将执行任务的主机或主机组 [^4]。 ### 从指定任务开始执行 在调试或重新执行 Playbook 时,可能需要从某个特定任务开始执行,而不是从头开始。可以使用 `--start-at-task` 参数实现: ```bash ansible-playbook playbook_file.yaml --start-at-task='Task Name' ``` 该命令会跳过之前的所有任务,直接从指定名称的任务开始执行 [^3]。 ### 传递参数和用户认证 在执行 Playbook 时,可能需要提供额外的参数或进行用户认证: - `-k` 或 `--ask-pass`:交互式输入 SSH 密码 - `-K` 或 `--ask-become-pass`:交互式输入 `sudo` 密码 - `-u`:指定远程执行的用户 例如,若目标主机需要密码认证,可以使用以下命令: ```bash ansible-playbook playbook_file.yaml -u username -k ``` 这将提示用户输入 SSH 密码 [^4]。 ### 示例:配置 `/etc/hosts` 文件 以下是一个简单的 Playbook 示例,用于将模板文件 `hosts.j2` 渲染并复制到目标主机的 `/etc/hosts` 文件中: ```yaml - name: Configure hosts file hosts: all_servers remote_user: root tasks: - name: Copy hosts.j2 template to target servers template: src: hosts.j2 dest: /etc/hosts ``` 执行该 Playbook 的命令如下: ```bash ansible-playbook hosts.yaml ``` 该 Playbook 会在 `all_servers` 组中的所有主机上执行任务,将本地的 `hosts.j2` 模板文件渲染后复制到 `/etc/hosts` 路径下 [^5]。 ### 调试 Playbook 在开发或维护 Playbook 时,调试功能可以帮助快速定位问题。Ansible Playbook Debugger 是一个开源工具,允许用户在 Playbook 执行过程中进行交互式调试。通过该工具,可以在任务执行时查看变量值、执行中间步骤等 [^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值