Playbook

来自linux中国网wiki
跳到导航 跳到搜索

简单例子

在线playbook分享平台:https://galaxy.ansible.com

ansible tree  ansible-nginx 
ansible-nginx
├── files
│   └── nginx.conf.j2
└── playbook.yml

1 directory, 2 files

➜  ansible-nginx cat files/nginx.conf.j2 
server {
  listen 80;

  root /tmp/;
  index index.html index.htm;

  server_name a.com;
  
  location / {
   default_type "text/html";
   try_files $uri.html $uri $uri/ =404;
  }
}

➜  ansible-nginx cat playbook.yml 
---
- hosts: d11
  name: playbook demo
  become: yes
  gather_facts: false
  remote_user: root
  become_user: root 
  tasks:
    - name: Update apt cache and install Nginx
      apt:
        name: nginx
        state: latest
        update_cache: yes

    - name: Apply Nginx template
      template:
        src: files/nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: Restart Nginx

    - name: Enable new site
      file:
        src: /etc/nginx/sites-available/default
        dest: /etc/nginx/sites-enabled/default
        state: link
      notify: Restart Nginx

    - name: Allow all access to tcp port 80
      ufw:
        rule: allow
        port: '80'
        proto: tcp

  handlers:
    - name: Restart Nginx
      service:
        name: nginx
        state: restarted


ansible-playbook -C  playbook.yml
ansible-playbook   playbook.yml



galaxy.ansible

找几个例子看看

https://galaxy.ansible.com/andrewrothstein/java-oracle-jdk


https://galaxy.ansible.com/sansible/golang

#快速创建role文件与目录
  ansible ansible-galaxy init  --init-path playbooks/roles web 
- Role web was created successfully
➜  ansible 

 ansible tree playbooks/roles/web 
playbooks/roles/web
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

8 directories, 8 files


基本语法

3.4.4 条件语句

#如果是debian类,关机
playbooks cat when.yml 
---
- name: shtudown 
  hosts: pi3
  tasks:
    - name: shutdown if debian 
      command: /sbin/shutdown -t now 
      when: ansible_os_family =="Debian"


#更加好的例子
---
- name: Install vim
  hosts: all
  tasks:
    - name:Install VIM via yum
      yum: 
        name: vim-enhanced 
        state: installed
      when: ansible_os_family =="RedHat"
      
    - name:Install VIM via apt
      apt: 
        name: vim 
        state: installed
      when: ansible_os_family =="Debian"
      
    - name: Unexpected OS family
      debug: msg="OS Family {{ ansible_os_family }} is not supported" fail=yes
      when: not ansible_os_family =="RedHat" or ansible_os_family =="Debian"


Ansible14:Playbook条件语句

3.4.5循环控制

一般书上都是用with_item 
cat loop-user2.yml 
---
- name: create user
  hosts: pi3
  tasks:
    - name: create user
      user:
        name: "{{ item }}"
        state: present
      with_items:
      - user04
      - user05
      - user06

    - name: set password
      shell: echo 'e12345678' | passwd --stdin "{{ item }}"
      with_items:
      - user04
      - user05
      - user06



➜  ansible cat loop-user.yml 
---
- name: create user
  hosts: pi3
  tasks:
    - name: create user
      user:
        name: "{{ item }}"
        state: present
      loop:
      - user01
      - user02
      - user03

    - name: set password
      shell: echo 'e12345678' | passwd --stdin "{{ item }}"
      loop:
      - user01
      - user02
      - user03


ansible-playbook -C  loop-user.yml
ansible-playbook   loop-user.yml


执行后查看结果 

root@mypi3b:~# cat /etc/passwd | grep user
root@mypi3b:~# 
root@mypi3b:~# cat /etc/passwd | grep user
user01:x:1003:1004::/home/user01:/bin/sh
user02:x:1004:1005::/home/user02:/bin/sh
user03:x:1005:1006::/home/user03:/bin/sh
root@mypi3b:~# su  - user01
$ hostname
mypi3b
$ id 
uid=1003(user01) gid=1004(user01) groups=1004(user01)

3.4.6 include语法

playbook中代码复用非常爽,eg task   
---
- tasks:
   - include: a.yml user=root
   - include: b.yml user=root
   - include: c.yml user=root


或者是下面的多个项目用一个脚本的例子 


➜  playbooks cat  restart_ng.yml 
- name: Restart ng Server 
  service: 
    name: nginx 
    state: restarted


➜  playbooks cat a.yml 
- hosts: pi3 
  tasks: 
    - name: A Project command 
      command: echo "A" 
      
    - name: Restart ng 
      include: restart_ng.yml
➜  playbooks cat b.yml 
- hosts: mytmp 
  tasks: 
    - name: A Project command 
      command: echo "A" 
      
    - name: Restart ng 
      include: restart_ng.yml

ansible-playbook a.yml
ansible-playbook b.yml


成功执行后 查看结果 

nsible pi3 -m shell  -a "systemctl status nginx"
192.168.10.5 | CHANGED | rc=0 >>
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2023-08-24 12:59:57 CST; 3min ago







Inlcude结合tags应用

”include”不仅能够引用任务列表,还能够引用playbook,比如,在一个playbook中引用另一个playbook。

示例:通过指定标签 tags ,来说明是安装 tomcat8 还是 tomcat9

1.准备入口 main.yml 文件,然后包含 install_tomcat8.yml 以及install_tomcat9.yml

