ansible随记

先来看一下ansible架构图:

一、官网的语法简单介绍

#选择的主机组

- hosts: webservers
#这个是变量
  vars:
    http_port: 80
    max_clients: 200
  tasks:
#利用yum模块来操作
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
#触发重启服务器(只要上面的httpd.conf文件变化了,就触发handlers中的restart apache)
    notify:
    restart apache
  - name: ensure apache is running
    service: name=httpd state=started
#这里的restart apache 和上面的触发是配对的。这就是handlers的作用。相当于tag
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

二、常用模块介绍

1、

copy:复制本地文件到远程主机
template:复制本地文件到远程主机但是他可以在本地文件中调用变量,使用template模块可以传递变量,copy模块则不能

示例如下:

2、vars_files参数

变量设置和when示例:

参考文档:http://tshare365.com/archives/1033.html

 ------------------------------------------------------------------------------------------------

copy:复制本地文件到远程主机 template:复制本地文件到远程主机但是他可以在本地文件中调用变量

----------------------

raw这东西,咋用的呢,其实前面说的command,shell能干的活,raw都能干 raw最拿手的好活,就是,如果你有的机器是没有装python,或者说你的是python2.4以下,木有装python-simplejson的,用它可以装python,装python-simplejson raw还有一个拿手好戏,就是你的有些机器压根就装不了python,OK,不用装了,直接用raw吧,也可以玩ansible

ssh-keygen -t rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

ansible db35 -m copy  -a 'src=/root/.ssh/id_rsa.pub dest=/root'  --ask-pass -c paramiko

ansible db35 -m shell -a 'cat /root/id_rsa.pub >> /root/.ssh/authorized_keys && rm -f /root/id_rsa.pub'  --ask-pass -c paramiko 可同时执行多个命令

ansible db35:db36  -m file  -a 'dest=/root/id_rsa.pub state=absent'  用ansible删除一个文件

使用ansible内置的密钥管理模块进行设置(一条命令搞定)

ssh-keygen -t rsa ansible all -m authorized_key -a "user=root key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}' path=/root/.ssh/authorized_keys manage_dir=no" --ask-pass -c paramiko

ansible基于ssh连接inventory中指定的远程主机时还可以通过参数指定其交互方式常用的参数如下所示:(修改/etc/ansible/hosts )

ansible_ssh_host   # 要连接的主机名 

ansible_ssh_port   # 端口号默认是22 

ansible_ssh_user   # ssh连接时默认使用的用户名 

ansible_ssh_pass   # ssh连接时的密码 

ansible_sudo_pass  # 使用sudo连接用户是的密码 

ansible_ssh_private_key_file # 秘钥文件如果不想使用ssh-agent管理时可以使用此选项 

ansible_shell_type # shell的类型默认sh

Ansible 命令参数介绍

Usage: ansible <host-pattern> [options]

Options:

-m MODULE_NAME, --module-name=MODULE_NAME 要执行的模块,默认为command

-a MODULE_ARGS, --args=MODULE_ARGS 模块的参数

-u REMOTE_USER, --user=REMOTE_USER ssh 连接的用户名,默认用root,ansible.cfg 中可以配置

-k, --ask-pass 提示输入ssh 登录密码,当使用密码验证登录的时候用

-s, --sudo sudo 运行

-U SUDO_USER, --sudo-user=SUDO_USER sudo 到哪个用户,默认为root

-K, --ask-sudo-pass 提示输入sudo 密码,当不是NOPASSWD 模式时使用

-B SECONDS, --background=SECONDS run asynchronously, failing after X seconds(default=N/A)

-P POLL_INTERVAL, --poll=POLL_INTERVAL set the poll interval if using -B (default=15)

-C, --check 只是测试一下会改变什么内容,不会真正去执行

-c CONNECTION 连接类型(default=smart)

-f FORKS, --forks=FORKS fork 多少个进程并发处理,默认5

-i INVENTORY, --inventory-file=INVENTORY 指定hosts 文件路径,默认default=/etc/ansible/hosts

-l SUBSET, --limit=SUBSET 指定一个pattern,对<host_pattern>已经匹配的主机中再过滤一次 --list-hosts 只打印有哪些主机会执行这个playbook 文件,不是实际执行该playboo

-M MODULE_PATH, --module-path=MODULE_PATH 要执行的模块的路径,默认为/usr/share/ansible/

-o, --one-line 压缩输出,摘要输出 --private-key=PRIVATE_KEY_FILE 私钥路径

-T TIMEOUT, --timeout=TIMEOUT ssh 连接超时时间,默认10 秒

-t TREE, --tree=TREE 日志输出到该目录,日志文件名会以主机名命名

-v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging)

command模块:ansible 默认使用的module,这个模块可以运行远程权限范围所有的shell命令,但并不支持shell 变量和管道等。

script模块:功能是在远程主机执行主控端存储的shell脚本文件,相当于scp+shell组合

shell模块:功能是执行远程主机的shell脚本文件。

使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用;
但是我们自己定义在.bashrc/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;

1) 如果待执行的语句少,可以直接写在一句话中:

ansible myservers  -a ". .bash_profile;ps -fe |grep sa_q" -m shell

2) 如果在远程待执行的语句比较多,可写成一个脚本,通过copy模块传到远端,然后再执行;但这样就又涉及到两次ansible调用;对于这种需求,ansible已经为我们考虑到了,script模块就是干这事的

command 和shell 模块关注命令或者脚本执行后返回值,如果命令成功执行返回值不是0 的情况 下,可以使用以下方法 tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true 或者 tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignore_errors: True

file ## 设置文件的属性

相关选项如下:

force:需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no

group:定义文件/目录的属组 mode:定义文件/目录的权限

owner:定义文件/目录的属主

path:必选项,定义文件/目录的路径

recurse:递归设置文件的属性,只对目录有效

src:被链接的源文件路径,只应用于state=link的情况

dest:被链接到的路径,只应用于state=link的情况

state:

       directory:如果目录不存在,就创建目录

       file:即使文件不存在,也不会被创建

       link:创建软链接

       hard:创建硬链接

       touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

       absent:删除目录、文件或者取消链接文件

 ################################

自定义变量  在 yaml 中可以使用vars关键字来定义变量  vars:  var_name: value    

#############################

变量的引用  {{ var_name }} 

-------------------

在命令行使用变量。使用-e参数,就OK了,'uservar=lixc'就是楼主在web.yml里面定义的romote_user

ansible-playbook item.yml -e 'user=jia' --tags stopi

--------------------------

- name: test to see if selinux is running

  command: getenforce

  register: sestatus

  changed_when: false

运行getenforce来检测selinux是否在运行状态,"changed_when:false"作用为ansible-playbook时最后一行不记录命令运行结果的changed状态,即changed为False (不加1)

 ...ok=2    changed=0    unreachable=0    failed=0

来自:https://github.com/ansible/ansible-examples/blob/master/lamp_haproxy/roles/common/tasks/main.yml

原文地址:https://www.cnblogs.com/wjoyxt/p/4459944.html