Playbook核心元素

hosts

一个或多个组或主机的 patterns,以逗号为分隔符 。

- hosts: webservices
  remote_user: root
Tasks

任务集

 tasks:
    - name: install httpd
      yum: name=httpd

    - name: start httpd
      service: name=httpd state=started
Handlers 和 notity

由特定条件触发的操作,满足条件方才执行,否则不执行。 Handlers也是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作。

- hosts: webs
  remote_user: root

  tasks:
    - name: install httpd
      yum: name=httpd

    - name: change httpd.conf
      copy: src=/app/httpd.conf dest=/etc/httpd/conf/ backup=yes
      notify: restart httpd             > 在 notify 中定义内容一定要和handlers中定义的 - name 内容一样,这样才能达到触发的效果,否则会不生效。
    - name: start httpd
      service: name=httpd state=started

    - name: wall http status
      shell: /usr/bin/wall `ss -nltp|grep httpd`

  handlers:
    - name: restart httpd           > 只有接收到通知才会执行这里的任务
      service: name=httpd state=restarted
Tags

给指定的任务定义一个调用标识 由于ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过 tags跳过此些代码片断。

- hosts: webs
  remote_user: root

  tasks:
    - name: install httpd
      yum: name=httpd
      tags: install

ansible-playbook -t install web.yaml
Variables 变量
  • 通过命令行指定变量,优先级最高。
ansible-playbook – variable_name=value
  • facts setup模块就是用来获取远程主机的相关信息的。一般以ansible_ 开头的就是变量可以调用。

  • /etc/ansible/hosts inventory

   每台主机单独设置
   IP/HOSTNAME variable_name=value
    
   组内统一设置
   [groupname:vars]
     variable_name=value

   还可以使用参数, 用于定义ansible远程连接目标主机时使用的属性,而非传递给playbook的变量。
   ansible_ssh_host
   ansible_ssh_port
   ansible_ssh_user
   ansible_ssh_pass
   ansible_sudo_pass

  • 在playbook中定义
   vars:
    - var_name: value
    - var_name: value

  • register 在有些时候,我们希望把某一条任务执行的结果保存下来,可以在接下的任务中调用或者做些判断,可以通过register关键字来实现。

  • 角色调用

  • vars_files指定变量文件

优先级 命令行 -e > vars_files指定变量文件 > 主机清单普通变量 > 主机清单公共(组)变量
  • 语法检测
ansible-playbook  --syntax-check  /path/to/playbook.yaml
  • 测试运行

    • –list-hosts
    • -list-tasks
    • –list-tags
 ansible-playbook -C /path/to/playbook.yaml 
  • 执行运行

    • -t TAGS, –tags=TAGS
    • –skip-tags=SKIP_TAGS
    • –start-at-task=START_AT
ansible-playbook  /path/to/playbook.yaml
变量示例
cat hosts 
[webservers]
10.1.88.72 name=iam72
10.1.88.73 name=iam73

[webservers:vars]
place="host_vars.txt"

cat vars.yaml 
- hosts: all 
  vars:
     filename: "abcd.txt"
  vars_files:
    - vars/test_vars.yml
  tasks:
   - name: test playbook vars
     file: path="/tmp/{{ filename }}" state=touch
     tags: playbook_vars
   
   - name: test setup vars 
     copy: dest=/tmp/a.txt content="{{ ansible_all_ipv4_addresses }}" 
     tags: setup_vars 

   - name: test hosts vars
     copy: dest="/tmp/{{ place }}" content="{{ name }}"
     tags: hosts_vars

   - name: test var files
     file: path="/tmp/{{ var_file }}" state=touch
     tags: file_var 

   - name: test register var
     shell: /bin/cat /etc/centos-release
     ignore_errors: true
     register: release
     tags: register_var

   - name: show release 
     debug: var=release
ansible-playbook vars.yaml --list-tags

playbook: vars.yaml

  play #1 (all): all	TAGS: []
      TASK TAGS: [file_var, hosts_vars, playbook_vars, register_var, setup_vars]

ansible-playbook vars.yaml --list-tasks

playbook: vars.yaml

  play #1 (all): all	TAGS: []
    tasks:
      test playbook vars	TAGS: [playbook_vars]
      test setup vars	TAGS: [setup_vars]
      test hosts vars	TAGS: [hosts_vars]
      test var files	TAGS: [file_var]
      test register var	TAGS: [register_var]
      show release	TAGS: []
ansible-playbook vars.yaml --list-hosts

