35.Ansible的yaml语法与playbook的写法

Ansible的yaml语法与playbook的写法

例:给所有受控主机配置yum仓库

[student@master ansible]$ vim repo.yml
---         #开头三个-表明是yaml文件,不写也没有影响
- name: repo       
  hosts: all
  tasks:                  #每个playbook都有一个hosts和tasks tasks下定义的是子任务,hosts定义的是主机清单(inventory)里面的受控主机
      - name: baseos         #-后空一格,然后:后空一格写,此处写的是yum仓库的文件名称
        yum_repository:			#此处写的是模块
          name: aa            #yum仓库的名称
          description: aa1	  #yum仓库的描述信息
          baseurl: http://ansible.example.com/rhel9/BaseOS    
          enabled: yes
          gpgcheck: no

      - name: AppStream
        yum_repository:
          name: bb
          description: bb1
          baseurl: http://ansible.example.com/rhel9/AppStream
          enabled: yes
          gpgcheck: no

yaml中的字符串通常不⽤加任何引号,但有些情况下,必须加引号,最常见的是在引⽤变量的时候

关于布尔值的书写格式,playbook中的布尔值类型⾮常灵活,接受yes/on/1/true/no/off /0/false

ansible-playbook用于运行剧本,-C 测试运行结果,并不是真的执行任务

[student@master ansible]$ ansible-playbook repo.yml -C

在这里插入图片描述

测试1:

1、 安装httpd,在node1执行

2、 开机自启

3、 给/var/www/html目录创建软链接/www

4、 从http://ansible.example.com/index.html下载至/www

5、 能够访问该web站点

[student@master ansible]$ vim httpd.yml
---
- name: httpd
  hosts: node1
  tasks:
    - name: httpd install    #安装httpd
      yum:
        name: httpd
        state: present

    - name: html			#创建软链接
      file:
        src: /var/www/html
        dest: /www
        state: link

    - name: get html		#下载网页
      get_url:
      
        url: http://ansible.example.com/index.html
        dest: /www
        setype: http_sys_content_t		#注意,如果不能访问,可能是context值有误

    - name: firewalld allow httpd		#防火墙允许httpd服务通过
      firewalld:
        service: http
        permanent: yes
        state: enabled
        immediate: yes

    - name: restart httpd				#重启httpd服务
      service:
         name: httpd
         state: restarted
         enabled: yes

在这里插入图片描述

测试2:

notify handlers用法(当完成….任务时,则进行….任务)

[student@master ansible]$ vim test.yml
---
- name: test
  hosts: node1
  tasks:
    - name: user1
      user:
        name: user1
        state: present

    - name: user2
      user:
        name: user2
        state: present
      notify:
        - aa

  handlers:
    - name: aa
      file:
        path: /tmp/cai
        state: touch
        mode: 0644

handlers永远是最后执行的,即使写在开头也是最后执行;如果notify所在的任务没有发生改变,则不会触发handlers

测试3:

1、 写一个剧本galaxy.yml,只对node1操作

2、 创建用户aa,该用户不能用于登录,家目录/www

3、 在/www创建一个文件html

4、 每次执行该剧本时,将系统的当前时间输入到html文件中。

5、 如果html中的时间发生变化,那么创建/tmp/kk的文件

[student@master ansible]$ vim galaxy.yml
---
- name: time
  hosts: node1
  tasks:
    - name: user
      user:
        name: aa
        shell: /sbin/nologin
        home: /www1

    - name: create file
      file:
        path: /www1/html
        state: touch

    - name: date
      shell:
        cmd: date > /www1/html
      notify:
        - bb


  handlers:
    - name: bb
      file:
        path: /tmp/bb
        state: touch

tags用法:给任务打标签,一个任务可以有多个标签,ansible-playbook -t 来指定需要指定的任务标签。

- always:除非明确跳过(–skip-tags always),否则总是执行。

- never:永远不会执行,除非明确指定(–tags never)。

- tagged:只执行有标签的任务(不包括never标签,除非明确指定)。

- untagged:只执行没有标签的任务(不包括always标签,因为always标签的任务是有标签的)。

- all:所有任务都执行(默认行为)

ansible-playbook playbook.yml -t 标签

ansible-playbook --skip-tags 跳过

ansible-playbook --tags always 只执行always

ansible-playbook --tags never test2.yml 执行never标签和always标签

ansible-playbook --tags untagged test2.yml 执行不带标签的任务,always标签也要执行

ansible-playbook --tags tagged test2.yml 执行带标签的任务 ,不执行never

写法为:

tags:

always


练习

使用ansible的playbook完成以下操作
node1 属于 test01 主机组
node2 属于 test02 主机组
node3 和 node4 属于 web 主机组
node5 属于 test05 主机组
web 组属于 webtest 主机组

主机清单
[student@master ansible]$ vim inventory
[test01]
node1

[test02]
node2

[web]
node3
node4

[test05]
node5

[webtest:children]
web

1.给所有主机配置yum仓库

[student@master ansible]$ vim yum.yml
---
- name: yum_repository
  hosts: all
  tasks:
    - name: baseos
      yum_repository:
        name: aa1
        description: aa
        baseurl: http://ansible.example.com/rhel9/BaseOS
        enabled: yes
        gpgcheck: no

    - name: appstream
      yum_repository:
        name: bb
        description: bb1
        baseurl: http://ansible.example.com/rhel9/AppStream
        enabled: yes
        gpgcheck: no

