欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ansible总结

程序员文章站 2022-04-07 17:55:21
灰度发布与检测1.语法检测在编写完playbook或者role之后一定要养成进行语法检测的习惯,直接使用ansible-playbook命令的 --syntax-check参数即可。注册变量 register将某个 task 执行的结果「注册」为一个变量。后面的 action 就可以使用它---- hosts: centos tasks: - name: ls /tmp shell: ls -l /tmp register: result...
灰度发布与检测

1.语法检测
在编写完playbook或者role之后一定要养成进行语法检测的习惯,直接使用ansible-playbook命令的 --syntax-check参数即可。
2.测试运行

ansible-playbook -C /path/to/playbook.yaml
    --list-hosts
    --list-tasks
    --list-tags
ansible-playbook –check /path/to/playbook.yaml
远程节点的系统变量(facts)

ansible 通过 module setup 收集主机的系统信息,这些收集到的系统信息叫做 facts,这些facts可以直接以变量的形式使用。

哪些 facts 变量可以引用的?通过如下命令行调用setup module 可以查看:

ansible all -m setup -u root

可以看到它输出的变量信息有很多!

复杂的facts变量的使用可以用如下两种形式:

{{ ansible_ens3["ipv4"]["address"] }}
{{ ansible_ens3.ipv4.address }}

好用的一些 facts 变量#
ansible_hostname 指定的 host 名称
ansible_default_ipv4.address 主机真实的 ipv4 地址,小网IP

ansible_os_family 查看系统类型的变量
---
- hosts: all
  user: root
  tasks:
  - name: echo system
    shell: echo {{ ansible_os_family }}
  - name install ntp on Debian linux
    apt: name=git state=installed
    when: ansible_os_family == "Debian"
  - name install ntp on redhat linux
    yum: name=git state=present
    when: ansible_os_family == "RedHat"
关闭 facts

在 playbook 中,如果不收集系统信息,那么上面的变量就不能再 playbook 中使用了,但是有时候关闭会加快执行的效率:

- hosts: all
  gather_facts: no
命令行传递变量 --extra-vars
---
- hosts: "{{hosts}}"
  remote_user: "{{user}}"

  tasks:
    - debug: msg="{{hosts}}"

命令输入变量

ansible-playbook extra_learn.yml --extra-vars "{'hosts':'x86','user':'michael'}"
# or
ansible-playbook extra_learn.yml --extra-vars "hosts=x86 user=michael"
注册变量 register

将某个 task 执行的结果「注册」为一个变量。后面的 action 就可以使用它

---
- hosts: centos
  tasks:
      - name: ls /tmp
        shell: ls -l /tmp
        register: result
        ignore_errors: True

  - name: echo result when rc==5
    shell: echo "{{result}}"
    when: result.rc == 5

  - name: debug show stdout
    debug:
      msg: "{{result.stdout}}"
playbook 中的逻辑控制语句

when:条件判断,类似编程语言中的 if
loop:循环,类似编程语言中的 while
block:将几个 task 组成一块代码,便于针对一组操作进行异常处理等

条件语句 when

例如,在某个特定版本的系统上装包,或者只在磁盘空间满了的文件系统上执行清理操作。这些操作在Playbook中用when语句实现。

主机为Debian Linux立刻关机

tasks:
  - name: "shutdown Debian flavored systems"
    command: /sbin/shutdown -t now
    when: ansible_os_family == "Debian"

根据action的执行结果,来决定接下来执行的action。

tasks:
  - command: /bin/false
    register: result
    ignore_errors: True
  - command: /bin/something
    when: result|failed
  - command: /bin/something_else
    when: result|success
  - command: /bin/still/something_else
    when: result|skipped

远程中的系统变量facts变量作为when的条件,用“|int”还可以转换返回值的类型:

---
- hosts: web
  tasks:
    - debug: msg="only on Red Hat 7, derivatives, and later"
      when: ansible_os_family == "RedHat" and ansible_lsb.major_release|int >= 6
循环语句 loop#
---
- hosts: merge
  gather_facts: False
  tasks:
  - name: debug loops
    shell: cat /root/test.txt
    register: host
    until: host.stdout.startswith("test")
    retries: 5
    delay: 5

5秒执行一次 cat /root/test.txt将结果register给host,然后判断host.stdout.startwith的内容是不是test字符串开头,如果条件成立,此task运行完成,如果条件不成立,5秒以后重试,5此后还不满足条件,此task运行失败。

其他的循环还有:散列loops、文件匹配loops、随机选择loops、文件优先匹配loops、register loops

标准循环 with_items#

使用 with_items 用于迭代的条目类型不仅仅支持简单的字符串列表.如果你有一个哈希列表,那么你可以用以下方式来引用子项:

- name: add several users
  user: name="{{ item.name }}" state=present groups="{{ item.groups }}"
  with_items:
    - { name: 'michael', groups: 'wheel' }
    - { name: 'qq', groups: 'root' }
对哈希表使用循环 with_dict
---
- hosts: centos
  vars:
    users:
      michael:
        name: michael xiang
        phone: 123
      qq:
        name: qq huang
        phone: 456

    rpms:
        - httpd
        - lrzsz
        - vim
        - git

  tasks:
    - name: print phone records
      debug: msg="User {{item.key }} is {{ item.value.name }} {{item.value.phone}}"
      with_dict: "{{ users }}"

    - name: install rpms
      yum: name="{{item}}" state=installed
      with_items: "{{rpms}}"
对文件列表使用循环 with_filegloab

with_fileglob 可以以非递归的方式来模式匹配单个目录中的文件.如下面所示:
tasks:

# first ensure our target directory exists
- file: dest=/etc/fooapp state=directory

# copy each file over that matches the given pattern
- copy: src=\{\{ item \}\} dest=/etc/fooapp/ owner=root mode=600
  with_fileglob:
    - /playbooks/files/fooapp/*
块语句

多个action组装成块,可以根据不同条件执行一段语句 :

tasks:
     - block:
         - yum: name=\{\{ item \}\} state=installed
           with_items:
             - httpd
             - memcached

     - template: src=templates/src.j2 dest=/etc/foo.conf

     - service: name=bar state=started enabled=True

   when: ansible_distribution == 'CentOS'
   become: true
   become_user: root

本文地址:https://blog.csdn.net/xiaozhiit/article/details/107323588