2.在执行 main.yml 时,需要通过 --tags 指明要安装的版本

3.还可以在主playbook文件中向引用的playbook传递变量。

    编写main.yml入口文件:
# cat tomcat_main.yml
- name: Install Tomcat8
  import_playbook: install_tomcat8.yml
  tags: tomcat8
  vars:
    tomcat_version: 8.5.69
    tomcat_install_path: /usr/local

- name: Install Tomcat9
  import_playbook: install_tomcat9.yml
  tags: tomcat9
  vars:
    tomcat_version: 9.0.50
    tomcat_install_path: /usr/local

编写install_tomcat8.yml文件
cat install_tomcat8.yml 
---
- hosts: localhost
  
  tasks:
    - name: Install JDK
      yum:
        name: java-1.8.0-openjdk
        state: present
  
    - name: Download Tomacat
      get_url:
        url: https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v{{ tomcat_version }}/bin/apache-tomcat-{{ tomcat_version }}.tar.gz
        dest: /root
  
    - name: Unarchive Tomcat
      unarchive:
        src: /root/apache-tomcat-{{ tomcat_version }}.tar.gz
        dest: "{{ tomcat_install_path }}"
  
    - name: Create Link File
      file:
        src: "{{ tomcat_install_path }}/apache-tomcat-{{ tomcat_version }}"
        dest: "{{ tomcat_install_path }}/tomcat8"
        state: link
  
    - name: Start Tomcat
      shell: cd "{{ tomcat_install_path }}"/tomcat8/bin && nohup ./startup.sh &

编写install_tomcat9.yml文件:
 cat install_tomcat9.yml 
---
- hosts: localhost

  tasks:
    - name: Install JDK
      yum:
        name: java-1.8.0-openjdk
        state: present

    - name: Download Tomacat
      get_url:
        url: https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v{{ tomcat_version }}/bin/apache-tomcat-{{ tomcat_version }}.tar.gz
        dest: /root

    - name: Unarchive Tomcat
      unarchive:
        src: /root/apache-tomcat-{{ tomcat_version }}.tar.gz
        dest: "{{ tomcat_install_path }}"

    - name: Create Link File
      file:
        src: "{{ tomcat_install_path }}/apache-tomcat-{{ tomcat_version }}"
        dest: "{{ tomcat_install_path }}/tomcat9"
        state: link

    - name: Start Tomcat
      shell: cd "{{ tomcat_install_path }}"/tomcat9/bin && nohup ./startup.sh &

#安装tomcat9
[root@xuzhichao playbook]# ansible-playbook -t tomcat9 tomcat_main.yml

#安装tomcat8
[root@xuzhichao playbook]# ansible-playbook -t tomcat8 tomcat_main.yml

https://blog.51cto.com/u_15127516/3557509

[Ansible系列]ansible-playbook之include和import

ansible10:include说明

pre-tasks and post-tasks

---
- hosts: www
  remote_user: vagrant
  sudo: yes
  pre_tasks:
     - name: update the apt cache
       apt: update_cache=yes
     - shell: echo 'I":" Beginning to configure web server..'
  roles:
     - nginx
  post_tasks:
     - shell: echo 'I":" Done configuring nginx web server...'

https://www.oreilly.com/library/view/ansible-playbook-essentials/9781784398293/ch02s09.html

常用 role 及playgook 例子

playbook 安装golang

pre config

#pre config
 cat    /etc/ansible/ansible.cfg
[defaults]
inventory = /home/evan/ansible/inventory/hosts
roles_path = /home/evan/ansible/playbooks/roles

cat ~/ansible/inventory/hosts
[mytmp]
192.168.10.7  ansible_user=root

目录

├── go.yml
├── roles
│   └── go_install
│       ├── files
│       │   └── go1.17.1.linux-amd64.tar.gz
│       ├── tasks
│       │   ├── copy.yml
│       │   ├── install.yml
│       │   └── main.yml
│       └── templates
│           └── go_install.sh

文件详情

 cat go.yml 
---
- name: Installing Go from source 
  hosts: mytmp
  remote_user: root
  roles:
    - go_install

**********
 cat copy.yml 
- name: copy go_tgz to client
  copy: src=/home/evan/ansible/playbooks/roles/go_install/files/go1.17.1.linux-amd64.tar.gz dest=/usr/local/src/
- name: copy install_go_script to client
  copy: src=/home/evan/ansible/playbooks/roles/go_install/templates/go_install.sh dest=/tmp/go_install.sh owner=root group=root mode=755

cat install.yml 
- name: install go 
  shell: /bin/bash /tmp/go_install.sh

cat  main.yml 
- include_tasks: copy.yml
- include_tasks: install.yml

 cat templates/go_install.sh 
#!/bin/bash
# install golang
# yum tools

yum -y groupinstall "Development tools"
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
cd /usr/local/src
tar -C /usr/local -xzf go1.17.1.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin'  >> /etc/profile 
source  /etc/profile
# end

[详情代码可见我的github,有小改动]

refer

https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_roles.html#dynamic-versus-static-includes

Ansible之Playbook详解、案例

通过ansible安装中间件(jdk,nginx,mysql,etcd集群)

(playbook ins zbx还不错) ansible自动化运维详细教程及playbook详解


How to Install Nginx using Ansible Playbook


Ansible Loop循环控制

官网参考文档:

loops: https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html

filters: https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html