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


720

被折叠的 条评论
为什么被折叠?