playbook: vars.yaml

  play #1 (all): all	TAGS: []
    pattern: [u'all']
    hosts (2):
      10.1.88.73
      10.1.88.72
ansible-playbook vars.yaml 

PLAY [all] ********************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************
ok: [10.1.88.72]
ok: [10.1.88.73]

TASK [test playbook vars] ****************************************************************************************************************
changed: [10.1.88.73]
changed: [10.1.88.72]

TASK [test setup vars] ******************************************************************************************************************
changed: [10.1.88.73]
changed: [10.1.88.72]

TASK [test hosts vars] *********************************************************************************************************************
changed: [10.1.88.73]
changed: [10.1.88.72]

TASK [test var files] **********************************************************************************************************************
changed: [10.1.88.72]
changed: [10.1.88.73]

TASK [test register var] ********************************************************************************************************************
changed: [10.1.88.73]
changed: [10.1.88.72]

TASK [show release] **************************************************************************************************************************
ok: [10.1.88.72] => {
    "release": {
        "changed": true, 
        "cmd": "/bin/cat /etc/centos-release", 
        "delta": "0:00:00.027839", 
        "end": "2018-10-26 13:15:35.752900", 
        "failed": false, 
        "rc": 0, 
        "start": "2018-10-26 13:15:35.725061", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "CentOS Linux release 7.5.1804 (Core) ", 
        "stdout_lines": [
            "CentOS Linux release 7.5.1804 (Core) "
        ]
    }
}
ok: [10.1.88.73] => {
    "release": {
        "changed": true, 
        "cmd": "/bin/cat /etc/centos-release", 
        "delta": "0:00:00.035317", 
        "end": "2018-10-26 13:15:35.746466", 
        "failed": false, 
        "rc": 0, 
        "start": "2018-10-26 13:15:35.711149", 
        "stderr": "", 
        "stderr_lines": [], 
        "stdout": "CentOS Linux release 7.5.1804 (Core) ", 
        "stdout_lines": [
            "CentOS Linux release 7.5.1804 (Core) "
        ]
    }
}

PLAY RECAP **********************************************************************************************************************************
10.1.88.72                 : ok=7    changed=5    unreachable=0    failed=0   
10.1.88.73                 : ok=7    changed=5    unreachable=0    failed=0

when 条件判断

举例判断当前主机是Centos 6 Or Centos 7

1.利用setup 模块获取系统信息

ansible all -m setup | less

"ansible_distribution": "CentOS", 
"ansible_distribution_major_version": "7", 

2.利用上面的信息作为判断条件

- hosts: all
  tasks:
  - name: centos 6 task
    shell: echo "i am centeos 6"
    when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "6"
  - name: centos 7 task
    shell: echo "i am centeos 7"
    when: ansible_distribution == "CentOS" and ansible_distribution_major_version == "7"

with_items 重复执行
- hosts: all
  tasks:
  - name: install base packages # 一次安装多个安装包
    yum: name={{ item }}  state=installed
    with_items:
      - vim
      - git
      - wget
      - psmisc 
      - net-tools
      - bash-completion 
  - name: create groups # 字典
    group: name={{ item }} state=present
    with_items:
      - group1
      - group2 
  - name: create users
    user: name={{ item.user }} group={{ item.group }} state=present
    with_items:
      - {user: 'user1' , group: 'group1'}
      - {user: 'user2' , group: 'group2'}

templates 模板,文本文件,内部嵌套有模板语言脚本(使用Jinja2模板语言编写)
  • 算数运算

.j2

server {
   worker_connectios {{ ansible_processor_vcpus *2 }};
}

.yaml

- hosts: nginx
  tasks:
    - name: generate nginx conf
      template: src=templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf
  • for 循环

.j2

server { 
{% for port in port_list %}
   listen port;
{% endfor %}
}

.yaml

- hosts: nginx 
  vars:
    - port_list:
      - 443
      - 80
      - 8080
  tasks:
  - name:
    template: src=templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf

.j2

{% for vhost in vhost_list %}
server { 
   listen vhost.port;
   servername vhost.host;
}
{% endfor %}

.yaml

- hosts: nginx
  vars: 
    vhost_list:
     - web:
       port: 8080
       host: web1
     - web:
       port: 9090
       host: web2
  • if 判断

.j2

{% for vhost in vhost_list %}
server { 
   listen vhost.port;
{% if vhost.host is defined%}
   servername vhost.host;
{% endif %}
}
{% endfor %}

.yaml

- hosts: nginx
  vars: 
    vhost_list:
     - web:
       port: 8080
       host: web1
     - web:
       port: 9090