1:核心元素
1:Hosts 执行的远程主机列表
2:Tasks 任务集
3:Variables 内置变量或自定义变量在playbook中调用
4:Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
5:Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
6:tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
2:Hosts组件
Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
# 前面将Ad-Hoc的时候也讲过如何匹配主机,这里其实也是类似的
1:10.0.0.10
2:10.0.0.10:10.0.0.11
3:ansible_agent_11
4:ansible_*
5:web:db
6:web:&db
7:web:!db
# 链接在这里:https://www.cnblogs.com/layzer/articles/ansible_simple.html
# 示例
- hosts: web:db
3:remote_user组件
remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用become_user指定sudo时切换的用户
---
- hosts: web
remote_user: zhangsan
become: true
tasks:
- name: Hello
command: 'echo "Hello"'
become: true
become_user: zhangsan
# 运行代码时
[root@ansible-manager ~]# ansible-playbook hello.yaml -k
SSH password: # 这里时sudo切换账户的密码
PLAY [web] **********************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************
ok: [10.0.0.12]
ok: [10.0.0.11]
TASK [Hello] *********************************************************************************************
changed: [10.0.0.11]
changed: [10.0.0.12]
PLAY RECAP ***********************************************************************************************
10.0.0.11 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
10.0.0.12 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 解释:-k 的意思时 --ask-pass 指定的是sudo时候的密码
4:task列表和action组件
play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于输出
task两种格式:
(1):action: module arguments
(2):module: arguments 建议使用
注意:shell和command模块后面跟命令,而非key=value
# 示例
---
- hosts: web
remote_user: root
tasks:
- name: install httpd
yum: name=httpd
- name: start httpd
service: name=httpd state=started enabled=yes
# 安装并启动httpd
# 运行代码
[root@ansible-manager ~]# ansible-playbook hello.yaml
PLAY [web] **************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [10.0.0.12]
ok: [10.0.0.11]
TASK [install httpd] **************************************************************************************************************
changed: [10.0.0.12]
changed: [10.0.0.11]
TASK [start httpd] **************************************************************************************************************
changed: [10.0.0.11]
changed: [10.0.0.12]
PLAY RECAP *************************************************************************************************************
10.0.0.11 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
10.0.0.12 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@ansible-manager ~]# ansible all -m shell -a "netstat -nplt | grep 80"
10.0.0.12 | CHANGED | rc=0 >>
tcp6 0 0 :::80 :::* LISTEN 39484/httpd
10.0.0.11 | CHANGED | rc=0 >>
tcp6 0 0 :::80 :::* LISTEN 3875/httpd
5:其它组件
某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers
任务可以通过"tags"打标签,可在ansible-playbook命令上使用-t指定进行调用
ShellScripts VS Playbook
# 使用shell安装apache并配置启动
#!/bin/bash
# 安装Apache
yum install --quiet -y httpd
# 复制配置文件
cp /opt/httpd.conf /etc/httpd/conf/httpd.conf
cp /opt/blog.conf /etc/httpd/conf.d/
# 启动Apache,并设置开机启动
systemctl enable --now httpd
# 使用Playbook实现安装apache并配置启动
---
- hosts: web
remote_user: root
tasks:
- name: "安装Apache"
yum: name=httpd
- name: "复制配置文件"
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
- name: "复制配置文件"
copy: src=/opt/blog.conf dest=/etc/httpd/conf.d/
- name: "启动Apache,并设置开机启动"
service: name=httpd state=started enabled=yes