2.对node1主机操作,安装httpd服务

[student@master ansible]$ vim httpd1.yml
---
- name: http
  hosts: node1
  tasks:
    - name: httpd install
      yum:
        name: httpd
        state: present

    - name: replace httpd.cfg
      replace:
        path: /etc/httpd/conf/httpd.conf
        regexp: /var/www/html
        replace: /www

    - name: repalce
      replace:
        path: /etc/httpd/conf/httpd.conf
        regexp: /var/www
        replace: /www

    - name: firewalld allow
      firewalld:
        service: http
        permanent: yes
        state: enabled
        immediate: yes
        
    - name: create www
      file:
        path: /www
        state: directory
        setype: httpd_sys_content_t

    - name: crate web
      copy:
        content: welcome to luoqi
        dest: /www/index.html
        setype: httpd_sys_content_t

    - name: restart httpd
      service:
        name: httpd
        state: restarted
        enabled: yes

在这里插入图片描述

3.对node2主机操作,创建一个1000MiB的分区,格式化成ext4的文件系统,并挂载到/testdir目录下

[student@master ansible]$ vim test1.yml

---
- name: parted
  hosts: node2
  tasks:
    - name: parted vdb
      parted:
        device: /dev/vdb
        number: 1
        part_type: primary
        part_start: 10MiB
        part_end: 1010MiB
        state: present

    - name: mkfs
      filesystem:
        dev: /dev/vdb1
        fstype: ext4

    - name: mkdir testdir
      file:
        path: /testdir
        state: directory

    - name: mount
      mount:
        path: /testdir
        src: /dev/vdb1
        fstype: ext4
        state: mounted

在这里插入图片描述

4.对node3主机操作创建卷组datastorage,逻辑卷database,大小为800M,格式化为xfs的文件系统,并挂载到/lv目录下
使用ansible node3 -m shell -a 'df -Th’验证

---
- name: lv
  hosts: node3
  tasks:
    - name: parted
      parted:
        device: /dev/vdb
        number: 1
        part_type: primary
        part_start: 10MiB
        part_end: 1000MiB
        state: present

    - name: yum lvm2
      yum:
        name: lvm2
        state: present

    - name: lvg
      lvg:
        vg: datastorage
        pvs: /dev/vdb1

    - name: lvol
      lvol:
        lv: database
        size: 800
        vg: datastorage
        
    - name: mkfs
      filesystem:
        dev: /dev/datastorage/database
        fstype: xfs

    - name: mkdir /lv
      file:
        path: /lv
        state: directory

    - name: mount
      mount:
        path: /lv
        src: /dev/datastorage/database
        fstype: xfs
        state: mounted 

在这里插入图片描述

5.创建名为/home/student/ansible/tools.yml 的 playbook,能够实现以下目的:
1)将 php 和 tftp 软件包安装到 test01、test02 和 web 主机组中的主机上
2)将 RPM Development Tools 软件包组安装到 test01 主机组中的主机上
3)将 test01 主机组中的主机上所有软件包升级到最新版本

[student@master ansible]$ vim tools.yml
---
- name:  tools
  hosts: test01,test02,web
  tasks:
    - name: php tftp install
      yum:
        name: php,tftp
        state: present

    - name: test01
      yum:
        name: "@RPM Development Tools"
        state: present

    - name: up
      yum:
        name: "*"
        state: latest

在这里插入图片描述

6.编写剧本/home/student/ansible/jihua.yml
1)在 test02 组中的被管理主机运行
2)为用户 student 创建计划任务: student 用户每隔 5 分钟执行 echo “hello tarena”

[student@master ansible]$ vim jihua.yml
---
- name: jihua
  hosts: test02
  tasks:
    - name: student
      cron:
        user: student
        name: aa
        minute: "*/5"
        job: echo hello tarena

在这里插入图片描述

7.创建剧本/home/student/ansible/webdev.yml,满足下列要求:
1)在 test01 主机组运行
2)创建目录/webdev,属于 webdev 组,权限为 rwxrwxr-x,具有 SetGID 特殊权限
3)使用符号链接/var/www/html/webdev 链接到/webdev 目录
4)创建文件/webdev/index.html,内容是 It’s works!
5)查看 test01 主机组的 web 页面 http://node1/webdev/将显示 It’s works!

[student@master ansible]$ vim webdev.yml
---
- name: webdev
  hosts: test01
  tasks:
    - name: group
      group:
        name: webdev
        state: present

    - name: directory create
      file:
        path: /webdev
        group: webdev
        mode: 2775
        state: directory

    - name: link
      file:
        src: /webdev
        dest: /var/www/html/webdev
        state: link
        setype: httpd_sys_content_t

    - name: touch
      copy:
        content: lt's works!
        dest: /webdev/index.html
        setype: httpd_sys_content_t

    - name: fire
      firewalld:
        service: http
        permanent: yes
        state: enabled
        immediate: yes

    - name: replace
      replace:
        path: /etc/httpd/conf/httpd.conf
        regexp: <Directory "/www">
        replace: <Directory "/var/www">

    - name: replace1
      replace:
        path: /etc/httpd/conf/httpd.conf
        regexp: DocumentRoot "/www"
        replace: DocumentRoot "/var/www/html"

    - name: restart http
      service:
        name: httpd
        state: restarted

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值