ansible剧本

本文详细介绍了Ansible剧本的使用,包括服务管理、变量注册、事实缓存、条件和循环语句、标签和角色的运用。强调了剧本编写中的常见错误,如缩进、配置文件错误和调试难题,并提供了实例演示如何处理这些情况。此外,还讨论了如何通过角色拆分初始化剧本以提高管理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意点

1.缩进问题

  • 空格不对
  • 段横杆后面没空格
  • :后面没空格

2.单词拼错了

3.乱用参数

  • mode: ‘0600’
  • group: www

4.配置文件写错了

  • rsync /backup
  • nfs
  • lsyncd /backup /data

5.模拟测试的坑

  • -C 不成功不代表实际运行不成功

6.报错的坑

  • 实际报错的行数不一定是真的,找一找附近,上面和下面

7.网络的坑

  • YUM卡住,检查客户端机器是否能上网

不方便的地方

1.调试的时候所有步骤都得重新执行一遍

2.服务状态不改变

3.配文文件和剧本存放混乱

4.剧本都是分开的,需要分开执行

-注册变量
[root@m01 ~/yaml]# cat vars_ip.yml

  • hosts: zabbix
    tasks:
    • name: 01-get ip address
      shell: “echo {{ ansible_facts.eth1.ipv4.address }} > /root/ip_eth1.txt”

    • name: 02-get hostname
      shell: “cat /root/ip_eth1.txt”
      register: cat_ip

    • name: 02-out cat status
      debug:
      msg: “{{ cat_ip.stdout }}”

ansible服务管理

目前的情况:

  • 要不然不重启,要不然每次都重启

理想中的情况:

  • 配置文件发生了变化就重启,没变化就不重启,第一次安装直接启动

命令实现:

copy: src=/server/scripts/exports dest=/etc/
notify:
- restart nfs

handlers:
- name: restart nfs
service:
name: nfs
state: restarted

注意点:

1.重启多个服务,不用写2个handles,直接在handles下面写上name就可以了
2.缩进有问题
3.每次都重启,因为使用了-C,配置文件并没与真正的发过去
4.每次推送服务都会启动,配置文件一样也会启动,因为服务配置错误,根本就没正常启动
不完美的地方:
1.不能同时监控多个文件,分别重启多个服务
2.需要分开写多个copy和多个restart

循环

1.应用场景

  • 安装多个软件
  • 创建多个目录
  • 复制多个文件
  • 复制多个文件到不同的目录
  • 不同的文件权限不一样

2.具体实现
单行模式:

  • name: 04-copy rsyncd conf
    copy: src=/server/scripts/rsyncd.conf dest=/etc/
  • name: 05-copy passwd
    copy: src=/server/scripts/rsync.passwd dest=/etc/

缩进模式:

  • name: 04-copy rsyncd conf
    copy:
    src: /server/scripts/rsyncd.conf
    dest: /etc/

  • name: 05-copy passwd
    copy:
    src: /server/scripts/rsync.passwd
    dest: /etc/
    mode: 600

循环模式1:

  • name: 04-copy rsyncd conf
    copy:
    src: “/server/scripts/{{ item }}”
    dest: /etc/
    loop:
    • rsyncd.conf
    • rsync.passwd

循环模式2:可以两种风格混合

  • name: 05-create dir
    file: dest=/data state=directory owner=www group=www

  • name: 06-start rpcbind
    service:
    name: “{{ item }}”
    state: started
    enabled: yes
    loop:

    • rpcbind
    • nfs

多参数循环模式:

  • name: 04-copy rsyncd conf
    copy:
    src: “/server/scripts/{{ item.src }}”
    dest: /etc/
    mode: “{{ item.mode }}”
    loop:
    • { src: ‘rsyncd.conf’, mode: ‘644’ }
    • { src: ‘rsync.passwd’, mode: ‘600’ }

例子:

[root@m01 /server/scripts/test]# cat loops.yaml 
- hosts: 172.16.1.41
  tasks:
  - name: 01-create dir data and backuo
    file:
      path: "{{ item }}"
      state: directory
      owner: www
      group: www
    loop: 
    - /data
    - /backup

循环参考

变量

使用情景:
1.自定义某个名称,在任务中会多次引用
2.从主机收集的系统信息中提取某个变量并引用,例如网卡信息

