Ansible之playbook剧本

Ansible之playbook剧本

1. playbook的组成

playbooks 本身由以下各部分组成
(1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
(2)Variables:变量
(3)Templates:模板
(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
(5)Roles:角色

2. 剧本示例test1

2.1 剧本制作

[root@ansible ~] vim test1.yml

---

yaml文件以---开头,以表明这是一个yaml文件,可省略

- name: first test

定义一个play的名称,可省略

gather_facts: false

设置不进行facts信息收集,这可以加快执行速度,可省略

hosts: webservers

指定要执行任务的被管理主机组,如多个主机组用冒号分隔

remote_user: root

指定被管理主机上执行任务的用户

tasks:

定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行

- name: test connection

自定义任务名称

ping:

使用 module: [options] 格式来定义一个任务

- name: disable selinux

command: '/sbin/setenforce 0'

command模块和shell模块无需使用key=value格式

ignore_errors: True

如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务

- name: disable firewalld

service: name=firewalld state=stopped

使用 module: options 格式来定义任务,option使用key=value格式

- name: install httpd

yum: name=httpd state=latest

- name: install configuration file for httpd

copy: src=/etc/ansible/httpd.conf dest=/etc/httpd/conf/httpd.conf

这里需要一个事先准备好的/opt/httpd.conf文件

notify: "restart httpd"

如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作

- name: start httpd service

service: enabled=true name=httpd state=started

handlers:

handlers中定义的就是任务,此处handlers中的任务使用的是service模块

- name: restart httpd

notify和handlers中任务的名称必须一致

service: name=httpd state=restarted

Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

2.2 准备http.conf

[root@ansible ansible] vim /etc/ansible/httpd.conf

 

42行,指定端口

Listen 8080

95行,指定域名

ServerName node1:8080

2.3 运行剧本

ansible-playbook test1.yml

2.4 查看web服务器

ansible web -m shell -a 'netstat -natp | grep httpd'

2.5 补充参数

-k(–ask-pass):用来交互输入ssh密码

-K(-ask-become-pass):用来交互输入sudo密码

-u:指定用户

ansible-playbook test1.yml --syntax-check

检查yml文件的语法是否正确

ansible-playbook test1.yml --list-task

检查tasks任务

ansible-playbook test1.yml --list-hosts

检查生效的主机

ansible-playbook test1.yml --start-at-task='install httpd'

指定从某个task开始运行

3. 剧本示例test2--定义、引用变量

3.1 剧本制作

---

- name: second test

hosts: db

remote_user: root

vars:

定义变量

- groupname: mysql

格式为 key: value

- username: nginx

tasks:

- name: create group

group: name={{groupname}} system=yes gid=306

使用 {{key}} 引用变量的值

- name: create user

user: name={{username}} uid=306 group={{groupname}}

- name: copy file

copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt

在setup模块中可以获取facts变量信息

 

3.3 查看db服务器

ansible db -a 'grep "mysql" /etc/group'

ansible db -a 'grep "nginx" /etc/passwd'

ansible db -a 'cat /opt/vars.txt'

3.4 修改剧本中的变量设定

删除dbservers中的mysql组和nginx用户以及/opt/var.txt

ansible db -a 'userdel -r nginx'

ansible db -a 'groupdel mysql'

ansible db -a 'rm -rf /opt/vars.txt'

确认用户、组以及文件已删除

ansible db -a 'grep "mysql" /etc/group'

ansible db -a 'grep "nginx" /etc/passwd'

ansible db -a 'cat /opt/vars.txt'

删除/注释"- username: nginx"变量

3.5 在命令行定义变量运行剧本

ansible-playbook test2.yml -e "username=nginx"

3.6 查看dbservers服务器

ansible db -a 'grep "mysql" /etc/group'

ansible db -a 'grep "nginx" /etc/passwd'

ansible db -a 'cat /opt/vars.txt'

4. 剧本示例test3--指定远程主机sudo切换用户

vim test3.yml

 

---

- hosts: db

remote_user: wang

become: yes

2.6版本以后的参数,之前是sudo,意思为切换用户运行

become_user: root

……

指定sudo用户为root

测试机需要有wang,修改/etc/sudoers文件

执行playbook时:ansible-playbook test3.yml -K <密码>

ansible-playbook test3.yml -K

a

验证

5. 剧本示例test4--when条件判断

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

when一个比较常见的应用场景是实现跳过某个主机不执行任务或者只有满足条件的主机执行任务

vim test4.yaml

 

---

- hosts: all

remote_user: root

tasks:

- name: shutdown host

command: /sbin/shutdown -r now

when: ansible_default_ipv4.address == "192.168.10.3"

when指令中的变量名不需要手动加上{{}}

或者使用

when: inventory_hostname == "<主机名>"

ansible-playbook test4.yml

执行后,仅有指定主机重启,执行ping模块查看

ansible all -m ping

重启完毕后,可以ping通

6. 剧本示例test5--迭代

Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于loop循环。

vim test5.yaml

 

---

- name: test5

hosts: all

gather_facts: false

tasks:

- name: create directories

file:

path: "{{item}}"

state: directory

with_items:

等同于 loop:

- /test/test1

- /test/test2

- name: add groups

group: name={{item.name}} state=present

with_items:

- name: test1

- name: test2

- name: add users

user: name={{item.name}} state=present groups={{item.groups}}

with_items:

- name: test1

groups: test

- name: test2

groups: root

或使用以下格式

with_items:

- {name:'test1', groups:'test'}

- {name:'test2', groups:'root'}

ansible-playbook test5.yml

查看验证

ansible node3 -a "ls -l /test/"

ansible node3 -m shell -a "id test1"

ansible node3 -m shell -a "id test2"

7. Template模块

Jinja是基于Python的模块引擎。Template类是Jinja的一个重要组件,可以看做是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。

 

7.1 准备template模板文件

先准备一个以.j2为后缀的template模板文件,设置引用的变量

模板文件使用test1曾用的httpd.conf配置文件

cd /etc/ansible

cp httpd.conf httpd.conf.j2

vim httpd.conf.j2

 

42行,修改

Listen {{http_port}}

95行,修改

ServerName {{server_name}}

119行,修改

DocumentRoot "{{root_dir}}"

124行,修改

<Directory "{{root_dir}}">

7.2 修改主机清单文件

修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量

7.3 编写playbook

vim test6.yml

---

- hosts: all

remote_user: root

vars:

- package: httpd

- service: httpd

tasks:

- name: install httpd package

yum: name={{package}} state=latest

- name: install configure file

template: src=/etc/ansible/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf

使用template模板

notify:

- restart httpd

- name: create root dir

file: path=/etc/httpd/htdocs state=directory

- name: start httpd server

service: name={{service}} enabled=true state=started

handlers:

- name: restart httpd

service: name={{service}} state=restarted

7.4 执行playbook

ansible-playbook test6.yml

7.5 制作测试网页

[root@ansible ~]# ansible node1 -m shell -a "echo 'this is test1 template test' > /etc/httpd/htdocs/index.html"

node1 | CHANGED | rc=0 >>

 

[root@ansible ~]# ansible node2 -m shell -a "echo 'this is test2 template test' > /etc/httpd/htdocs/index.html"

node2 | CHANGED | rc=0 >>

 

[root@ansible ~]# ansible node3 -m shell -a "echo 'this is test3 template test' > /etc/httpd/htdocs/index.html"

node3 | CHANGED | rc=0 >>

7.6 访问测试

curl,访问前要开放httpd服务的端口

8. tags模块

可以在一个playbook中为某个或某些任务定义"标签",在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。

playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

8.1 编写脚本

vim test7.yml

 

---

- hosts: web

remote_user: root

tasks:

- name: mkdir directory

file: path=/opt/test/ state=directory

tags:

- always

- name: touch file

file: path=/opt/test/testhost state=touch

tags:

- test1

- all

- name: copy hosts file

copy: src=/etc/hosts dest=/opt/test/hosts

tags:

- test2

- all

8.2 执行tags="test1"

ansible-playbook test7.yml --tags="test1"

ansible web -a "ls -l /opt/test/"

8.3 执行tags="test2"

删除文件夹

ansible web -m file -a "path=/opt/test/ state=absent"

ansible web -a "ls -l /opt/test/"

执行tags="test2"

ansible web -a "ls -l /opt/test/"

8.4 执行tags="all"

删除文件夹

ansible web -m file -a "path=/opt/test/ state=absent"

ansible web -a "ls -l /opt/test/"

执行tags="all"

ansible-playbook test7.yml --tags="all"

ansible web -a "ls -l /opt/test/"

posted @   wang-a  阅读(161)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示