<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=Playbook</id>
	<title>Playbook - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=Playbook"/>
	<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=Playbook&amp;action=history"/>
	<updated>2026-04-19T08:47:52Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.linuxsa.org/index.php?title=Playbook&amp;diff=830&amp;oldid=prev</id>
		<title>Evan：​/* 常用 role 及playbook 例子 */</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=Playbook&amp;diff=830&amp;oldid=prev"/>
		<updated>2025-03-27T08:38:31Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;常用 role 及playbook 例子&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;通过ansible命令执行操作的方式 call  ad-hoc&lt;br /&gt;
&lt;br /&gt;
=简单例子=&lt;br /&gt;
&lt;br /&gt;
在线playbook分享平台：https://galaxy.ansible.com&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ansible tree  ansible-nginx &lt;br /&gt;
ansible-nginx&lt;br /&gt;
├── files&lt;br /&gt;
│   └── nginx.conf.j2&lt;br /&gt;
└── playbook.yml&lt;br /&gt;
&lt;br /&gt;
1 directory, 2 files&lt;br /&gt;
&lt;br /&gt;
➜  ansible-nginx cat files/nginx.conf.j2 &lt;br /&gt;
server {&lt;br /&gt;
  listen 80;&lt;br /&gt;
&lt;br /&gt;
  root /tmp/;&lt;br /&gt;
  index index.html index.htm;&lt;br /&gt;
&lt;br /&gt;
  server_name a.com;&lt;br /&gt;
  &lt;br /&gt;
  location / {&lt;br /&gt;
   default_type &amp;quot;text/html&amp;quot;;&lt;br /&gt;
   try_files $uri.html $uri $uri/ =404;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
➜  ansible-nginx cat playbook.yml &lt;br /&gt;
---&lt;br /&gt;
- hosts: d11&lt;br /&gt;
  name: playbook demo&lt;br /&gt;
  become: yes&lt;br /&gt;
  gather_facts: false&lt;br /&gt;
  remote_user: root&lt;br /&gt;
  become_user: root &lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: Update apt cache and install Nginx&lt;br /&gt;
      apt:&lt;br /&gt;
        name: nginx&lt;br /&gt;
        state: latest&lt;br /&gt;
        update_cache: yes&lt;br /&gt;
&lt;br /&gt;
    - name: Apply Nginx template&lt;br /&gt;
      template:&lt;br /&gt;
        src: files/nginx.conf.j2&lt;br /&gt;
        dest: /etc/nginx/sites-available/default&lt;br /&gt;
      notify: Restart Nginx&lt;br /&gt;
&lt;br /&gt;
    - name: Enable new site&lt;br /&gt;
      file:&lt;br /&gt;
        src: /etc/nginx/sites-available/default&lt;br /&gt;
        dest: /etc/nginx/sites-enabled/default&lt;br /&gt;
        state: link&lt;br /&gt;
      notify: Restart Nginx&lt;br /&gt;
&lt;br /&gt;
    - name: Allow all access to tcp port 80&lt;br /&gt;
      ufw:&lt;br /&gt;
        rule: allow&lt;br /&gt;
        port: &amp;#039;80&amp;#039;&lt;br /&gt;
        proto: tcp&lt;br /&gt;
&lt;br /&gt;
  handlers:&lt;br /&gt;
    - name: Restart Nginx&lt;br /&gt;
      service:&lt;br /&gt;
        name: nginx&lt;br /&gt;
        state: restarted&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ansible-playbook -C  playbook.yml&lt;br /&gt;
ansible-playbook   playbook.yml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=galaxy.ansible=&lt;br /&gt;
&lt;br /&gt;
找几个例子看看 &lt;br /&gt;
&lt;br /&gt;
https://galaxy.ansible.com/andrewrothstein/java-oracle-jdk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://galaxy.ansible.com/sansible/golang&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#快速创建role文件与目录&lt;br /&gt;
  ansible ansible-galaxy init  --init-path playbooks/roles web &lt;br /&gt;
- Role web was created successfully&lt;br /&gt;
➜  ansible &lt;br /&gt;
&lt;br /&gt;
 ansible tree playbooks/roles/web &lt;br /&gt;
playbooks/roles/web&lt;br /&gt;
├── defaults&lt;br /&gt;
│   └── main.yml&lt;br /&gt;
├── files&lt;br /&gt;
├── handlers&lt;br /&gt;
│   └── main.yml&lt;br /&gt;
├── meta&lt;br /&gt;
│   └── main.yml&lt;br /&gt;
├── README.md&lt;br /&gt;
├── tasks&lt;br /&gt;
│   └── main.yml&lt;br /&gt;
├── templates&lt;br /&gt;
├── tests&lt;br /&gt;
│   ├── inventory&lt;br /&gt;
│   └── test.yml&lt;br /&gt;
└── vars&lt;br /&gt;
    └── main.yml&lt;br /&gt;
&lt;br /&gt;
8 directories, 8 files&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=基本语法=&lt;br /&gt;
== 变量==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
- name: Install Apache on Ubuntu using variables&lt;br /&gt;
  hosts: web   # 替换成你的目标主机组名或主机名&lt;br /&gt;
  become: true  # 以特权用户执行任务&lt;br /&gt;
  vars:&lt;br /&gt;
    apache_package: apache2&lt;br /&gt;
    apache_service: apache2&lt;br /&gt;
&lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: Install Apache&lt;br /&gt;
      ansible.builtin.package:&lt;br /&gt;
        name: &amp;quot;{{ apache_package }}&amp;quot;&lt;br /&gt;
        state: present&lt;br /&gt;
&lt;br /&gt;
    - name: Start and enable Apache service&lt;br /&gt;
      ansible.builtin.service:&lt;br /&gt;
        name: &amp;quot;{{ apache_service }}&amp;quot;&lt;br /&gt;
        state: started&lt;br /&gt;
        enabled: true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
- name: Remove the apache package&lt;br /&gt;
  hosts: evan&lt;br /&gt;
  become: true  # 以特权用户执行任务&lt;br /&gt;
  vars:&lt;br /&gt;
    apache_package: apache2&lt;br /&gt;
    apache_service: apache2&lt;br /&gt;
&lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: Remove the apache package&lt;br /&gt;
      ansible.builtin.package:&lt;br /&gt;
        name: &amp;quot;{{ apache_package }}&amp;quot;&lt;br /&gt;
        state: absent&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3.4.4 条件语句 when==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#如果是debian类，关机&lt;br /&gt;
playbooks cat when.yml &lt;br /&gt;
---&lt;br /&gt;
- name: shtudown &lt;br /&gt;
  hosts: pi3&lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: shutdown if debian &lt;br /&gt;
      command: /sbin/shutdown -t now &lt;br /&gt;
      when: ansible_os_family ==&amp;quot;Debian&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#更加好的例子&lt;br /&gt;
---&lt;br /&gt;
- name: Install vim&lt;br /&gt;
  hosts: all&lt;br /&gt;
  tasks:&lt;br /&gt;
    - name:Install VIM via yum&lt;br /&gt;
      yum: &lt;br /&gt;
        name: vim-enhanced &lt;br /&gt;
        state: installed&lt;br /&gt;
      when: ansible_os_family ==&amp;quot;RedHat&amp;quot;&lt;br /&gt;
      &lt;br /&gt;
    - name:Install VIM via apt&lt;br /&gt;
      apt: &lt;br /&gt;
        name: vim &lt;br /&gt;
        state: installed&lt;br /&gt;
      when: ansible_os_family ==&amp;quot;Debian&amp;quot;&lt;br /&gt;
      &lt;br /&gt;
    - name: Unexpected OS family&lt;br /&gt;
      debug: msg=&amp;quot;OS Family {{ ansible_os_family }} is not supported&amp;quot; fail=yes&lt;br /&gt;
      when: not ansible_os_family ==&amp;quot;RedHat&amp;quot; or ansible_os_family ==&amp;quot;Debian&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*************&lt;br /&gt;
利用when 判断文件在不在 &lt;br /&gt;
- name: Execute task only if a file exists&lt;br /&gt;
  hosts: evan&lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: Check if file exists&lt;br /&gt;
      stat:&lt;br /&gt;
        path: /tmp/myfile.txt&lt;br /&gt;
      register: file_check&lt;br /&gt;
&lt;br /&gt;
    - name: Do something if file exists&lt;br /&gt;
      debug:&lt;br /&gt;
        msg: &amp;quot;File /tmp/myfile.txt exists!&amp;quot;&lt;br /&gt;
      when: file_check.stat.exists&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PLAY [Execute task only if a file exists] ****************************************************&lt;br /&gt;
&lt;br /&gt;
TASK [Gathering Facts] ***********************************************************************&lt;br /&gt;
ok: [192.168.10.74]&lt;br /&gt;
ok: [192.168.10.93]&lt;br /&gt;
&lt;br /&gt;
TASK [Check if file exists] ******************************************************************&lt;br /&gt;
ok: [192.168.10.74]&lt;br /&gt;
ok: [192.168.10.93]&lt;br /&gt;
&lt;br /&gt;
TASK [Do something if file exists] ***********************************************************&lt;br /&gt;
skipping: [192.168.10.74]&lt;br /&gt;
skipping: [192.168.10.93]&lt;br /&gt;
&lt;br /&gt;
PLAY RECAP ***********************************************************************************&lt;br /&gt;
192.168.10.74              : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   &lt;br /&gt;
192.168.10.93              : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ansible evan -m shell -a &amp;quot;touch /tmp/myfile.txt&amp;quot;&lt;br /&gt;
touch 文件之后 &lt;br /&gt;
&lt;br /&gt;
TASK [Do something if file exists] *****************************************************************************************************&lt;br /&gt;
ok: [192.168.10.74] =&amp;gt; {&lt;br /&gt;
    &amp;quot;msg&amp;quot;: &amp;quot;File /tmp/myfile.txt exists!&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
ok: [192.168.10.93] =&amp;gt; {&lt;br /&gt;
    &amp;quot;msg&amp;quot;: &amp;quot;File /tmp/myfile.txt exists!&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.cnblogs.com/breezey/p/10996632.html Ansible14：Playbook条件语句]&lt;br /&gt;
&lt;br /&gt;
== 3.4.5循环控制==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Loops (循环)&lt;br /&gt;
&lt;br /&gt;
使用 loop 或 with_items 可以在 Playbook 中进行循环操作。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一般书上都是用with_item &lt;br /&gt;
cat loop-user2.yml &lt;br /&gt;
---&lt;br /&gt;
- name: create user&lt;br /&gt;
  hosts: pi3&lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: create user&lt;br /&gt;
      user:&lt;br /&gt;
        name: &amp;quot;{{ item }}&amp;quot;&lt;br /&gt;
        state: present&lt;br /&gt;
      with_items:&lt;br /&gt;
      - user04&lt;br /&gt;
      - user05&lt;br /&gt;
      - user06&lt;br /&gt;
&lt;br /&gt;
    - name: set password&lt;br /&gt;
      shell: echo &amp;#039;e12345678&amp;#039; | passwd --stdin &amp;quot;{{ item }}&amp;quot;&lt;br /&gt;
      with_items:&lt;br /&gt;
      - user04&lt;br /&gt;
      - user05&lt;br /&gt;
      - user06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
➜  ansible cat loop-user.yml &lt;br /&gt;
---&lt;br /&gt;
- name: create user&lt;br /&gt;
  hosts: pi3&lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: create user&lt;br /&gt;
      user:&lt;br /&gt;
        name: &amp;quot;{{ item }}&amp;quot;&lt;br /&gt;
        state: present&lt;br /&gt;
      loop:&lt;br /&gt;
      - user01&lt;br /&gt;
      - user02&lt;br /&gt;
      - user03&lt;br /&gt;
&lt;br /&gt;
    - name: set password&lt;br /&gt;
      shell: echo &amp;#039;e12345678&amp;#039; | passwd --stdin &amp;quot;{{ item }}&amp;quot;&lt;br /&gt;
      loop:&lt;br /&gt;
      - user01&lt;br /&gt;
      - user02&lt;br /&gt;
      - user03&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ansible-playbook -C  loop-user.yml&lt;br /&gt;
ansible-playbook   loop-user.yml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
执行后查看结果 &lt;br /&gt;
&lt;br /&gt;
root@mypi3b:~# cat /etc/passwd | grep user&lt;br /&gt;
root@mypi3b:~# &lt;br /&gt;
root@mypi3b:~# cat /etc/passwd | grep user&lt;br /&gt;
user01:x:1003:1004::/home/user01:/bin/sh&lt;br /&gt;
user02:x:1004:1005::/home/user02:/bin/sh&lt;br /&gt;
user03:x:1005:1006::/home/user03:/bin/sh&lt;br /&gt;
root@mypi3b:~# su  - user01&lt;br /&gt;
$ hostname&lt;br /&gt;
mypi3b&lt;br /&gt;
$ id &lt;br /&gt;
uid=1003(user01) gid=1004(user01) groups=1004(user01)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
利用loop 安装多个软件  例如 os init etc &lt;br /&gt;
- name: Install multiple packages&lt;br /&gt;
  hosts: evan&lt;br /&gt;
  become: yes&lt;br /&gt;
  vars:&lt;br /&gt;
    packages:&lt;br /&gt;
      - vim&lt;br /&gt;
      - wget&lt;br /&gt;
      &lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: Install packages using loop&lt;br /&gt;
      package:&lt;br /&gt;
        name: &amp;quot;{{ item }}&amp;quot;&lt;br /&gt;
        state: present&lt;br /&gt;
      loop: &amp;quot;{{ packages }}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3.4.6 include语法 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
playbook中代码复用非常爽，eg task   &lt;br /&gt;
---&lt;br /&gt;
- tasks:&lt;br /&gt;
   - include: a.yml user=root&lt;br /&gt;
   - include: b.yml user=root&lt;br /&gt;
   - include: c.yml user=root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
或者是下面的多个项目用一个脚本的例子 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
➜  playbooks cat  restart_ng.yml &lt;br /&gt;
- name: Restart ng Server &lt;br /&gt;
  service: &lt;br /&gt;
    name: nginx &lt;br /&gt;
    state: restarted&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
➜  playbooks cat a.yml &lt;br /&gt;
- hosts: pi3 &lt;br /&gt;
  tasks: &lt;br /&gt;
    - name: A Project command &lt;br /&gt;
      command: echo &amp;quot;A&amp;quot; &lt;br /&gt;
      &lt;br /&gt;
    - name: Restart ng &lt;br /&gt;
      include: restart_ng.yml&lt;br /&gt;
➜  playbooks cat b.yml &lt;br /&gt;
- hosts: mytmp &lt;br /&gt;
  tasks: &lt;br /&gt;
    - name: A Project command &lt;br /&gt;
      command: echo &amp;quot;A&amp;quot; &lt;br /&gt;
      &lt;br /&gt;
    - name: Restart ng &lt;br /&gt;
      include: restart_ng.yml&lt;br /&gt;
&lt;br /&gt;
ansible-playbook a.yml&lt;br /&gt;
ansible-playbook b.yml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
成功执行后 查看结果 &lt;br /&gt;
&lt;br /&gt;
nsible pi3 -m shell  -a &amp;quot;systemctl status nginx&amp;quot;&lt;br /&gt;
192.168.10.5 | CHANGED | rc=0 &amp;gt;&amp;gt;&lt;br /&gt;
● nginx.service - A high performance web server and a reverse proxy server&lt;br /&gt;
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)&lt;br /&gt;
   Active: active (running) since Thu 2023-08-24 12:59:57 CST; 3min ago&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Inlcude结合tags应用===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
”include”不仅能够引用任务列表，还能够引用playbook，比如，在一个playbook中引用另一个playbook。&lt;br /&gt;
&lt;br /&gt;
示例：通过指定标签 tags ，来说明是安装 tomcat8 还是 tomcat9&lt;br /&gt;
&lt;br /&gt;
1.准备入口 main.yml 文件，然后包含 install_tomcat8.yml 以及install_tomcat9.yml&lt;br /&gt;
&lt;br /&gt;
2.在执行 main.yml 时，需要通过 --tags 指明要安装的版本&lt;br /&gt;
&lt;br /&gt;
3.还可以在主playbook文件中向引用的playbook传递变量。&lt;br /&gt;
&lt;br /&gt;
    编写main.yml入口文件：&lt;br /&gt;
# cat tomcat_main.yml&lt;br /&gt;
- name: Install Tomcat8&lt;br /&gt;
  import_playbook: install_tomcat8.yml&lt;br /&gt;
  tags: tomcat8&lt;br /&gt;
  vars:&lt;br /&gt;
    tomcat_version: 8.5.69&lt;br /&gt;
    tomcat_install_path: /usr/local&lt;br /&gt;
&lt;br /&gt;
- name: Install Tomcat9&lt;br /&gt;
  import_playbook: install_tomcat9.yml&lt;br /&gt;
  tags: tomcat9&lt;br /&gt;
  vars:&lt;br /&gt;
    tomcat_version: 9.0.50&lt;br /&gt;
    tomcat_install_path: /usr/local&lt;br /&gt;
&lt;br /&gt;
编写install_tomcat8.yml文件&lt;br /&gt;
cat install_tomcat8.yml &lt;br /&gt;
---&lt;br /&gt;
- hosts: localhost&lt;br /&gt;
  &lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: Install JDK&lt;br /&gt;
      yum:&lt;br /&gt;
        name: java-1.8.0-openjdk&lt;br /&gt;
        state: present&lt;br /&gt;
  &lt;br /&gt;
    - name: Download Tomacat&lt;br /&gt;
      get_url:&lt;br /&gt;
        url: https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v{{ tomcat_version }}/bin/apache-tomcat-{{ tomcat_version }}.tar.gz&lt;br /&gt;
        dest: /root&lt;br /&gt;
  &lt;br /&gt;
    - name: Unarchive Tomcat&lt;br /&gt;
      unarchive:&lt;br /&gt;
        src: /root/apache-tomcat-{{ tomcat_version }}.tar.gz&lt;br /&gt;
        dest: &amp;quot;{{ tomcat_install_path }}&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
    - name: Create Link File&lt;br /&gt;
      file:&lt;br /&gt;
        src: &amp;quot;{{ tomcat_install_path }}/apache-tomcat-{{ tomcat_version }}&amp;quot;&lt;br /&gt;
        dest: &amp;quot;{{ tomcat_install_path }}/tomcat8&amp;quot;&lt;br /&gt;
        state: link&lt;br /&gt;
  &lt;br /&gt;
    - name: Start Tomcat&lt;br /&gt;
      shell: cd &amp;quot;{{ tomcat_install_path }}&amp;quot;/tomcat8/bin &amp;amp;&amp;amp; nohup ./startup.sh &amp;amp;&lt;br /&gt;
&lt;br /&gt;
编写install_tomcat9.yml文件：&lt;br /&gt;
 cat install_tomcat9.yml &lt;br /&gt;
---&lt;br /&gt;
- hosts: localhost&lt;br /&gt;
&lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: Install JDK&lt;br /&gt;
      yum:&lt;br /&gt;
        name: java-1.8.0-openjdk&lt;br /&gt;
        state: present&lt;br /&gt;
&lt;br /&gt;
    - name: Download Tomacat&lt;br /&gt;
      get_url:&lt;br /&gt;
        url: https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v{{ tomcat_version }}/bin/apache-tomcat-{{ tomcat_version }}.tar.gz&lt;br /&gt;
        dest: /root&lt;br /&gt;
&lt;br /&gt;
    - name: Unarchive Tomcat&lt;br /&gt;
      unarchive:&lt;br /&gt;
        src: /root/apache-tomcat-{{ tomcat_version }}.tar.gz&lt;br /&gt;
        dest: &amp;quot;{{ tomcat_install_path }}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    - name: Create Link File&lt;br /&gt;
      file:&lt;br /&gt;
        src: &amp;quot;{{ tomcat_install_path }}/apache-tomcat-{{ tomcat_version }}&amp;quot;&lt;br /&gt;
        dest: &amp;quot;{{ tomcat_install_path }}/tomcat9&amp;quot;&lt;br /&gt;
        state: link&lt;br /&gt;
&lt;br /&gt;
    - name: Start Tomcat&lt;br /&gt;
      shell: cd &amp;quot;{{ tomcat_install_path }}&amp;quot;/tomcat9/bin &amp;amp;&amp;amp; nohup ./startup.sh &amp;amp;&lt;br /&gt;
&lt;br /&gt;
#安装tomcat9&lt;br /&gt;
[root@xuzhichao playbook]# ansible-playbook -t tomcat9 tomcat_main.yml&lt;br /&gt;
&lt;br /&gt;
#安装tomcat8&lt;br /&gt;
[root@xuzhichao playbook]# ansible-playbook -t tomcat8 tomcat_main.yml&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
https://blog.51cto.com/u_15127516/3557509&lt;br /&gt;
&lt;br /&gt;
[https://blog.csdn.net/qq_43714097/article/details/128952860 [Ansible系列&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt;ansible-playbook之include和import]&lt;br /&gt;
&lt;br /&gt;
[https://www.cnblogs.com/ccbloom/p/15508703.html ansible10：include说明]&lt;br /&gt;
&lt;br /&gt;
==pre-tasks and post-tasks ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
- hosts: www&lt;br /&gt;
  remote_user: vagrant&lt;br /&gt;
  sudo: yes&lt;br /&gt;
  pre_tasks:&lt;br /&gt;
     - name: update the apt cache&lt;br /&gt;
       apt: update_cache=yes&lt;br /&gt;
     - shell: echo &amp;#039;I&amp;quot;:&amp;quot; Beginning to configure web server..&amp;#039;&lt;br /&gt;
  roles:&lt;br /&gt;
     - nginx&lt;br /&gt;
  post_tasks:&lt;br /&gt;
     - shell: echo &amp;#039;I&amp;quot;:&amp;quot; Done configuring nginx web server...&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
https://www.oreilly.com/library/view/ansible-playbook-essentials/9781784398293/ch02s09.html&lt;br /&gt;
== Handlers (处理程序)==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Handlers 是一种特殊的任务，只有在其他任务发生更改时才会被触发。常用于在配置文件更改后重启服务。&lt;br /&gt;
例如ng config&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
- name: Example with handlers&lt;br /&gt;
  hosts: all&lt;br /&gt;
  become: yes&lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: Copy configuration file&lt;br /&gt;
      copy:&lt;br /&gt;
        src: /path/to/config.conf&lt;br /&gt;
        dest: /etc/config.conf&lt;br /&gt;
        owner: root&lt;br /&gt;
        group: root&lt;br /&gt;
        mode: &amp;#039;0644&amp;#039;&lt;br /&gt;
      notify:&lt;br /&gt;
        - Restart MyService&lt;br /&gt;
&lt;br /&gt;
  handlers:&lt;br /&gt;
    - name: Restart MyService&lt;br /&gt;
      service:&lt;br /&gt;
        name: myservice&lt;br /&gt;
        state: restarted&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=常用 role 及playbook 例子=&lt;br /&gt;
&amp;lt;pre&amp;gt;Ansible Roles Roles 是组织 Playbooks 和相关文件的一种方式，可以提高代码的可重用性和可维护性。&lt;br /&gt;
&lt;br /&gt;
Roles 的结构&lt;br /&gt;
&lt;br /&gt;
一个典型的 Role 包含以下目录结构：&lt;br /&gt;
&lt;br /&gt;
roles/&lt;br /&gt;
└── &amp;lt;role_name&amp;gt;/&lt;br /&gt;
    ├── tasks/&lt;br /&gt;
    │   └── main.yml           # 主要任务&lt;br /&gt;
    ├── handlers/&lt;br /&gt;
    │   └── main.yml           # 处理程序&lt;br /&gt;
    ├── vars/&lt;br /&gt;
    │   └── main.yml           # 变量定义&lt;br /&gt;
    ├── defaults/&lt;br /&gt;
    │   └── main.yml           # 默认变量定义&lt;br /&gt;
    ├── meta/&lt;br /&gt;
    │   └── main.yml           # Role 的元数据&lt;br /&gt;
    ├── files/                 # 静态文件&lt;br /&gt;
    ├── templates/             # Jinja2 模板文件&lt;br /&gt;
    └── tasks/                 # 包含更小的任务文件&lt;br /&gt;
&lt;br /&gt;
创建和使用 Roles&lt;br /&gt;
&lt;br /&gt;
    创建 Role 目录结构：&lt;br /&gt;
    Bash&lt;br /&gt;
&lt;br /&gt;
ansible-galaxy init &amp;lt;role_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这将创建一个基本的 Role 目录结构。&lt;br /&gt;
&lt;br /&gt;
在 Playbook 中使用 Role：&lt;br /&gt;
YAML&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
- name: Deploy My Application&lt;br /&gt;
  hosts: webservers&lt;br /&gt;
  become: yes&lt;br /&gt;
  roles:&lt;br /&gt;
    - common # 调用名为 common 的 Role&lt;br /&gt;
    - { role: apache, version: 2.4 } # 调用 apache Role 并传递变量&lt;br /&gt;
    - myapp&lt;br /&gt;
&lt;br /&gt;
在 Role 的 tasks/main.yml 中定义任务：&lt;br /&gt;
YAML&lt;br /&gt;
&lt;br /&gt;
- name: Install required packages&lt;br /&gt;
  package:&lt;br /&gt;
    name: &amp;quot;{{ item }}&amp;quot;&lt;br /&gt;
    state: present&lt;br /&gt;
  loop: &amp;quot;{{ common_packages }}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
- name: Configure application&lt;br /&gt;
  template:&lt;br /&gt;
    src: &amp;quot;{{ app_config_template }}&amp;quot;&lt;br /&gt;
    dest: &amp;quot;{{ app_config_path }}&amp;quot;&lt;br /&gt;
    owner: appuser&lt;br /&gt;
    group: appgroup&lt;br /&gt;
    mode: &amp;#039;0644&amp;#039;&lt;br /&gt;
  notify:&lt;br /&gt;
    - Restart Application Service&lt;br /&gt;
&lt;br /&gt;
在 Role 的 vars/main.yml 中定义变量：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==playbook role 安装golang ==&lt;br /&gt;
https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.html&lt;br /&gt;
&lt;br /&gt;
https://www.redhat.com/en/topics/automation/what-is-an-ansible-role&lt;br /&gt;
===Why use an Ansible Role instead of an Ansible Playbook?===&lt;br /&gt;
&lt;br /&gt;
Ansible Roles and Ansible Playbooks are both tools for organizing and executing automation tasks, but each serves a different purpose. Whether you choose to create Ansible Roles or write all of your tasks in an Ansible Playbook depends on your specific use case and your experience with Ansible.&lt;br /&gt;
&lt;br /&gt;
Most automation developers and system administrators begin creating automation content with individual playbooks. A playbook is a list of automation tasks that execute for a defined inventory. Tasks can be organized into a play—a grouping of 1 or more tasks mapped to a specific host and executed in order. A playbook can contain 1 or more plays, offering a flexible mechanism for executing Ansible automation in a single file.&lt;br /&gt;
&lt;br /&gt;
While playbooks are a powerful method for automating with Ansible, writing all of your tasks in a playbook isn’t always the best approach. In instances where scope and variables are complex and reusability is helpful, creating most of your automation content in Ansible Roles and calling them within a playbook may be the more appropriate choice.&lt;br /&gt;
&lt;br /&gt;
The following example illustrates the use of a role, linux-systemr-roles.timesync, within a playbook. In this instance, over 4 tasks would be required to achieve what the single role accomplishes. &lt;br /&gt;
===pre config===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#pre config&lt;br /&gt;
 cat    /etc/ansible/ansible.cfg&lt;br /&gt;
[defaults]&lt;br /&gt;
inventory = /home/evan/ansible/inventory/hosts&lt;br /&gt;
roles_path = /home/evan/ansible/playbooks/roles&lt;br /&gt;
&lt;br /&gt;
cat ~/ansible/inventory/hosts&lt;br /&gt;
[mytmp]&lt;br /&gt;
192.168.10.7  ansible_user=root&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 目录==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
├── go.yml&lt;br /&gt;
├── roles&lt;br /&gt;
│   └── go_install&lt;br /&gt;
│       ├── files&lt;br /&gt;
│       │   └── go1.17.1.linux-amd64.tar.gz&lt;br /&gt;
│       ├── tasks&lt;br /&gt;
│       │   ├── copy.yml&lt;br /&gt;
│       │   ├── install.yml&lt;br /&gt;
│       │   └── main.yml&lt;br /&gt;
│       └── templates&lt;br /&gt;
│           └── go_install.sh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==文件详情==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 cat go.yml &lt;br /&gt;
---&lt;br /&gt;
- name: Installing Go from source &lt;br /&gt;
  hosts: mytmp&lt;br /&gt;
  remote_user: root&lt;br /&gt;
  roles:&lt;br /&gt;
    - go_install&lt;br /&gt;
&lt;br /&gt;
**********&lt;br /&gt;
 cat copy.yml &lt;br /&gt;
- name: copy go_tgz to client&lt;br /&gt;
  copy: src=/home/evan/ansible/playbooks/roles/go_install/files/go1.17.1.linux-amd64.tar.gz dest=/usr/local/src/&lt;br /&gt;
- name: copy install_go_script to client&lt;br /&gt;
  copy: src=/home/evan/ansible/playbooks/roles/go_install/templates/go_install.sh dest=/tmp/go_install.sh owner=root group=root mode=755&lt;br /&gt;
&lt;br /&gt;
cat install.yml &lt;br /&gt;
- name: install go &lt;br /&gt;
  shell: /bin/bash /tmp/go_install.sh&lt;br /&gt;
&lt;br /&gt;
cat  main.yml &lt;br /&gt;
- include_tasks: copy.yml&lt;br /&gt;
- include_tasks: install.yml&lt;br /&gt;
&lt;br /&gt;
 cat templates/go_install.sh &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# install golang&lt;br /&gt;
# yum tools&lt;br /&gt;
&lt;br /&gt;
yum -y groupinstall &amp;quot;Development tools&amp;quot;&lt;br /&gt;
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel&lt;br /&gt;
cd /usr/local/src&lt;br /&gt;
tar -C /usr/local -xzf go1.17.1.linux-amd64.tar.gz&lt;br /&gt;
echo &amp;#039;export PATH=$PATH:/usr/local/go/bin&amp;#039;  &amp;gt;&amp;gt; /etc/profile &lt;br /&gt;
source  /etc/profile&lt;br /&gt;
# end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== install zabbix-agent2==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ansible-playbook -C   zabbix-agent2.yml&lt;br /&gt;
ansible-playbook    zabbix-agent2.yml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cat /etc/ansible/zabbix-agent2.yml &lt;br /&gt;
---&lt;br /&gt;
- hosts: mytmp&lt;br /&gt;
  become: yes&lt;br /&gt;
  become_method: sudo&lt;br /&gt;
  remote_user: evan  &lt;br /&gt;
  #remote_user: ops &lt;br /&gt;
  roles:&lt;br /&gt;
    - ag2_conf&lt;br /&gt;
&lt;br /&gt;
 cat /etc/ansible/roles/ag2_conf/tasks/copy.yml &lt;br /&gt;
- name: copy install__script to client&lt;br /&gt;
  copy: src=/etc/ansible/roles/ag2_conf/templates/age2_install.sh dest=/tmp/age2_install.sh owner=root group=root mode=755&lt;br /&gt;
&lt;br /&gt;
cat /etc/ansible/roles/ag2_conf/tasks/install.yml &lt;br /&gt;
- name: install conig  zbx agent2 &lt;br /&gt;
  shell: /bin/bash /tmp/age2_install.sh&lt;br /&gt;
&lt;br /&gt;
cat /etc/ansible/roles/ag2_conf/tasks/main.yml &lt;br /&gt;
- include_tasks: copy.yml&lt;br /&gt;
- include_tasks: install.yml&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cat /etc/ansible/roles/ag2_conf/templates/age2_install.sh &lt;br /&gt;
#!/bin/bash&lt;br /&gt;
sudo  yum remove zabbix-agent -y &lt;br /&gt;
sudo /usr/bin/rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm&lt;br /&gt;
sudo sleep 5&lt;br /&gt;
sudo /usr/bin/yum install zabbix-agent2 -y &lt;br /&gt;
sudo sleep 5&lt;br /&gt;
#bak cong&lt;br /&gt;
sudo sed  -i &amp;#039;s/127.0.0.1/172.16.0.42/g&amp;#039;  /etc/zabbix/zabbix_agent2.conf  #/etc/zabbix/zabbix_agent2.conf&lt;br /&gt;
sudo cp /etc/zabbix/zabbix_agent2.conf /etc/zabbix/zabbix_agent2.confbakevan&lt;br /&gt;
sudo sed  -i &amp;quot;s/Hostname=Zabbix server/Hostname=${HOSTNAME}/g&amp;quot;  /etc/zabbix/zabbix_agent2.conf&lt;br /&gt;
#grep &amp;quot;^\s*[^# \t].*$&amp;quot; /etc/zabbix/zabbix_agent2.conf&lt;br /&gt;
&lt;br /&gt;
sudo systemctl  enable  zabbix-agent2.service&lt;br /&gt;
sudo systemctl restart zabbix-agent2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[https://github.com/evan886/my-ansible/tree/main/ansible4goins 详情代码可见我的github,有小改动]]&lt;br /&gt;
== install and remove nginx on ubuntu ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- name: apt nginx&lt;br /&gt;
  hosts: evan&lt;br /&gt;
  become: yes&lt;br /&gt;
  tasks:&lt;br /&gt;
&lt;br /&gt;
    - name: update&lt;br /&gt;
      apt: update_cache=yes&lt;br /&gt;
&lt;br /&gt;
    - name: Install Nginx&lt;br /&gt;
      apt: name=nginx state=latest&lt;br /&gt;
&lt;br /&gt;
      notify:&lt;br /&gt;
        - restart nginx&lt;br /&gt;
&lt;br /&gt;
  handlers:&lt;br /&gt;
    - name: restart nginx&lt;br /&gt;
      service: name=nginx state=reloaded&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
- name: Remove Nginx from Ubuntu&lt;br /&gt;
  hosts: evan&lt;br /&gt;
  become: true&lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: Stop Nginx service&lt;br /&gt;
      service:&lt;br /&gt;
        name: nginx&lt;br /&gt;
        state: stopped&lt;br /&gt;
    - name: Remove Nginx package&lt;br /&gt;
      apt:&lt;br /&gt;
        name: nginx&lt;br /&gt;
        state: absent&lt;br /&gt;
        purge: true&lt;br /&gt;
    - name: Remove Nginx configuration directories&lt;br /&gt;
      file:&lt;br /&gt;
        path: &amp;quot;{{ item }}&amp;quot;&lt;br /&gt;
        state: absent&lt;br /&gt;
      loop:&lt;br /&gt;
        - /etc/nginx&lt;br /&gt;
        - /var/log/nginx    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=reboot playbook=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
- name: Reboot servers&lt;br /&gt;
  hosts: evan&lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: Reboot the servers&lt;br /&gt;
      ansible.builtin.reboot:&lt;br /&gt;
        msg: &amp;quot;Rebooting the server for system updates&amp;quot;&lt;br /&gt;
        connect_timeout: 5&lt;br /&gt;
        reboot_timeout: 300&lt;br /&gt;
        pre_reboot_delay: 0&lt;br /&gt;
        post_reboot_delay: 30&lt;br /&gt;
        test_command: uptime&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
https://docs.ansible.org.cn/ansible/latest/collections/ansible/builtin/reboot_module.html&lt;br /&gt;
&lt;br /&gt;
=refer=&lt;br /&gt;
https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_roles.html#dynamic-versus-static-includes&lt;br /&gt;
&lt;br /&gt;
[https://blog.51cto.com/u_13630803/2154192 Ansible之Playbook详解、案例]&lt;br /&gt;
&lt;br /&gt;
[https://www.jianshu.com/p/c41427cf5264 通过ansible安装中间件（jdk,nginx,mysql,etcd集群）]&lt;br /&gt;
&lt;br /&gt;
[https://juejin.cn/post/6844903631066513421 (playbook ins zbx还不错) ansible自动化运维详细教程及playbook详解 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://blog.devgenius.io/how-to-install-nginx-using-ansible-playbook-48e2aa74f944?gi=19b433cc3a8d How to Install Nginx using Ansible Playbook]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.cnblogs.com/vincenshen/p/12587749.html  Ansible Loop循环控制]&lt;br /&gt;
&lt;br /&gt;
官网参考文档： &lt;br /&gt;
&lt;br /&gt;
loops: https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html&lt;br /&gt;
&lt;br /&gt;
filters: https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html&lt;br /&gt;
&lt;br /&gt;
[[category:devops]][[category:ansible]]&lt;/div&gt;</summary>
		<author><name>Evan</name></author>
	</entry>
</feed>