自定义一个变量并引用
[root@m01 /server/scripts/test]# cat vars.yaml

  • hosts: 172.16.1.41
    vars:
    file_name: executive

    tasks:

    • name: 01-use vars create dir
      file:
      path: “/root/{{ file_name }}”
      state: directory
      owner: www
      group: www

使用变量获取主机的eth1地址和主机名
[root@m01 ~/yaml]# cat vars_ip.yml

  • hosts: zabbix
    tasks:
    • name: 01-get ip address
      shell: “echo {{ ansible_facts.eth1.ipv4.address }} > /root/ip_eth1.txt”

    • name: 02-get hostname
      shell: “echo {{ ansible_facts.hostname }} > /root/hostname.txt”

在hosts文件里定义变量
[root@m01 ~]# tail -5 /etc/ansible/hosts
[backup]
172.16.1.41

[backup:vars]
file_name=“oldzhang”

注册变量

使用情景:将配置文件的状态注册成一个变量,方便其他任务引用
将配置文件的状态注册成一个服务变量并打印出来

例子:

- hosts: nfs
  tasks:
  - name: 01-echo hostname
    shell: echo $(hostname)
    register: nfs_hostname

  - name: debug nfs_hostname
    debug:
      msg: "{{ item }}"
    loop:
      - "{{ nfs_hostname.stdout }}"
      - "{{ nfs_hostname.cmd }}"

编写变量文件

[root@m01 ~]# cat /etc/ansible/roles/rsync/vars/main.yml 
user_rsyncd: rsync_backup 
passwd_rsyncd: executive

facts缓存

Ansible facts是在被管理追击上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息:比如:被控端的主机名、IP地址、系统版本、cpu数量、内存状态、磁盘状态等等
实例:

#编辑
[root@m01 ~]# vim facts.yml
- hosts: web_group
  tasks:
    - name: Get Host Info
      debug:
        msg: >
          Hostname "{{ ansible_fqdn }}" and IP "{{ ansible_default_ipv4.address }}"

#执行
[root@m01 ~]# ansible-playbook facts.yml
[root@m01 ~]# ansible-playbook facts.yml

#关闭facts
[root@m01 ~]# vim facts.yml
- hosts: web_group
  gather_facts: no #关闭信息采集
  tasks:
  #facts 生成zabbix配置文件
  - hosts: web_group
  vars:
    - zabbix_server: 172.16.1.71
  tasks:
    - name: copy zabbix agent conf
      template:
        src: ./zabbix_agentd.conf
        dest: /tmp/zabbix_agentd.conf
 #facts生成mysqld配置文件
 - hosts: db_group
  tasks:
    - name: Install mysql server
      yum:
        name: mariadb-server
        state: present

    - name: copy mysql  conf
      template:
        src: ./my.cnf
        dest: /etc/my.cnf


