Linux 命令 Ansible


原文链接: Linux 命令 Ansible

资料

Ansible快速入门:技术原理与实战
Ansible 中文权威指南
Ansible 简书专题文章
Ansible 入门
** ansible 模块 **

Install

sudo pip install ansible
Centos
sudo yum install ansible
Ubuntu
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible

Playbook Roles

https://github.com/kuailemy123/Ansible-roles
github.com/vinodhalaharvi/ansible-examples
github.com/mrlesmithjr

批量修改密码
ansible all -m user -a "name=root password=newpass"

pam_limits

ansible all -m shell -a "ulimit -HSn 65535"
ansible all -m pam_limits -a "domain=* limit_type=- limit_item=nofile value=65536"
ansible all -m pam_limits -a "domain=* limit_type=hard limit_item=nofile value=65536"

时间同步 chrony

ansible-galaxy install influxdata.chrony

mariadb 集群

  1. ansible-galaxy install mrlesmithjr.mariadb-galera-cluster mrlesmithjr.etc-hosts
  2. /etc/ansible/roles/mrlesmithjr.mariadb-galera-cluster

1、安装最新的 ansible

$ sudo easy_install pip
$ sudo pip install ansible

2. ansible 的配置

看一个完整的 anbile 配置文件例子,就能基本了解到 ansible 都能配置什么了:
https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg

对 ansible 配置文件里面的关键字不能完整理解,还可以参考关键词解释列表:
http://docs.ansible.com/ansible/intro_configuration.html#explanation-of-values-by-section

ansible.cfg 配置文件优先级

ansible 的默认配置文件是 / etc/ansible/ansible.cfg
其实 ansible 会按照下面的顺序查找配置文件,并使用第一个发现的配置文件。

* ANSIBLE_CONFIG (一个环境变量)
* ansible.cfg (位于 . 目录中)
* .ansible.cfg (位于 Home 目录中)
* /etc/ansible/ansible.cfg (default)

2. Host Inventory(主机清单)

some_host ansible_ssh_port=2222 ansible_ssh_user=manager

3. Playbook

-i 指定 host Inventory
-e 通过命令行设置变量
### Playbook 中定义的变量

用户可以在 Playbook 中,通过 vars 关键字自定义变量,使用时用 {{ }} 引用以来即可。
Playbook 中定义和使用的变量的方法

例如下面的例子中,用户定义变量名为 http_port,其值为为 80。在 tasks firewalld 中,通过 {{ http_port }} 引用。


  • hosts: web
    vars:
    http_port: 80
    remote_user: root
    tasks:
    • name: insert firewalld rule for httpd
      firewalld: port={{ http_port }}/tcp permanent=true state=enabled immediate=yes

把变量放在单独的文件中

当变量比较多的时候,或者变量需要在多个 playbook 中重用的时候,可以把变量放到一个单独的文件中。通过关键字 var_files 把文件中定义的变量引入 playbook 中,使用变量的方法和在本文件中定义的变量相同。

  • hosts: web
    remote_user: root
    vars_files:
    • vars/server_vars.yml
      tasks:
    • name: insert firewalld rule for httpd
      firewalld: port={{ http_port }}/tcp permanent=true state=enabled immediate=yes

变量文件 vars/server_vars.yml 的内容为:

http_port: 80

### Playbook 通过命令行使用变量 -e

ansible-playbook main.yml -e "hosts=web user=root"
ansible-playbook main.yml -e "{'hosts':'vm-rhel7-1','user':'root'}" # json 传递参数
ansible-playbook main.yml -e "@vars.json" #文件传参

Playbook 变量覆盖

http://docs.ansible.com/ansible/latest/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable

1.  role defaults[1]          
2.  inventory 文件或脚本组 vars [2]
    playbook group_vars / *
    inventory 文件或脚本主机 vars [2]
    inventory host_vars / *
    playbook host_vars / *
    host facts        
    role vars(在 `role/vars/main.yml` 中定义)
    include_vars
    set_facts / registered vars
    --extra-vars (命令行中 -e 指定优先级最高)

基本上,进入 “角色默认值”(角色中的默认文件夹)的任何东西都是最有价值的,容易被覆盖的。 该角色的 vars 目录中的任何内容都会覆盖该命名空间中该变量的先前版本。 这里要遵循的一个想法是,在范围上越明确,命令行 - e 额外的 vars 总是胜出越多的优先级。 主机和 / 或库存变量可以胜过角色默认值,但不显式包括 vars 目录或 include_vars 任务。 )

基本上,进入 “角色默认值”(角色中的默认文件夹)的任何东西都是最有价值的,容易被覆盖的。 该角色的 vars 目录中的任何内容都会覆盖该命名空间中该变量的先前版本。 这里要遵循的一个想法是,在范围上越明确,命令行 - e 额外的 vars 总是胜出越多的优先级。 主机和 / 或库存变量可以胜过角色默认值,但不显式包括 vars 目录或 include_vars 任务。

facts

使用setup模块来获取目标系统信息

ansible hostname -m setup

仅显示与ansible相关的内存信息

ansible all -m setup -a 'filter=ansible_*_mb'

ansible all -m setup -a 'filter=ansible_os_family'

ansible 普通用户执行root权限 su

  1. 在参数中增加加-s
    ansible  -i /etc/ansible/hosts localhost -s -m shell -a "netstat -tunpl"
  2. hosts配置文件添加 ansible_su_pass
    10.0.0.177 ansible_ssh_pass=xxxxx   ansible_su_pass=xxxx

ansible 在本地执行

  1. 任务委派就是在 playbook 中指定某任务,只在指定的主机上执行

比如

我要在192.168.1.1 服务器添加一个hosts 记录 "1.1.1.1 www.abc.com" ,同时也要把这个hosts 记录写到192.168.1.2

ansible hosts 192.168.1.1 文件内容
[all]
192.168.1.1

ansible task 文件内容(192.168.1.1.yml):

---
- name: add host record
  shell: "echo "1.1.1.1 www.abc.com" >> /etc/hosts"

- name: add host record
  shell: "echo "1.1.1.1 www.abc.com" >> /etc/hosts"
  delegate_to: 192.168.1.2
  1. 如果是委派给localhost 请使用local_action

如下结果一样

tasks:

  • name: Get config
    get_url: dest=configs/{{ ansible_hostname }} force=yes url=http://{{ ansible_hostname }}/diagnostic/config
    delegate_to: localhost
    当你委派给本机的时候,还可以使用更快捷的方法local_action,代码如下:
    ```yml
    ---
  • name: Fetch configuration from all webservers
    hosts: webservers

tasks:

  • name: Get config
    local_action: get_url url=http://{{ ansible_hostname}}/diagnostic/config dest=configs/{{ ansible_hostname}}.cfg
    ```
`