[root@m01 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr
datadir=/var/lib/mysql/
socket=/var/lib/mysql/mysql.sock
log_error=/var/log/mariadb/mariadb.log
innodb_buffer_pool_size={{ ansible_memtotal_mb * 0.8 }}

条件语句

循环语句

标签

1.配置语法

  • hosts: nfs
    tasks:
    • name: 01-create group
      group: name=www gid=666
      tags: 01-create-group

2.打印所有的tags
ansible-playbook --list-tags nfs_tag.yml
ansible-playbook --list-task nfs_tag.yml

3.只执行某一步和执行多步
ansible-playbook -t 06-start nfs_tag.yml
ansible-playbook -t 03-yum,06-start nfs_tag.yml

4.测试执行某一步
ansible-playbook -C -t 06-start nfs_tag.yml

5.跳过某一步
ansible-playbook --skip-tags=03-yum >nfs_tag.yml

6.跳过多步
ansible-playbook --skip-tags=03-yum,04-copy nfs_tag.yml
使用 man ansible-playbook 可查看相关参数

1.查看task列表
ansible-playbook --list-task nfs_tag.yml

2.选择从哪一个task开始执行
ansible-playbook --start-at-task=04-copy-nfs-conf nfs_tag.yml

注意!
如果你的task名称带空格,那么执行的时候要添加引号括起来
ansible-playbook --start-at-task=‘04-copy nfs conf’ nfs_tag.yml

ansible rolers 角色

给每个文件每个服务都安一个家
按服务拆分
按功能模块拆分

1.目录规划
目录必须建在/etc/ansible/roles下
[root@m01 /etc/ansible/roles]# tree
.
├── nfs #角色名称
│ ├── files #存放需要copy的文件
│ ├── handlers #触发任务剧本
│ ├── tasks #具体任务剧本
│ ├── templates #模版文件
│ └── vars #存放变量文件

2.创建目录
[root@m01 /etc/ansible/roles/nfs]# mkdir {vars,tasks,templates,handlers,files} -p
[root@m01 /etc/ansible/roles/nfs]# tree
.
├── files
├── handlers
├── tasks
├── templates
└── vars

3.编写task文件
[root@m01 /etc/ansible/roles]# cat nfs/tasks/main.yaml

  • name: 01-create group
    group: name=www gid=666

  • name: 02-create user
    user: name=www create_home=no shell=/sbin/nologin group=www uid=666

  • name: 03-yum install nfs
    yum: name=nfs-utils state=installed

  • name: 04-copy nfs conf
    copy: src=exports dest=/etc/
    notify:

    • restart nfs
  • name: 05-create dir
    file: dest=/data state=directory owner=www group=www

  • name: 06-start rpcbind
    service:
    name: “{{ item }}”
    state: started
    enabled: yes
    loop:

    • rpcbind
    • nfs

4.编写需要copy的配置文件
[root@m01 /etc/ansible/roles]# cat nfs/files/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
/backup 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
5.编写handlers
[root@m01 /etc/ansible/roles]# cat nfs/handlers/main.yml

  • name: restart nfs
    service:
    name: nfs
    state: restarted

6.编写执行文件
[root@m01 /etc/ansible/roles]# cat site.yml

  • hosts: nfs
    roles:
    • nfs

7.测试角色剧本
ansible-playbook -C site.yml

ansible rolers 拆分初始化剧本

1.创建init角色和目录
[root@m01 /etc/ansible/roles]# mkdir init/{vars,tasks,templates,handlers,files} -p
[root@m01 /etc/ansible/roles]# ll
total 4
drwxr-xr-x. 7 root root 77 Sep 19 10:55 init
drwxr-xr-x. 7 root root 77 Sep 19 10:55 nfs
drwxr-xr-x. 7 root root 77 Sep 19 10:55 rsync
-rw-r–r--. 1 root root 51 Sep 19 11:44 site.yml

2.编写init的task文件
[root@m01 /etc/ansible/roles]# cat init/tasks/main.yaml

  • name: 01-create group
    group: name=www gid=666

  • name: 02-create user
    user: name=www create_home=no shell=/sbin/nologin group=www uid=666

  • name: 03-yum install nfs
    yum:
    name: “{{ item }}”
    state: installed
    loop:

    • nfs-utils
    • rsync
  • name: 04-create dir
    file:
    dest: “{{ item }}”
    state: directory
    owner: www
    group: www
    loop:

    • /data/
    • /backup/

3.其他的服务精简掉不需要操作
[root@m01 /etc/ansible/roles]# cat nfs/tasks/main.yaml

  • name: 01-copy nfs conf
    copy: src=exports dest=/etc/
    notify:

    • restart nfs
  • name: 02-start rpcbind
    service:
    name: “{{ item }}”
    state: started
    enabled: yes
    loop:

    • rpcbind
    • nfs

[root@m01 /etc/ansible/roles]# cat rsync/tasks/main.yaml

  • name: 01-copy rsyncd conf
    copy:
    src: “{{ item.src }}”
    dest: /etc/
    mode: “{{ item.mode }}”
    loop:

    • { src: ‘rsyncd.conf’, mode: ‘644’ }
    • { src: ‘rsync.passwd’, mode: ‘600’ }
      notify:
    • restart rsyncd
  • name: 02-start rsyncd
    service:
    name: rsyncd
    state: started
    enabled: yes

4.编写执行文件
[root@m01 /etc/ansible/roles]# cat site.yml

  • hosts: backup
    roles:
    • init
    • rsync
      也可这样
- hosts: all
  roles:
    - { role: 'base' }
    - { role: 'zabbix-agent' }

- hosts: db
  roles:
    - { role: 'mysql' }

- hosts: nfs
  roles:
    - { role: 'nfs' }

- hosts: backup
  roles:
    - { role: 'rsync' }

# Wordpress
- hosts: web
  roles:
    - { role: 'nginx' }
    - { role: 'php-fpm' }
    - { role: 'code/wordpress' }

- hosts: lb
  roles:
    - { role: 'nginx' }
    - { role: 'proxy' }
    - { role: 'keepalived' }

- hosts: zabbix
  roles:
    - { role: 'mysql' }
    - { role: 'zabbix-server' }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值